FFTを使用するときに2の累乗を使用することはどのくらい重要ですか?


8

ここに問題があります。データの2D配列があります。最初の列は時間データを表し、2番目の列は時間データに基づく正弦波応答データを表します。私はfftを適用し、予想どおり特定のビンで私の周波数(最初に使用したもの)を取得し、そのビンから振幅と位相角を見つけます。今問題は同じ設定ですが、より多くのデータポイントを使用して、fftを再度適用し、ビン番号を変更します(これは正常であり、期待どおりの場所です)、振幅は同じですが位相角違います)最初にこれは正常ですか?第二に、私はどのようなアプローチを取るべきですか?ありがとうございました

PS:どちらのセットアップ(上記)も2の累乗の長さのデータを提供しません。たとえば、最初のものは1620データポイントを提供し、2番目は1745データポイントを提供するため、両方から次の2の累乗を取る必要があります。はじめに?

回答:


5

FFTWやAppleのAccelerateフレームワークなどの最新のFFTライブラリは、合成長のすべての素数がかなり小さい限り(2、3、5など)、2のべき乗でないFFTを非常に効率的に実行できます。

2の累乗は、何らかの理由で独自のFFTをコーディングする必要がある場合、またはプログラムの最大長(またはFPGAゲートなど)に制約されている場合に、より単純になります(約1ページのソースコード)。

位相測定の場合、FFTシフト(データをN / 2だけ事前回転)して、FFT位相をデータウィンドウの中心に参照する方が簡単な場合があります。または、長さを変えると、FFT長が非周期的な信号であっても、(そのデータウィンドウの中心で同じ位相の)ビン番号と交互になります。


こんにちはhotpaw2。申し訳ありませんが、MATLAB FFTを使用していることを忘れてしまいました。違いはありますか?ありがとうございました。
ラミア2013

MatlabはFFTWなどの最新のFFTライブラリを内部で使用する場合があります。ご使用のバージョンについては、MATLABのドキュメントを確認してください。
hotpaw2 2013

また、@ hotpaw2、私はすでにfftshiftを使用しています...
lamia 2013

fftshiftを使用して、位相を測定したい場所にデータウィンドウを配置します。または、適切な周波数推定を使用して、中心から時間的に逆位相を計算します。
hotpaw2 2013

5

2 DFTの累乗を実行することで本質的に「魔法の」ものはありませんが、2 DFTの累乗を実行すると、 O(Nlog(N)) の代わりに O(N2)。したがって、2 DFTの能力(これを行うアルゴリズムはFFTと呼ばれます)を使用すると、DFT計算を非常に高速に高速化できます。

私はfftを再度適用し、ビン番号が変更されます(これは正常であり、それが予想される場所です)、振幅は同じですが、位相角は異なります)最初にこれは正常ですか?

データベクトルよりも大きいDFTを実行する場合は、基本的に周波数領域で補間することになります。したがって、新しいピークは、より大きなDFTを行う前に最初に検出した古い同等のピークではない可能性があります。そして、それは同じではないので、基本的に今回は異なる複素指数(サインとコサイン)の基底を選択しています。つまり、異なる位相値を持っている可能性があります。

PS:どちらのセットアップ(上記)も2の累乗の長さのデータを提供しません。たとえば、最初のものは1620データポイントを提供し、2番目は1745データポイントを提供するため、両方から次の2の累乗を取る必要があります。はじめに?

はい、2のべき乗のFFTを取得する場合は、データレコード長よりも大きい次の2のべき乗の長さのFFTを選択するだけです。

私は必ずしも2 FFTのパワーを使いたくない、またはしたくない(時間のパフォーマンスはまったく問題ではない)、もっと必要なのですか?

データを破棄したくない場合を除き、レコード長より短いFFTは絶対に使用しないでください。FFTの長さがデータレコード長よりも大きいと仮定すると、「FFTはどのくらいの大きさである必要があるか」という質問は、すぐにアプリケーションに依存するようになります。通常は、レコード長と同じFFT長で十分です。ただし、「滑らかな」FFTからピークを選択したい場合があります。この場合、より長いFFT長(2倍、3倍、10倍など)をとることができ、周波数ドメインでピークを補間します。ただし、マジックナンバーはありません。FFT結果の粒度は常にfsN


回答をありがとうuser4619、私は必ずしも2 FFTの能力を使いたくない、またはしたくない(時間のパフォーマンスはまったく問題ではない)、もっと必要なのですか?
ラミア2013

また、@ user4619、はい、位相角が変わる可能性があるとおっしゃっていましたが、どちらが正しい答えを与えていると思いますか?(私は事前の位相角または振幅がわかりません、私は事前の周波数しか知りません)...ありがとう
ラミア

@lamia 2のべき乗は、速度の問題専用です。それだ。それ以外の点では、魔法のようなものはありません。位相角について-位相角が変化しても、ピーク周波数は変化することに注意してください。1000ポイントのFFTを実行する場合、周波数ビン100をピークとして選択し、その位相角を見つけます。それは正しいです。次に、343212ポイントのFFTを実行し、周波数34321をピークとして選択すると、位相角が異なります。それはまだ正しいです。「位相」は周波数の関数です。(これが役に立ったと感じたら、
遠慮なく賛成投票

@lamia私の編集も参照してください。
Tarin Ziyaee 2013

あなたが提供した説明をありがとうございました:)
ラミア

3

@ user4619の回答を表示:

Matlabに類似したIPythonの使用

In[1]: fft(arange(2**22))
1 loops, best of 3: 354 ms per loop

In[2]: fft(arange(4*1000*90*12)) # close to 2**22
# equal to 2*2 * 2*5*2*5*2*5 * 3*3*2*5 * 2*2*3
1 loops, best of 3: 295 ms per loop

In[2]: fft(arange(2**22+1))
1 loops, best of 3: 14 s per loop

本当に素数を使用している場合は、かなり重要です(50倍!)。因子の少ない数値を使用している場合、重要ではありません。しかし、素数のみでそれを行うと、速度が上がるだけで、答えはまったく変わりません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.