第2章 短時間振幅包絡線と無音トリミングの数理¶
本章では、音響信号の先頭および末尾に存在する無音区間(あるいは聴覚上無視できるレベルのバックグラウンドノイズ)を検出し、情報の損失なしにトリミングするアルゴリズムの数理を解説する。 単純な振幅の絶対値判定が引き起こすゼロクロス点での誤検知という数学的破綻を指摘し、短時間局所エネルギーの包絡線計算を「累積和」によって \(O(N)\) で高速化する手法、およびポップノイズを回避するための境界条件について証明を展開する。
Note
本章における主要な略称・用語
- RMS: 二乗平均平方根 (Root Mean Square)
- ゼロクロス点: 信号の振幅の符号が反転する位置
2.1 振幅包絡線と無音区間の数理的定式化¶
無音トリミングを数学的に定義するため、信号の「局所的な大きさ(エネルギー)」を測る尺度を導入する。
定義 2.1 (短時間局所エネルギーとRMS包絡線)¶
離散時間信号ベクトル \(\mathbf{x} \in \mathbb{R}^N\) において、時刻 \(t \in [0, N-1]\) を中心とする窓幅 \(W\)(\(W\) は正の奇数)の矩形窓関数を適用した短時間局所エネルギー \(E(t)\) を以下のように定義する。
ただし、範囲外のインデックスに対しては \(x_k = 0\) とする。 この \(E(t)\) から導かれる短時間RMS包絡線関数 \(V(t)\) は次式で与えられる。
定義 2.2 (無音区間の境界閾値)¶
ある絶対的な無音閾値 \(\epsilon_{\text{noise}} > 0\)(例えば \(-60\text{ dB}\) に相当する振幅値 \(0.001\))が与えられたとき、信号の有効な開始位置 \(t_{\text{start}}\) と終了位置 \(t_{\text{end}}\) は次を満たす最小および最大のインデックスとして定義される。
2.2 課題:ゼロクロス点での誤判定と計算量爆発 (Why)¶
2.2.1 素朴な絶対値判定の破綻¶
なぜ窓幅 \(W\) を伴うエネルギー関数 \(E(t)\) を計算する必要があるのか。 もし、素朴に「振幅の絶対値が閾値以下であるか」すなわち \(|x_t| \le \epsilon_{\text{noise}}\) を条件として開始位置を探索したとする。この場合、正弦波のような周期信号が \(0\) と交差する瞬間(ゼロクロス点)において、音声が明確に鳴っているにもかかわらず \(|x_t| \approx 0\) となり、「無音である」と誤検知してしまう致命的な欠陥が生じる。 これを防ぐためには、信号の局所的なエネルギーを時間幅 \(W\)(低周波成分の1周期分以上)で畳み込み(平滑化)する式(2.1)のアプローチが不可避である。
2.2.2 畳み込みによる時間計算量 \(O(N \cdot W)\) の壁¶
しかし、式(2.1)を定義通りにすべての \(t\) について計算すると、各時刻ごとに \(W\) 回の積和演算が発生し、全体の時間計算量は \(O(N \cdot W)\) となる。窓幅 \(W\) が大きくなる(例えば \(10\text{ ms}\) 相当で数百サンプル)ほどパフォーマンスは劇的に悪化し、数万ファイルのバッチ処理においては許容できない遅延を引き起こす。
2.3 定理の提示と累積和による計算量削減の証明 (Proof)¶
局所エネルギーの計算を \(O(N \cdot W)\) から \(O(N)\) へと削減するため、累積和を用いた定理を導入する。
定義 2.3 (エネルギーの累積和系列)¶
信号の二乗系列 \(x_i^2\) の累積和系列 \(C_k\) を以下のように定義する。
Important
定理 2.1 (累積和による区間エネルギーの定数時間計算) 任意の時刻 \(t\) における窓幅 \(W\) の局所エネルギー \(E(t)\) は、累積和系列 \(C_k\) を用いて空間計算量 \(O(N)\) を消費することで、各時刻につき定数時間 \(O(1)\) で計算できる。
Note
証明
式(2.4)の定義より、\(C_b - C_a \ (b > a)\) は次のように展開できる。
式(2.1)の \(E(t)\) における和の範囲は \(i = t - \lfloor W/2 \rfloor\) から \(i = t + \lfloor W/2 \rfloor\) までである。 ここで \(a = t - \lfloor W/2 \rfloor\)、 \(b = t + \lfloor W/2 \rfloor + 1\) と置くと、
となり、累積和配列の2点の値の差分のみで任意の窓幅 \(W\) の総和が求まることが示された。境界条件を満たすように \(\min, \max\) を適用すれば式(2.5)を得る。 \(\blacksquare\)
2.4 計算量削減の定量的評価と疑似コード¶
計算量の変化¶
- 累積和配列 \(C\) の事前構築:配列を1回走査するため \(O(N)\)
- 各 \(t\) における \(V(t)\) の評価:減算1回と平方根1回のため \(O(1)\)
- 全体の走査:\(O(N)\)
結果として、全体の時間計算量は \(O(N \cdot W)\) から \(O(N)\) へと完全に窓幅 \(W\) に依存しない形に圧縮された。
実装への射影:疑似コード¶
AudioFeatureExtractor.cs におけるトリミング境界の探索ロジックは、この定理を利用して高速化されている。
// 【疑似コード】累積和を用いた O(N) 時間での無音境界探索
int N = signal.Length;
double[] C = new double[N + 1];
// 1. O(N): 二乗エネルギーの累積和を事前計算
C[0] = 0;
for (int i = 0; i < N; i++) {
C[i + 1] = C[i] + (signal[i] * signal[i]);
}
int W = Math.Max(1, (int)(sampleRate * 0.01)); // 窓幅
int halfW = W / 2;
double thresholdSq = epsilon_noise * epsilon_noise * W; // 平方根計算を避けるための二乗閾値
int tStart = 0;
// 2. O(N): 先頭からの境界探索 (減算のみで評価)
for (int t = 0; t < N; t++) {
int startIdx = Math.Max(0, t - halfW);
int endIdx = Math.Min(N, t + halfW + 1);
// 定数時間 O(1) でのエネルギー計算
double localEnergy = C[endIdx] - C[startIdx];
if (localEnergy > thresholdSq) {
tStart = t;
break;
}
}
※最適化の観点から、比較時に平方根 \(\sqrt{\cdot}\) の評価を避けるため、閾値側を二乗して比較する定数倍最適化が施されている。
2.5 誤差限界と境界条件(ポップノイズの回避)¶
ゼロクロス点での切断の数学的必要性¶
閾値 \(\epsilon_{\text{noise}}\) を上回った \(t_{\text{start}}\) で単純に波形を切り出すと、信号の振幅が非ゼロの状態から突然再生が開始されることになる。 数学的には、これは原信号にヘヴィサイドの階段関数 \(H(t - t_{\text{start}})\) を掛け合わせることに等しい。
信号処理の理論において、時間領域での不連続性(ステップ変化)は、周波数領域において全帯域域にわたる広範なスペクトル成分(高周波ノイズ)を励起する。これは聴覚上「プツッ」というポップノイズとして知覚され、ゲームのプレイアビリティを著しく損なう。
境界条件の補正¶
これを防ぐため、探索された \(t_{\text{start}}\) をそのまま採用するのではなく、「\(t_{\text{start}}\) 以前で最も近いゼロクロス点」までトリミング位置を後退させる境界条件の補正が行われる。
この補正により、トリミング後の波形は必ず振幅 \(0\) から滑らかに開始されることが数学的に保証され、不連続性に起因する高周波アーティファクトの発生が原理的に排除される。
2.6 参考文献 (References)¶
- Rabiner, L. R., & Schafer, R. W. (1978). Digital Processing of Speech Signals. Prentice-Hall.