
なぜ高速フーリエ変換は画像のような単純な式なのにこちらのサイト書いてあるプログラムは長文で複雑なのですか?
画像の式のまま書くのではだめなのでしょうか?
以下が高速フーリエ変換の式のプログラムが書かれたサイトです。
https://same.blog/2021/05/28/c言語高速フーリエ変換の実装周波数間引き型fftコ/
補足としてフーリエ変換や離散フーリエ変換のプログラムを見ても式のまま書いているわけではなく、式らしきものは見当たらず複雑なプログラムに見えました。なぜ式のまま書き込まないのでしょうか?

No.7ベストアンサー
- 回答日時:
○その式( X_k = Σ〜 ) は離散フーリエ変換の式です。
「高速フーリエ変換」とは、特定の条件を満す場合に、離散フーリエ変換を高速に計算する手法(アルゴリズム)です。
なので「基になる計算式」は同じですが、 実際の計算方法が違って見えます。
○「単純」と「計算が効率的」とは別次元の話です。
○「計算量」について調べてみましょう。
実際の計算時間はいろんな要素が関係するので、単純にXX倍早い、といったことは言えません。
そこで、速さの評価に「計算量」がよく使われます。
対象の規模を n としたとき
O(n^2) の方法では、大体 n^2 に比例した時間がかかります。
O(n・log n) の方法では、大体 n・log n に比例した時間がかかります。
nが大きいと、 n^2>n・log n となります。
nが大きくなればなるほど、この差は大きくなります。
似た例では。
数列の総和を求めるΣ ですが
・全ての数列に対応できる計算方法は「全ての要素を順番に足していく」だけです。
1000要素の数列の場合、999回の足し算が必要です。
10000要素の数列の場合、9999回の足し算が必要です。
計算量はO(n) です。
・もし、数列が「階差数列」だとわかっていれば、「階差数列の総和の公式」を使って、数回の四則演算で求めることができます。
1000要素の数列でも10000要素でも同じ回数です。
計算量はO(1) (nに依存しない定数) です。
ただの足し算と比べると、「公式」は複雑に見えます。
ですが、実際の計算の手間は公式の方が少なくなります。
No.6
- 回答日時:
>補足としてフーリエ変換や離散フーリエ変換のプログラムを
>見ても式のまま書いているわけではなく、
>式らしきものは見当たらず複雑なプログラムに見えました
式通りに計算するとメチャクチャに遅くなるからです。
指数関数や三角関数は四則演算に比べムチャクチャ遅いですが
アルゴリズムを工夫すればN回使うことを避けられます。
ほぼ四則演算だけで演算を済ませることが出来ます。
フーリエ変換は膨大なデータの計算なのですから
効率の良いアルブリズムを選ぶべきなのです。
FFTは更に複雑ですが、処理量は更に激減します。
これはフーリエ変換に限らず、ソ―トとか探索等の
基本的なプログラシングのタスクにも言えることです。
先人の知恵を学びましょう。
No.5
- 回答日時:
1.C言語に 該当する機能が無い(無かった)
例えば、Σ そのものは無いので、 forループで実現する、など
2.その式をそのままプログラムにしても「高速」フーリエ変換にならないから。
その式は、 n=0,1,2,...,N-1 のN回 x_n * exp(〜) を計算します。
それが X0,X1,...X(N-1)のN回必要です。
計算量が O(n^2) になります。
高速ではありません。
これを、条件を限定して、フーリエ級数やexp関数の性質を利用して「無駄な計算はしない」というのが、高速フーリエ変換の仕組みです。
結果、 1回あたり logN 回 × X0,X1,...X(N-1)のN回 でO(n・log n)になります。
ただ、この無駄を省くための処理がちょっと複雑になってしまいます。
ありがとうございます。
すなわち、高速フーリエ変換を計算する上で式に代入して計算するより、高速フーリエ変換を計算する過程で省いても良い部分があったため、その部分を省いた結果プログラムが複雑な形になったわけでしょうか?
ちなみに、高速フーリエ変換の式のままのプログラムとアルゴリズムを使ってプログラムではどのくらいの計算速度の差があるのでしょうか?
どうかよろしくお願い致します。
No.4
- 回答日時:
実際には FFT の「式」を (そのまま) 書いただけなんだけどな. ベタな DFT を FFT の式にしたのは人間. あと DFT より FFT の方が誤差も小さくなる, って話もあるな.
以下はおまけ.
「ベタな DFT」を FFT として実装するのを「C言語系の『悪習』」と呼ぶのは, いくらなんでも C (系) への偏見が過ぎる>#3. 少なくともこの件については「実装上の最適化の話と理屈がゴチャ混ぜにされて語られる」わけではない. 「理屈」の上で「最適化」して, それを実装しただけ. 「実行を高速化する事が狙い」ではあっても「アルゴリズムレベルの本質的な高速化」であって, 間違っても「種々のプログラム上の数学的抽象化より、アセンブリ言語的に『いろいろ内訳を細かく分解して』全部ベタ書き」したわけじゃない.
No.3
- 回答日時:
> 画像の式のまま書くのではだめなのでしょうか?
あくまで理論的な話では。
書いてもいいですよ。別にダメだ、って事はない。
ただ、C言語系の話、記事、書籍に良く見られますが、
「実装上の最適化の話と理屈がゴチャ混ぜにされて語られる」
ケースが多いんで、貴方のように混乱するわけです。
ハッキリ言うと、C言語系の「悪習」と言って良い。
「理論」と「最適化実装」をゴチャ混ぜにして語る人が異様に多いのです。
「高速フーリエ変換」と言う通り、実行を高速化する事が狙いなわけでしょう。
つまり、種々のプログラム上の数学的抽象化より、アセンブリ言語的に「いろいろ内訳を細かく分解して」全部ベタ書きしないと速くならない。
ただそれだけです。
ただ、数学そのものを「プログラミングしたい」のなら、非効率でもそっちを選択しても良い、って事です。
その辺は貴方の目的とかプログラムの使い方による、って事ですね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(学校・勉強) ラプラス変換とフーリエ変換の違いを教えて下さい! 4 2021/10/28 18:41
- 数学 離散フーリエ逆変換が周波数分割数をNにできる理由について 4 2022/09/18 12:56
- 数学 フーリエ変換、逆変換の「2π」の扱いについて 3 2022/10/07 08:31
- 数学 複素数のある関数のグラフ化について 1 2021/12/26 00:26
- 数学 フーリエ変換後の負の周波数成分の扱いについて 4 2022/09/03 10:18
- 物理学 フーリエ変換の振幅について 1 2022/09/04 08:56
- C言語・C++・C# C 開放してるのにエラー(double free or corruption (!prev))がでる 4 2021/10/30 17:51
- 物理学 複素フーリエ級数展開からフーリエ変換 1 2023/05/12 16:15
- 数学 フーリエ変換に関して、質問があります。 画像の一枚目を2枚目の赤い下線部の式にするにはどうすれば良い 4 2022/09/05 06:11
- 数学 フーリエ変換2πから2Lへの拡張、途中式 2 2023/05/21 23:31
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・「それ、メッセージ花火でわざわざ伝えること?」
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・【お題】甲子園での思い出の残し方
- ・【お題】動物のキャッチフレーズ
- ・人生で一番思い出に残ってる靴
- ・これ何て呼びますか Part2
- ・スタッフと宿泊客が全員斜め上を行くホテルのレビュー
- ・あなたが好きな本屋さんを教えてください
- ・かっこよく答えてください!!
- ・一回も披露したことのない豆知識
- ・ショボ短歌会
- ・いちばん失敗した人決定戦
- ・性格悪い人が優勝
- ・最速怪談選手権
- ・限定しりとり
- ・性格いい人が優勝
- ・これ何て呼びますか
- ・チョコミントアイス
- ・単二電池
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・ゴリラ向け動画サイト「ウホウホ動画」にありがちなこと
- ・泣きながら食べたご飯の思い出
- ・一番好きなみそ汁の具材は?
- ・人生で一番お金がなかったとき
- ・カラオケの鉄板ソング
- ・自分用のお土産
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excelで4096点以上のFFTの方法
-
あるプログラムのコマンドライ...
-
Vba UserFormを前面に出す方法...
-
powered byの表記について
-
クリックするとページ内で説明...
-
未使用の変数を一括検索する方法
-
複数のexeファイルの同時セット...
-
ドロップダウンリストの文字を...
-
C言語で、文字をbmp形式の画像...
-
VBAにてメール作成した際、一部...
-
UWSCで指定のフォルダを開きたい。
-
なぜ高速フーリエ変換は画像の...
-
main関数を先頭に置くデメリット
-
ゲームのBGM
-
MATLABで二次元フーリエ変換
-
フーリエ変換のプログラム
-
画像を読み込むのと取り込むの...
-
このVBAの意味を教えて下さいm(...
-
独自拡張子にアイコンの設定
-
LINUX用CプログラムのWindows移...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
あるプログラムのコマンドライ...
-
Excelで4096点以上のFFTの方法
-
VBAにてメール作成した際、一部...
-
Vba UserFormを前面に出す方法...
-
PICマイコンのコピー(クローン...
-
ドロップダウンリストの文字を...
-
XnViewにwebpを「いつも開く」...
-
「Outlookが他のプログラムによ...
-
Excelに埋め込んだVBAのプログ...
-
読み込み中にアクセス違反が発...
-
WORD印刷できるがEXCE...
-
未使用の変数を一括検索する方法
-
モジュール、アプリケーション...
-
VBAでユーザーフォームが自動的...
-
画像を読み込むのと取り込むの...
-
excelのexe化について
-
クリックするとページ内で説明...
-
exeファイルしかないプログラム...
-
TMBMSRV.exeによるCPU使用率上昇
-
javaで特定の文字のカウントを...
おすすめ情報