特定の周波数範囲のFFT。


11

信号を周波数領域に変換したいのですが。望ましい周波数範囲は0.1 Hz1 Hzあり、周波数分解能は0.01 Hzです。

のサンプリングレートでは30 Hz、FFTは最大15 Hzの周波数成分を提供します。サンプリングレートを上げると、周波数分解能が向上します。ただし、FFTはより広い周波数範囲を提供します。私の場合、私がしたいの0.1 Hz1 Hz、FFTが15 Hz(追加の計算)をあきらめることです。

私の質問は、特定の周波数範囲と高分解能で信号の周波数領域を計算できる標準的な方法はありますか?


2
あなたのような音がズームFFTたいarc.id.au/ZoomFFT.html
endolith

サンプリングレートが2 Hzで持続時間が100秒の標準的なDFTを実行すると、0.01 Hzの解像度で0〜1 Hzの周波数帯域が得られます。サンプルの10%だけが、関心のあるバンドの外になります。この比較的小さな計算の効率を改善するために、「それほど標準的ではない」アルゴリズムの詳細を検討する努力は本当に価値がありますか?
フォトン2013年

制約は、期間をできるだけ短くする必要があることです。100は長すぎます。約10秒以上が必要
NcJie 2013年

回答:


5

あなたの問題に対する最良の解決策は、チャープDFTを使用することだと思います。特定の周波数範囲の虫眼鏡のようなものです。FFTアルゴリズムは適切な前処理と後処理で使用できるため、DFTを直接実装する(FFTを使用しない)よりも効率的です。基本的には、信号をチャープ信号で変調し、FFTを使用してフィルター処理し、信号を再度チャープ変調して目的の周波数応答を取得する必要があります。参照してくださいここここにチャープ-DFTを実装する方法の詳細については。


2

周波数ワーピングを使用する可能性もあります(同じサイズのFFTで関心のある周波数範囲で解像度が向上し、周波数が高くなると解像度が低下するという点で拡大鏡としても機能します)。ただし、FFTサイズは縮小されず、周波数ワーピングは決して安価ではないため、MIPSを保存する必要はありません。

FFTで特定のビンのみを計算する(したがってMIPSを保存する)場合は、いくつかの方法があります。たとえば、スライディングDFT。このペーパーの参考資料は、http://www.comm.utoronto.ca/~dimitris/ece431/slidingdft.pdfの非常に優れた説明を提供します。goertzelアルゴも同様のことをしていると思いますが、それはわかりません。

次に、FFTする前にダウンサンプリングするオプションがあります。これにより、おそらくMIPSも節約できます。

編集:Goertzelアルゴリズムが役に立たないというコメントを明確にするために。このWikiページhttp://en.wikipedia.org/wiki/Goertzel_algorithmの下部にある式に値を直接差し込むことにより、必要なFFTのサイズが128より大きい場合、GoertzelアプローチはFFTよりも複雑になります。 (FFTサイズが2の因数であり、基数2の実装であると想定しています)。

ただし、ゲルツェルを支持する考慮すべき他の要因があります。Wikiページを引用すると、「FFT実装と処理プラットフォームは、相対的なパフォーマンスに大きな影響を与えます。一部のFFT実装[9]は、内部の複素数計算を実行してオンザフライで係数を生成し、「コストK / FFTおよびDFTアルゴリズムでは、数値計算の効率を高めるために事前計算された係数値のテーブルを使用できますが、これには外部メモリにバッファリングされた係数値へのアクセスが必要になるため、数値の利点の一部に対抗するキャッシュ競合が増加する可能性があります」

「両方のアルゴリズムは、複素数値ではなく実数値の入力データを使用すると、約2倍の効率を実現します。ただし、これらのゲインは、ゲルツェルアルゴリズムでは自然なものですが、実数の変換に特化した特定のアルゴリズムバリアントを使用しないと、FFTでは実現できません。価値のあるデータ。」


1
スライディングDFTは、入力シーケンスが非常に長く、スペクトルを定期的に再計算する必要があるリアルタイムスペクトル分析のコンテキストで実際に役立ちます。少数のDFT値のみを計算する必要がある場合、Goertzelアルゴリズムは非常に効率的です。必要な周波数ポイントの数が多すぎるため、特定の問題の解決には役立ちません。
Matt L.

@MattLに感謝します。Goertzelアルゴリズムの弱点を指摘してください。
NcJie 2013年

1

周波数分解能は ここで、はサンプリング周波数、はFFTサイズです。したがって、サンプリング周波数を高くすると、実際には周波数分解能が高くなります(「より良い」とは、低いという意味だと思います)。したがって、周波数分解能を下げるには、FFTサイズ、つまり1ブロックのデータでFFTによって処理されるサンプルの数を増やす必要があります。あなたの例では、望ましい周波数分解能を達成するために少なくとも300サンプルが必要です。

Δf=fsN
fsNN

計算の複雑さのためにを増加できない場合、帯域制限された信号はFFTの前に周波数シフトされる可能性があります。LET連続信号であっても中心周波数と、その帯域幅。はサンプルバージョン、つまりです。次に、周波数シフトはによって達成できます ここで、。信号のカットオフ周波数がカットオフ周波数とは対照的にになるため、サンプリング周波数を下げることができるようになりました。Ns(t)fcfbx(n)s(t)x(n)=s(n/fs)

x~(n)=x(n)ej2πk0/N
k0=fc/fsfbF S、F 、B XN M = F S / F B Nfb+fc、それが持っていた前の周波数シフト。サンプリング定理によれば、新しいサンプリング周波数は以上でなければならないため、は係数でダウンサンプリングできますしたがって、一定に保ちながら周波数分解能を向上させます。f~sfbx~(n)M=fs/fbN

この方法は、が厳密に帯域制限されている場合にのみ機能します。そうでない場合は、目的の周波数帯域を除外するバンドパスフィルタリングを事前に適用する必要があります。また、小数によるダウンサンプリングでは、計算がさらに複雑になることにも注意してください。Ms(t)M

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