一連の数字 (波のようなデータ) を想定します。次に、DFT (または FFT) 変換を実行します。私が達成したい次のステップは、データに含まれる実際の周波数に対応する周波数を見つけることです。ご存知のように、DFT 出力には実数部と虚数部 a[i] と b[i] があります。スペクトル (sqrt(a[i]^2+b[i]^2) を見ると、その最大値はデータに含まれる周波数に対応します。問題は、DFT からすべての周波数を見つける方法です。誤って選択される可能性のある他の多くのピークがある場合、問題が発生します。
1 に答える
卒業論文を書いていたとき、データのスペクトル解析処理をしていたときにも同様の問題がありました。
その通りです。主な周波数を見つけるには、通常、DFT で複素数値の大きさを確認するだけで済みます。
残念ながら、ピーク (周波数) を識別する何らかのインテリジェントなアルゴリズムを作成する必要があります。アルゴリズムが機能する方法は、アプリケーションで DFT がどのように見えるかに大きく依存します。私の DFT はすべて似たような特性を持っていたので、発見的アルゴリズムをまとめるのはそれほど難しくありませんでした。DFT がどのような形でもとることができる場合、多くの偽陽性および/または偽陰性が発生する可能性があります。
私が行った方法は、低マグニチュード (谷) に囲まれた高マグニチュード (ピーク) を持つ DFT の領域を特定することでした。ピークと谷の間の最小差 (感度) を、データの標準偏差の定数倍として定義できます。さらに、特定のマグニチュード (しきい値) を下回るピークはノイズであるため、完全に無視されると言えます。
もちろん、上記の手法が実際に機能するのは、データの頻度が比較的明確に定義されている場合のみです。DFT が非常にランダムな場合は、感度としきい値を慎重に設定するために細心の注意を払う必要があります。
データの大きさは対称であることを忘れないでください。そのため、データの半分だけを見る必要があります。
DFT で周波数を特定したら、必要な単位に変換することを忘れないでください。メモリから、時間離散化 dt で取得した n 個のサンプルがある場合、最初のデータ ポイントが 1 であるデータ ポイント 5 (たとえば) にピークがある場合、周波数は 1/(n*dt) ラジアン/時間単位。(私はしばらくこれを行っていないので、その式は Pi の係数か何かでずれている可能性があります)