ここでさまざまな FFT の質問を見てきましたが、実装の一部で混乱しています。FFT をリアルタイムで実行する代わりに、オフラインで実行したいと考えています。に生データがあるとしましょうfloat[] audio
。サンプリング レートは 44100 であるためaudio[0] to audio[44099]
、1 秒分の音声が含まれます。FFT 関数がウィンドウ処理 (Hanning など) を処理する場合、audio
バッファ全体を一度に関数に入れるだけですか? または、オーディオを 4096 (私のウィンドウ サイズ) のチャンクにカットし、それを FFT に入力して、ウィンドウ機能を実行する必要がありますか?
3 に答える
データセット全体(OPの場合は1秒のデータを表す44100サンプル)に対して1つのFFTを計算するか、完全なデータセットのより小さなサブセットに対して一連のFFTを実行するかは、データによって異なります。 、およびFFTの意図された目的について。
データが完全なデータセットに対してスペクトル的に比較的静的である場合、データセット全体に対して1つのFFTがおそらく必要なすべてです。
ただし、データがデータセット全体でスペクトル的に動的である場合、データの小さなサブセット上で複数のスライディングFFTを使用すると、データのより正確な時間周波数表現が作成されます。
以下のプロットは、A4ノートを演奏するアコースティックギターのパワースペクトルを示しています。オーディオ信号は44.1KHzでサンプリングされ、データセットには131072サンプル、ほぼ3秒のデータが含まれています。このデータセットは、ハンウィンドウ関数で事前に乗算されています。
以下のプロットは、アコースティックギターA4ノートの完全なデータセットから取得した16384サンプルのサブセット(0〜16383)のパワースペクトルを示しています。このサブセットには、ハンウィンドウ関数も事前に乗算されています。
サブセットのスペクトルエネルギー分布が、完全なデータセットのスペクトルエネルギー分布とどのように大きく異なるかに注意してください。
スライド式の16384サンプルフレームを使用して完全なデータセットからサブセットを抽出し、各フレームのパワースペクトルを計算すると、完全なデータセットの正確な時間周波数画像が作成されます。
参照:
実際のオーディオ信号データ、ハンウィンドウ関数、プロット、FFT、およびスペクトル分析は、ここで行われました。
入力データを別のバッファにコピーし、正しい形式で取得する必要がある場合があります。たとえば、FFT がインプレースである場合や、インターリーブされた複素数データ (実数/虚数) が必要な場合です。ただし、FFT ルーチンが純粋に実数の入力を受け取ることができ、インプレースではない (つまり、非破壊的) 場合は、適切なサイズ パラメータと共に、元のサンプル データへのポインタを渡すことができる場合があります。
通常、スピーチや音楽などの 1 秒のオーディオの場合、10 ミリ秒または 20 ミリ秒など、オーディオの適度に静止したチャンクに対応する FFT サイズを選択します。したがって、44.1 kHz では、FFT サイズは 512 または 1024 となります。その後、バッファーを進めて各開始点で新しい FFT を実行することにより、連続するスペクトルを生成します。通常、これらの連続するバッファーを 50% オーバーラップさせるのが一般的であることに注意してください。したがって、N = 1024 の場合、最初の FFT はサンプル 0..1023、2 番目はサンプル 512..1535、次に 1024..2047 などになります。
選択したチャンク サイズまたはウィンドウの長さによって、FFT 結果の周波数分解能と時間分解能が制御されます。どちらが必要か、またはどのようなトレードオフを行うかを決定する必要があります。
ウィンドウが長いほど、周波数分解能は向上しますが、時間分解能は低下します。短いウィンドウ、その逆。各 FFT 結果ビンには、単一の周波数だけでなく、ウィンドウの形状 (長方形、フォン ハンなど) に応じて、サンプル レートの約 1 ~ 2 倍を FFT 長で割った周波数帯域幅が含まれます。データ チャンク全体が静止している (周波数コンテンツが変化しない) 場合、時間分解能は必要なく、1 秒のデータで 1 ~ 2 Hz の周波数 "分解能" を使用できます。複数の短い FFT ウィンドウを平均化することも、スペクトル推定の分散を減らすのに役立つ場合があります。