1

Apple の vDSP を使用して、録音されたオーディオ ファイルに FFT 計算を実装しようとしています (モノラル PCM と仮定します)。

ここで調査を行ったところ、次のトピックが非常に役立つことがわかりました。

たとえば、frame_size N = 1024 サンプル、log2n=10 で FFT を構成しました。

m_setupReal = vDSP_create_fftsetup(LOG_2N, FFT_RADIX2);

// allocate space for a hamming window
m_hammingWindow = (float *) malloc(sizeof(float) * N);

// generate the window values and store them in the hamming window buffer
vDSP_hamm_window(m_hammingWindow, N, vDSP_HANN_NORM);

コードのどこかに:

vDSP_vmul(dataFrame, 1, m_hammingWindow, 1, dataFrame, 1, N);

vDSP_ctoz((COMPLEX *)dataFrame, 2, &(m_splitComplex), 1, nOver2);

// Do real->complex forward FFT
vDSP_fft_zrip(m_setupReal, &(m_splitComplex), 1, LOG_2N, kFFTDirection_Forward);

私が今欠けているのは、FFT の使用法を理解する上で、大きなオーディオ ファイルの完全なスペクトルを取得する方法です。合計で 12800 サンプルと仮定しましょう。


Q: 生データをサイズ 1024 サンプル (~ 12800 / 1024 = 13 フレーム) のフレームに分割し、各フレームで個別に FFT を実行し、何らかの方法で平均 13 FFT の結果を結果のスペクトルにする必要がありますか? それが正しい仮定である場合、平均化を実行する方法は?

助けていただければ幸いです。

4

2 に答える 2

1

統計的に安定した信号がない限り、スペクトルを平均化する必要はありません。音声や音楽のように時変するものであれば、効果的に 3D データ セット (時間対周波数対マグニチュード) が得られ、スペクトログラムまたはウォーターフォール プロットとしてプロットできます。

また、時間軸の解像度を高めるために、連続するウィンドウをオーバーラップするのが一般的な方法であるため、最初のブロックがサンプル 0..1023 で、50% オーバーラップする 2 番目のブロックが 512..1535 などになることにも注意してください。

于 2013-11-07T09:59:03.963 に答える
0

一方、信号静止しており、ある程度のノイズが混在している場合、複数の FFT のマグニチュード結果をベクトル平均するとウェルチ法が得られ、結果として得られる平均マグニチュード スペクトルの信号対ノイズ比が改善される可能性があります。

また、信号が静止している場合は、オフセット ウィンドウの FFT ビン間の位相差を使用して、Phase Vocoder アルゴリズムを使用してスペクトル周波数推定値を調整できます。信号が短い時間間隔で静止している場合、おそらくウィンドウ オフセットを減らす (オーバーラップを増やす) ことによって、これらの間隔内に収まるウィンドウに対してのみこれを行うことができます。

したがって、それは信号と、FFT から必要な情報に依存します。

于 2013-11-07T20:57:42.163 に答える