アルゴリズムへの入力が実数(整数)の離散セットであったとしても、私たちが遭遇したすべてのFFT実装は、複素数(実部と虚部を含む)になります。
実数のみで周波数領域を表現することはできませんか?
FFTは基本的に基底の変更です。 FFTが元の信号を変更する基礎は、代わりに一連の正弦波です。その基礎がすべての可能な入力を記述するためには、位相と振幅を表現できる必要があります。フェーズは複素数を使用して表されます。
たとえば、単一の正弦波のみを含む信号をFFTするとします。位相によっては、完全に実際のFFT結果が得られる場合があります。しかし、入力の位相を数度シフトした場合、FFT出力は他にどのようにその入力を表すことができますか?
編集:これはやや大まかな説明ですが、私は直観を動機付けようとしているだけです。
FFTは、振幅and位相を提供します。振幅は複素数の大きさ(sqrt(x ^ 2 + y ^ 2))としてエンコードされ、位相は角度(atan2(y、x))としてエンコードされます。 FFTの結果が厳密に実数であるためには、着信信号は対称性が必要です(つまり、x [n] = conj(x [N-n]))。
必要なのが強度だけであれば、分析には複素数の大きさで十分です。
はい、実数のみを使用して厳密に実数の入力のFFT周波数領域の結果を表すことができます。
FFT結果のこれらの複素数は、単に2つの実数であり、長さと方向の角度(または大きさと位相)の両方を持つ結果ベクトルの2D座標を提供するために必要です。そして、FFT結果のすべての周波数成分は、一意の振幅と一意の位相を持つことができます(FFTアパーチャのある点に関連して)。
1つの実数だけでは、大きさと位相の両方を表すことはできません。位相情報を破棄すると、iFFTを使用して信号を再作成しようとすると、信号が簡単に大きく歪む可能性があります(信号は対称ではありません)。したがって、完全なFFT結果を得るには、FFTビンごとに2つの実数が必要です。これらの2つの実数は、一般的な慣習により複雑なデータ型の一部のFFTにまとめられていますが、FFTの結果は、2つの実数ベクトル(1つはコサイン座標用、もう1つはサイン座標用)を簡単に生成できます(そしていくつかのFFTはそうします)。
振幅と位相を直接生成するFFTルーチンもありますが、複雑な(または2つの実数の)ベクトル結果を生成するFFTよりも実行速度が遅くなります。マグニチュードのみを計算し、位相情報を破棄するFFTルーチンも存在しますが、通常は、より一般的なFFTを実行した後に実行するよりも速くは実行されません。たぶん、彼らはコーダーに数行のコードを保存しますが、その代わりに可逆性はありません。しかし、多くのライブラリは、これらの低速で一般的ではない形式のFFTを含めることを気にせず、コーダーに必要なものまたは不要なものを変換または無視させます。
さらに、多くの人は、複雑な算術を使用して、関係する数学をlotよりエレガントであると考えています。
(追加:)さらに、別のオプションとして、各FFT結果ビンの2つの成分を、実成分と虚成分、偶数成分と奇数成分、両方とも実成分と見なすことができます。
特定の周波数f
のFFT係数がx + i y
である場合、x
はその周波数でのコサインの係数であり、y
はサインの係数です。特定の周波数にこれらの2つの波を追加すると、その周波数で位相がシフトした波が得られます。この波の大きさはsqrt(x*x + y*y)
で、複素係数の大きさに等しくなります。
離散コサイン変換 (DCT)は、すべての実係数を生成するフーリエ変換の相対値です。 2次元DCTは、多くの画像/ビデオ圧縮アルゴリズムで使用されます。
離散フーリエ変換は、基本的に「時間領域」の複素数のベクトルから「周波数領域」の複素数のベクトルへの変換です(適切なスケーリング係数を適用する場合、DFTはそれ自身であるため、引用符を使用します逆)。入力が実数の場合、2つのDFTを一度に実行できます。入力ベクトルxとyを取り、F( x+ iy)。後でDFTを分離する方法は忘れますが、対称性と複素共役に関するものだと思います。
離散コサイン変換 sort-ofにより、「周波数領域」を実数で表すことができ、非可逆圧縮アルゴリズム(JPEG、MP3)で一般的です。驚くべきこと(私にとって)は、位相情報を破棄するように見えるにもかかわらず動作することですが、これはまた、ほとんどの信号処理の目的にはあまり役に立たないようです(畳み込み/相関を行う簡単な方法を知りませんDCT)。
私はおそらくいくつかの詳細が間違っている;)