私たちが遭遇したすべてのFFT実装は、アルゴリズムへの入力が実数(整数)の離散セットであったとしても、(実数部と虚数部を含む)複素数になります。
周波数領域を実数だけで表すことはできませんか?
私たちが遭遇したすべてのFFT実装は、アルゴリズムへの入力が実数(整数)の離散セットであったとしても、(実数部と虚数部を含む)複素数になります。
周波数領域を実数だけで表すことはできませんか?
回答:
FFTは基本的に基底変換です。FFTが元の信号を変更する基準は、代わりに正弦波のセットです。その基礎がすべての可能な入力を記述するためには、振幅だけでなく位相も表すことができる必要があります。位相は複素数を使用して表されます。
たとえば、単一の正弦波のみを含む信号をFFTするとします。フェーズによっては、完全に実際のFFT結果が得られる場合があります。しかし、入力の位相を数度シフトした場合、FFT出力は他にどのようにその入力を表すことができますか?
編集:これはやや緩い説明ですが、私は直感を動機付けようとしているだけです。
はい、実数のみを使用して厳密に実数の入力のFFT周波数領域の結果を表すことができます。
FFT結果のこれらの複素数は、単純に2つの実数であり、長さと方向角(または大きさと位相)の両方を持つ結果ベクトルの2D座標を提供するために必要です。また、FFT結果のすべての周波数成分は、固有の振幅と固有の位相を持つことができます(FFTアパーチャのあるポイントに対して)。
1つの実数だけでは、大きさと位相の両方を表すことはできません。位相情報を破棄すると、iFFTを使用して信号を再作成しようとすると、信号が簡単に大きく歪む可能性があります(信号は対称ではありません)。したがって、完全なFFT結果には、FFTビンごとに2つの実数が必要です。これらの2つの実数は、一般的な規則により、複雑なデータタイプの一部のFFTにバンドルされていますが、FFTの結果は、2つの実数ベクトル(1つはコサイン座標用、もう1つはサイン座標用)を簡単に生成できます(一部のFFTはそうします)。
振幅と位相を直接生成するFFTルーチンもありますが、複雑な(または2つの実数の)ベクトル結果を生成するFFTよりも実行速度が遅くなります。振幅のみを計算し、位相情報を破棄するFFTルーチンもありますが、通常は、より一般的なFFTの後で自分で実行できるようにするよりも速く実行されません。おそらく、可逆ではないという犠牲を払って、コーダーに数行のコードを節約します。しかし、多くのライブラリは、これらの低速で一般的ではない形式のFFTをわざわざ含めず、コーダーに必要なものまたは不要なものを変換または無視させます。
さらに、多くの人は、複雑な算術を使用すると、関連する数学がはるかに洗練されていると考えています(厳密に実数の入力の場合、FFT結果の余弦相関または偶数成分が実数成分に入れられ、正弦相関または奇数成分がFFTの結果は、複素数の虚数成分に入れられます。)
(追加:)さらに別のオプションとして、実数と虚数のコンポーネントではなく、各FFT結果ビンの2つのコンポーネントを、両方とも実数の偶数と奇数のコンポーネントと見なすことができます。
離散フーリエ変換は、基本的に「時間領域」の複素数のベクトルから「周波数領域」の複素数のベクトルへの変換です(適切なスケーリング係数を適用すると、DFTは独自のものになるため、引用符を使用します逆)。入力が実数の場合、一度に2つのDFTを実行できます。入力ベクトルxとyを取得し、F(x + i y)を計算します。後でDFTをどのように分離するかを忘れていますが、それは対称性と複素共役に関するものだと思います。
離散コサイン変換ソートのあなたは実数と「周波数ドメイン」を表すことができ、かつ非可逆圧縮アルゴリズム(JPEG、MP3)において一般的です。(私にとって)驚くべきことは、位相情報を破棄しているように見えても機能することですが、これはほとんどの信号処理の目的にはあまり役に立たないようです(畳み込み/相関を行う簡単な方法を私は知りませんDCT)。
私はおそらくいくつかの詳細を間違えました;)