2011-09-21 7 views
5

ここではさまざまなFFTの質問を見てきましたが、実装の一部については混乱しています。リアルタイムでFFTを実行する代わりに、オフラインでやりたい生データがfloat[] audioにあるとします。サンプリングレートは44100ですので、audio[0] to audio[44099]には1秒分のオーディオが含まれます。私のFFT関数がウィンドウ処理(ハニングなど)を処理する場合、単にaudioバッファ全体を1つの関数に入れるだけですか?または、オーディオを4096(私のウィンドウサイズ)のチャンクにカットし、それをFFTに入力しなければならないのですか?FFT - ウィンドウを表示するタイミングは?

+1

確かにこれはあなたのFFTライブラリの仕様に依存します使っている。 – Mankarse

+0

この質問はdsp.stackexchange.comに適しています。それは動かされるべきか? –

+0

@Mankarse - はい、申し訳ありませんが、私はより具体的にすべきでした。私は3つの異なるFFTライブラリを持っていて、どれを使うかはわかりませんでした。私はAppleのAccelerateフレームワークでこれを使用することに決めました。 – Skoder

答えて

2

入力データを別のバッファにコピーし、正しいフォーマットで取得する必要があります。 FFTがインプレースの場合、またはインタリーブされた複雑なデータ(実数/虚数)が必要な場合。しかし、FFTルーチンが純粋に実際の入力を受け取り、インプレース(非破壊的)でない場合は、適切なサイズのパラメータとともに、元のサンプルデータへのポインタを渡すことができます。

通常、オーディオの1秒間、オーディオの合理的に固定されたチャンクに対応するFFTサイズを選択します。 10msまたは20ms。したがって、44.1 kHzでは、FFTサイズは512または1024と言われるかもしれません。バッファを進め、各開始点で新しいFFTを実行することによって、連続するスペクトルを生成します。これらの連続するバッファを通常50%オーバーラップさせるのが一般的な方法です。したがって、N = 1024の場合、最初のFFTはサンプル0..1023になり、2番目のサンプルはサンプル512..1535、次に10244..2047などになります。

+0

助けてくれてありがとうPaul。私は、アップルのAccelerateフレームワークを使用するつもりです。これは、インプレースFFTを実行すると信じているので、別のバッファでデータを操作する必要があると思います。したがって、180秒の長さの曲があれば、説明したようにバッファを繰り返して、N = 7938000(44100 * 180)までのFFTを実行します。 – Skoder

+2

関数名が "ip"で終わる場合、関数名はインプレースです。 'vDSP_fft_zrip'。したがって、入力データの各チャンクを適切なFFTバッファにコピーしたり、ウィンドウ関数(Hannなど)を適用したり、FFTを適用したり、パワースペクトルなどを計算したり、このチャンクのパワースペクトルを保存または表示したり、次のチャンクへ... –

+1

も参照してください:http://stackoverflow.com/questions/3398753/using-the-apple-fft-and-accelerate-framework –

1

選択するチャンクサイズまたはウィンドウ長は、周波数分解能およびFFT結果の時間分解能を含む。あなたは、あなたが望むものを決定しなければなりません。

長いウィンドウでは、周波数分解能は向上しますが、時間分解能は低下します。より短いウィンドウ。逆もまた同様です。各FFT結果ビンには、1つの単一周波数だけでなく、ウィンドウの形状(長方形、フォンハンなど)に応じて、サンプルレートをFFT長で割った値の約1〜2倍の周波数帯域幅が含まれます。データチャンク全体が停止している(周波数の内容は変わらない)場合は、時間分解能は必要なく、1秒間に1〜2Hzの周波数の「分解能」になる可能性があります。複数の短いFFTウィンドウを平均化することは、スペクトル推定の分散を減らすのにも役立ちます。

+0

熟知しているかどうかはわかりませんが、AudioSurfと似たようなものを作成しようとしています(このビデオは、http://www.youtube.com/watch?v=で約20秒のテンポの良い例を示しています) 2EsVyEnhxWY)。 AudioSurfはオーディオをリアルタイムで処理するのではなく、前処理しています。 – XSL

+0

@SSL - なぜテンポの認識に1秒しかのFFTがないのですか?あるいは、これがOPのオリジナルの質問を超えたものについては、おそらくあなたはSOに関する新しい質問をするべきでしょう。 – hotpaw2

+0

それは最初の質問を超えていましたが、私はOPと同じことに興味がありました。私はその情報を今必要としないので、私はその橋を渡るときに新しいスレッドを作成します。 – XSL

2

データセット全体(OPの場合、データの1秒を表す44100サンプル)に渡って1つのFFTを計算するか、完全なデータセットのより小さいサブセットにわたって一連のFFTを実行するか、データおよびFFTの意図された目的に依存する。

データが完全なデータセットに対して比較的静的に静的である場合は、データセット全体で1つのFFTが必要になる可能性があります。

しかし、データセット上でデータがスペクトル的に動的である場合、データの小さなサブセットにわたる複数のスライディングFFTにより、データのより正確な時間 - 周波数表現が作成されます。

以下のプロットは、A4ノートを演奏するアコースティックギターのパワースペクトルを示しています。オーディオ信号は44.1KHzでサンプリングされ、データセットには131072サンプル、ほぼ3秒のデータが含まれています。このデータセットは、Hannウィンドウ関数で事前に乗算されています。

Guitar spectrum, Hann window, 131072 samples

以下プロットはアコースティックギターのA4ノートの完全なデータセットから採取された16384のサンプル(0〜16383)のサブセットのパワースペクトルを示しています。このサブセットは、また、ハンウィンドウ関数で予め乗算されていた。

Guitar spectrum, Hann window, 16384 samples

サブセットのスペクトルエネルギー分布は、完全なデータセットのスペクトルエネルギー分布とは大きく異なっているかに注意してください。

スライディング16384サンプルフレームを使用して完全なデータセットからサブセットを抽出し、各フレームのパワースペクトルを計算すると、完全なデータセットの正確な時間 - 周波数画像が作成されます。

参考文献:

リアルオーディオ信号データ、ハン窓関数、プロット、FFT、およびスペクトル分析はここで行われた:

Fast Fourier Transform, spectral analysis, Hann window function, audio data

関連する問題