題目のようになる理由は、入力信号の周波数スペクトル分布は、正負の符号が異なるだけで、振幅値の分布は、正負の周波数域で対称関係、かつ絶対値は同じ値(正負は反転)だからである。
DFT/FFTの計算目的が、入力信号の周波数値成分と振幅電圧のスペクトル分布を得るためであり、片側周波数域のexp(-jωt)を乗算して積分演算で集積し、信号電圧全体の周波数スペクトル分布が判る。
積分による連続フーリエ変換式は、−∞〜+∞の時間/時刻を値域としているので、複素共役の関係により、初期位相ずれがなければ、虚数部がゼロとなる演算結果になる。
他方、DFTまたはFFT演算による離散フーリエ変換式、または高速フーリエ変換式は、信号電圧の入力値へ、サンプリング周波数の一周期に対応するところの複素数座標の単位円を一周するように、分割された時計回転方向の周波数(回転子)を掛けてから、加算する。このため、実信号の片側の周波数領域側の振幅値だけが、サンプリング値から抽出される。
(DFT/FFT計算値は、その定義式の特性から、先の「複素共役の関係」が成り立たない計算法なので、虚数部分が現れる複素数となる。)
なぜ、プラス側の周波数領域成分を乗算し積分しないのか、その理由は、周波数スペクトルの分布状態は、正負の符号が異なるだけで、振幅値は対称で同じだから。
計算目的は、周波数成分と振幅のスペクトル分布状態を求めるためと考えられる。
TI社資料の下側のFFT式は、より正確にはDFTの式である。
この動画は、winding処理で使う窓関数の紹介等、丁寧に説明がある。
上のFFT式は、DFT式を高速化した計算アルゴリズムがFFT演算になる、と説明の追加を要する。(演算の機能と演算結果は、FFT,DFT は同値。)
動画説明では簡素化のため、数学的厳密性の説明をオミットしている、とある。
上側のフーリエ変換の積分式は、F(ω)の計算値の単位をラジアンにするため?か、2πで割られている。国内では、2πで割るもの/割らないものと、異なる定義式が見られる。
振幅は電圧[ボルト単位]で見るので、なんか違和感。
一方、FFT計算法は、 DFT計算の乗算の演算回数を大きく減らし、計算処理時間を劇的に短縮するコンピュータ計算方法/アルゴリズムに改良したもの。
FFTは、計算速度が速く処理時間は大きく短縮されるが、機能と演算結果は、DFT/FFTも同じ。
FFTの応用事例はよく見るものの、この演算を減らすバタフライ演算とその入れ子計算方法、添字のビット反転とソーティングのアルゴリズム説明は今まで見たことがなかった。
バタフライ演算は、複数の多段に分かれ、次の段が1/2の演算量になるので、底が2の対数に比例して、演算量が減るが、なぜそうやって計算していいのかが、計算規則の規則性から演算を減らすアルゴリズムを導く論理と手順が、わかりにくいところ。
DFT式は、TI社の式より、Ueharaさんの行列式がわかりやすい。
(行列計算は、日本の江戸時代の関孝和さんが世界ではじめに発明。
現在、数IIBから除外されたという情報あり。)
ueharaさんの解説はわかりやすく好評のようです。
他の記事と合わせ、周波数順番に並べ替えるソーティング法と、サンプリング順番の時刻順に並べ替えるソーティング法の必要性とアルゴリズムは、明示的な説明が必要。
周波数順のソーティング法は知られているが、サンプリング順番の時刻順に並べ替えるソーティング法は示されてない例が二例、バタフライ演算と回転子の複素数乗算の概念が無いDFT と誤認する例が一例あるのを参照した。
三角関数による正弦波、余弦波のフーリエ変換およびラプラス変換は、従来の計算法では計算値が発散して収束しないが、この課題の解決が、学問の世界でうまくいっていない感じ。
フーリエ級数では和音が式で書けない課題も、自分の記事以外の公知例が見つかっていない。(本ブログで、解決法を記述済。)
高校以上の数学のうち、フーリエ級数、フーリエ変換、高速フーリエ変換、ラプラス変換の動画やウェブ、教科書、参考書には、未解決または理論の統一の崩れが、数学論理上の課題としてかなり見られる。
先生により教える内容の論理が、様々にバラバラに異なるものになっているのは、どれが本物なのか、何が正しいのか考えねばならず、困っている。
個人的には、動画資料も同じ計算法のものが、異なった説明で、何種類もでてきており困っており、信号処理周辺の学問を体系的に統一・整理する必要性を感じる。
論理ミスがある場合は、それらをほったらかしにしていると、誰も論理ミスや課題を修正されないまま、延々と後世に伝わって、ひじょ〜に長い年数に、多くの人がミス修正に多くの時間と費用をロストしてしまうことが多いので、困っている。
2022/01/30
八雲さんの解説は、FFT応用が世界の文化を大きく進歩させたことなど、面白い
話があります。
付録:
FFTアルゴリズムは、UeharaさんとYagumoさんの説明に違いが見られ、同じではないように見える部分がある。
バタフライ演算:加算と減算 または 加算の違い。
対角行列: D , M にわける/分けないの違い。
(調査、学習、検討を継続中。
programming では、経験者なら公知の「再帰呼び出し」が多段階の「バタフライ演算」部に必要で、上記情報では実現にはさらなる実計算のプログラミングと計算結果と期待値との照合確認要と認識す。
今回のFFT演算は、再帰呼び出しのバタフライ演算が具体的コードのイメージが見えにくく、簡単そうに聞こえるところが、そうではないかも・・・。😒
FFT codeを直接読むのが一番曖昧さがなく処理内容を理解できるかな?
再帰呼び出しからのプログラム実行はコンパイラの潜在力に頼ることになるかな?
なかなかできず、しょうがないので、不完全な理解で暫定公開。)