fft の結果では、大きさと位相が実数部と虚数部に取り込まれることを理解しています。しかし、各サンプルはどのように位相を捉えるのでしょうか?
位相は、時間領域で提供される N 個の離散サンプルに関連していますか?
つまり、入力サンプルに 1 秒間に 44100 サンプルが含まれている場合、FFT の結果の各値は位相の 1/44100 を表しますか?
たとえば、最初の FFT 値は周波数 1/44100 で、2 番目の値は 2/44100 などです。
fft の結果では、大きさと位相が実数部と虚数部に取り込まれることを理解しています。しかし、各サンプルはどのように位相を捉えるのでしょうか?
位相は、時間領域で提供される N 個の離散サンプルに関連していますか?
つまり、入力サンプルに 1 秒間に 44100 サンプルが含まれている場合、FFT の結果の各値は位相の 1/44100 を表しますか?
たとえば、最初の FFT 値は周波数 1/44100 で、2 番目の値は 2/44100 などです。
FFT の出力は、高調波に関連する正弦波成分の和から元の波形を再構築する方法を単純に表しています。
各出力値は、対応するコンポーネントの振幅と位相 (オフセット角度) を表します。A * exp(j * 2pi * f * n + phi)
各コンポーネントが複雑な正弦波 (ではなくの形式のもの) であることに注意することが重要A * cos(2pi * f * n + phi)
です。
周波数は、出力サンプルのインデックスに暗黙的に含まれています。サンプルレートがfs
(Hz) であり、長さN
FFT がある場合、出力サンプルに対応する中心周波数i
はi*fs/N
(Hz) です。
位相は、入力サンプルの周期信号成分の時間シフトに関連しています。
これを表示する方法は次のとおりです...
最初に、 Fast FTはDiscrete FTとまったく同じものであり、より効率的な方法で計算されることを思い出してください。基本に戻って、変換を次のように定義します。
X k (0<=k<=N-1) = 0<=n<=N-1 の合計(x n * e -j * 2*π * n * k/N )
x nは入力サンプル
X kは出力/変換されたサンプル
N はサンプル数
ここで、この複素指数 e -j * 2*π * n * k/Nは、Re/Im 平面の円 (半径 1、(0,0) を中心とする) 上の点を幾何学的に表します。これを忘れた場合は、オイラーの公式を参照してください。
の固定値(出力/変換で関心のある特定の周波数を表す) の場合、すべての に対して、この円上に異なる点k
しかありません。N/k
n
式の合計をもう一度見てください。
0<=n<=N-1 の合計(x n * e -j * 2*π * n * k/N )
この合計では、入力信号 x nによって、点 (0,0) から円上の前述の点までのベクトルをスケーリングしています。これらのベクトルを長くしたり短くしたりしています。そして、それらを合計しています。
x nに の周期を持つ周期信号が含まれている場合N/k
、その信号のすべての最大値はすべて円上の 1 点に整列し、相互に増幅されます。信号の最小値とその他すべての値も寄与します。
簡単に言えば、ここで行っていることは、入力 x nを円に巻き付けることです。信号に周期成分があり、その周期が「円周」 (円上の点の数) と一致する場合、最大値と最小値が一致するため、その周期/周波数のピークが得られます。期間が「円周」と一致しない場合、最大値がいたるところに発生し、互いに相殺されます。そして、これがフーリエ変換の本質です。これがどのように、そしてなぜ機能するかです。魔法も、真に複雑な数学もありません。ロープをリールに巻き付けるだけです。
X kで得られる位相は、すべての最大値が揃った円上の点を示しています。x nの周期信号を1 サンプルまたは数サンプルだけシフトすると、アライメント ポイントもシフトし、位相が適切に変化します。
それが幾何学的な説明です。
これと同じことをフーリエ変換の数学的性質として見ることができます。
x nとその変換 X k =F{x n } がある場合、x n-mの変換はF{x n-m } = F{x n } * e -j * 2*π * k * m/ N = X k * e -j * 2*π * k * m/N . これは、シフト定理/プロパティと呼ばれます。これを自明に導出できるはずです。この係数 e -j * 2*π * k * m/Nの大きさは 1 で、X kを掛けたときにのみ位相が変化します。
また、位相は周波数とは何の関係もありません。
また、サンプリングされた信号 x nの最大周波数は、サンプル レートの半分です (実際には、半分よりわずかに小さいだけです。ナイキスト サンプリング定理を参照してください)。つまり、あなたのケースの FT は 22050 Hz 以上では何も得られないということです。これは、より高い周波数でのすべての情報がサンプリングで失われているためです。
X k値の半分は、負の周波数を持つコンポーネントを提供します。これk > N/2
は、円上の点の間を移動する方向が逆になるためです。そのため、出力/変換に非常に多くのサンプルがあるにもかかわらず、最大周波数はまだサンプル レートの半分未満です。
質問の一部で「周波数」を意味するとき、「位相」と言っていると思いますか?
とにかく、頻度について尋ねている場合、「入力」データの時間とほとんど同じように機能します。各配列要素が異なる時間にある時系列データから始めます。fft の後、「出力」は似ていますが、各要素は異なる周波数です。
これらは、一定のオフセットから可能な限り高い周波数まで均一なステップで変化しますが、実際の順序は使用している実装によって異なる場合があります。したがって、各複素数は特定の周波数での振幅と位相を表します。出力配列の位置から周波数を計算できます。
時間 T をカバーする N ポイントがある場合、最高周波数は N/(2T) であり、値は 1/T の倍数です (0Hz - 定数オフセットを含む)。たとえば、1 分間に 60 サンプル (N=60 T=60s) の場合、最高周波数は 0.5Hz になります。データが十分にサンプリングされていないため、より高い周波数はありません (たとえば、1 Hz の信号は各サンプルで最大になる可能性があり、一定の信号として表示されます)。この制限はナイキスト周波数と呼ばれます
(上記は、出力が複素数の配列であると仮定しています。多くの場合、それは float/double の配列であり、配列のさまざまな部分の実数と虚数の値から複素数をつなぎ合わせる必要があります。すべてが少し面倒ですが、概念は、複雑な値の配列が返された場合と同じです)。
ps通常、どこかからfftルーチンを使用する必要がある場合、一定のオフセットと2つの既知の周波数正弦波を持つデータを作成し、それをfftして結果を確認します。各コンポーネントの振幅を異なるものにすると、通常、物事がどのように順序付けられているかが明らかになります。スケールを確認することもできます.2piの係数がある/省略されることがあるためです...
FFT 結果の周波数は、結果ベクトルの複素数によってキャプチャされません。周波数乗数は、複素数を含む各配列要素のインデックスによって取得されます。次に、インデックスを取得し、時間領域サンプルのサンプル レートと FFT の長さの逆数に関連する周波数スケール ファクターを掛けて、各 FFT ビンの中心周波数を取得します。
各 FFT 結果ベクトル要素によって表される各周波数正弦波は、他のビンまたは配列要素と共有されない独自の独立した位相を持ちます。
FFTの長さがわからないと、周波数はわかりません。したがって、質問の最後の部分に対する答えは、不明またはいいえのいずれかになります。