FFTの処理数は、2のべき乗にする必要がある。 一方、NAudioでデータをキャプチャする場合、キャプチャ時間はms単位でしか設定できない。
というわけで、サンプル数をFFTの処理数に合わせることができない。
キャプチャしたデータ数とFFTの処理数が一致しない場合、方法としては余ったデータを捨てるか、足りないデータを0で埋めるということになる。
いつも参考にしている「C#によるデジタル信号処理プログラミング」という教科書では、0埋めの方法が紹介されている。
どっちがいいのか、実際にMathNetで提供されているFFTを使って実験して確かめてみた。
キャプチャデータ数(A)とFFT処理数(B)の差は、10%程度としてみた。
最初に基準として両者が一致している場合。A=B=8192
信号の周波数は、4kHz。
余ったデータを捨てた場合。A=9011、B=8192
周波数が低い方へずれているように見える。
足りないデータを0埋めした場合。 A=7373、B=8192
周波数が高い方にずれているように見える。
というわけで、あたりまえだけどやっぱりキャプチャしたデータ数とFFTの処理数は一致していないといけないという結果になった。 FFTの表示を見てみると、どちらかというと余ったデータを捨てた方が一致した場合に近い。
今回、10%というかなり大きい差をつけたけど、実際、そこまで大きな差になることはないと思うので、現実に近い値で実験したみた。
サンプルレートを一般的な48kHzとして、8192に近いデータを多めに取る場合、キャプチャ時間を171msにすると8208データとなる。
この場合 A=8208、B=8192
ほぼ一致している時と同じ波形になった。
どの程度の差まで許容できるか不明だけど、実際それほど大きな差にはならないと思うので、現実的にはなるべく一致するような大き目のデータサイズにしてやれば問題なさそう。