マルチチャネル音声波形データに対し,高速フーリエ変換 (Fast Fourier Transformation: FFT) を行う.
無し.
どんなときに使うのか
このノードは,マルチチャネル音声波形データを, スペクトルに変換して時間周波数領域で解析を行いたいときに用いる. 音声認識に用いる特徴抽出の前処理として用いられることが多い.
典型的な接続例
図6.120 で,MultiFFT ノードに Matrix<float> ,Map<int, ObjectRef> 型の入力を与える例を示す.
図6.120 の上のパスは AudioStreamFromWave ノードから Matrix<float> 型の多チャネル音響信号を受け取り,MultiFFT ノードで Matrix<complex<float> > 型の複素スペクトルに変換したのち,LocalizeMUSIC ノードに入力される.
パラメータ名 |
型 |
デフォルト値 |
単位 |
説明 |
LENGTH |
512 |
[pt] |
フーリエ変換を適用する信号の長さ |
|
WINDOW |
CONJ |
フーリエ変換を行う際の窓関数の種類.CONJ,HAMMING,RECTANGLE,HANNINGから選択する.それぞれ,複素窓,ハミング窓,矩形窓,ハニング窓を示す. |
||
WINDOW_LENGTH |
512 |
[pt] |
フーリエ変換を行う際の窓関数の長さ. |
入力
: 型は Matrix<float> または Map<int, ObjectRef> .マルチチャネル音声波形データ. Map<int, ObjectRef> の 部 分はVector<float> 型. 行列のサイズが $M \times L$ のとき,$M$ がチャネル数, $L$ が波形のサンプル数を表す. $L$ は,パラメータ LENGTH と値が等しい必要がある.
出力
: 型は Matrix<complex<float> > または Map<int, ObjectRef> .入力に対応したマルチチャネル複素スペクトル. 入力が Matrix<float> 型のとき,出力は Matrix<complex<float> > 型となり, 入力が Map<int, ObjectRef> 型のとき,出力は Map<int, ObjectRef> 型となる.部 分は Vector<complex<float> > 型となる. 入力行列のサイズが $M \times L$ のとき,出力行列のサイズは,$M \times L/2 + 1$ となる.
パラメータ
: 型は int .デフォルト値は512.フーリエ変換を適用する信号の長さを指定する. アルゴリズムの性質上,2のべき乗の値をとる. また,WINDOW_LENGTHより大きい値にする必要がある.
: 型は string .デフォルト値はCONJ.CONJ,HAMMING,RECTANGLE,HANNING から選択する.それぞれ,複素窓,ハミング窓,矩形窓,ハニング窓を意味する.音声信号の解析には,HAMMING窓がよく用いられる.
: 型は int .デフォルト値は512.窓関数の長さを指定する.値を大きくすると,周波数解像度は増す半面,時間解像度は減る. 直感的には,この値を増やすと,音の高さの違いに敏感になるが,音の高さの変化に鈍感になる.
LENGTH,WINDOW_LENGTH の目安: 音声信号の解析には,$20 \sim 40$ [ms] に相当する長さのフレームで分析するのが適当である. サンプリング周波数を $f_{s}$ [Hz],窓の時間長を $x$ [ms] とすると,フレーム長 $L$ [pt] は,
$\displaystyle L $ | $\displaystyle = $ | $\displaystyle \frac{f_{s}x}{1000} $ |
で求められる.
例えば,サンプリング周波数が 16 [kHz] のとき,デフォルト値の 512 [pt] は,32 [ms] に相当する.パラメータ LENGTH は,高速フーリエ変換の性質上,2の累乗の値が適しているため,512 を選ぶ.
より音声の解析に適したフレームの長さを指定するため,窓関数の長さ WINDOW_LENGTH は,400 [pt] (サンプリング周波数が 16 [kHz] のとき,25 [ms] に相当) に設定することもある.
各窓関数の形: 各窓関数 $w(k)$ の形は次の通り.$k$ はサンプルのインデックス,$L$ は窓関数の長さ, FFT 長を $NFFT$ とし,$k$ は $0 \leq k < L$ の範囲を動く. FFT 長が窓の長さよりも大きいとき,$NFFT \leq k < L$ における窓関数の値には,0 が埋められる.
CONJ,複素窓:
$\displaystyle w(k) $ | $\displaystyle = $ | $\displaystyle \left\{ \begin{array}{cr} 0.5 - 0.5\cos \left( \frac{4k}{L}C \right), & \mathrm{if} 0 \leq k < L/4\\ \sqrt []{1-\left\{ 0.5 - 0.5\cos \left(\frac{2L-4k}{L}C\right) \right\} }^2, & \mathrm{if} L/4 \leq k < 2L/4\\ \sqrt []{1-\left\{ 0.5 - 0.5\cos \left(\frac{4k-2L}{L}C \right) \right\} }^2, & \mathrm{if} 2L/4 \leq k < 3L/4\\ 0.5-0.5\cos \left( \frac{4L-4k}{L}C\right), & \mathrm{if} 3L/4 \leq k < L\\ 0, & \mathrm{if} NFFT \leq k < L \end{array} \right., $ |
ただし,$C = 1.9979$ である.
図 6.121 と図 6.122 はそれぞれ, 複素窓関数の形状および周波数応答である. 図 6.122 における横軸はサンプリング周波数に対して, 相対的な周波数の値を意味する. 一般に,窓関数の周波数応答は,横軸が $0$ におけるピークが鋭い方が性能が良いとされる. 縦軸の値は,フーリエ変換などの周波数解析を行ったとき,ある周波数ビンに他の周波数成分のパワーが 漏れてくる量を表す.
HAMMING,ハミング窓:
$\displaystyle w(k) $ | $\displaystyle = $ | $\displaystyle \left\{ \begin{array}{cr} 0.54 - 0.46 \cos \frac{2 \pi k}{L-1}, & \mathrm{if}\ \ 0 \leq k < L, \\ 0, & \mathrm{if}\ \ L \leq k < NFFT \end{array} \right. $ |
ただし,$\pi $ は円周率を表す.
図 6.123,6.123 はそれぞれ, ハミング窓関数の形状と周波数応答である.
RECTANGLE,矩形窓:
$\displaystyle w(k) $ | $\displaystyle = $ | $\displaystyle \left\{ \begin{array}{cr} 1, & \mathrm{if}\ \ 0 \leq k < L\\ 0, & \mathrm{if}\ \ L \leq k < NFFT \end{array} \right. $ |
図 6.125,6.125 はそれぞれ, 矩形窓関数の形状と周波数応答である.
HANNING,ハニング窓:
$\displaystyle w(k) $ | $\displaystyle = $ | $\displaystyle \left\{ \begin{array}{cr} 0.5 - 0.5 \cos \frac{2 \pi k}{L-1}, & \mathrm{if}\ \ 0 \leq k < L, \\ 0, & \mathrm{if}\ \ L \leq k < NFFT \end{array} \right. $ |