
なぜ高速フーリエ変換は画像のような単純な式なのにこちらのサイト書いてあるプログラムは長文で複雑なのですか?
画像の式のまま書くのではだめなのでしょうか?
以下が高速フーリエ変換の式のプログラムが書かれたサイトです。
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で質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
みんなに挑戦してほしい「色彩検定」
これまで多くの方々が受検したが「色彩検定」。その目的や活用法は人それぞれ。今回は、色彩検定に影響を受けた男女3名にインタビュー。
-
c言語 何をしているのかがわからない
C言語・C++・C#
-
C言語について。
C言語・C++・C#
-
c言語のポインタについて numの値は変えていないのになぜ2回目のプリントで24になっているのですか
C言語・C++・C#
-
4
28日以上、31日以下ってC言語でどう表しますか?日本語無しでお願いします。
C言語・C++・C#
-
5
C言語のバイナリファイルに関する質問
C言語・C++・C#
-
6
C言語でfor文とif文を簡単に1からかける方法ないですか? 詳しい方ご回答お願い致します。
C言語・C++・C#
-
7
最適な撮影位置を求めるアルゴリズム
C言語・C++・C#
-
8
c言語、structについて
C言語・C++・C#
-
9
c言語ポインタと構造体について
C言語・C++・C#
-
10
c言語について 下記の計算結果を出力するコードを記述する問題で 0-4 3.14×2 5÷3 30÷
C言語・C++・C#
-
11
C言語 cmd 新規ファイルで行ってもこうなります… なぜでしょうか?
C言語・C++・C#
-
12
C言語のwhileを使ってプログラムを組みたいです!自分でやってみたのですが答えが合わないので教えて
C言語・C++・C#
-
13
C言語 配列の構造体を下位関数で参照する方法につい
C言語・C++・C#
-
14
このサイトにプログラムのスクリプトは貼れますか?
C言語・C++・C#
-
15
c言語で配列をfprintfで入力すると変な値が出ます。
C言語・C++・C#
-
16
c言語の配列について
C言語・C++・C#
-
17
https://same.blog/2021/05/28/c言語高速フーリエ変換の実装周波数間引き型
C言語・C++・C#
-
18
C#を新卒の研修レベルまでになるには、大まかでいいのでどれくらいの勉強時間が必要ですか? 私の現時点
C言語・C++・C#
-
19
ポインタの型変換、どうやるんでしたっけ?
C言語・C++・C#
-
20
c言語の質問です。 ランダムに4桁の暗証番号を出力するプログラムを作ったのですが、4947→4973
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
このカテゴリの人気Q&Aランキング
-
4
コンピュータでいう「割り込み...
-
5
東芝のDynabookなのですがアン...
-
6
プログラミング初心者です。 演...
-
7
float型とdouble型の変数の違い...
-
8
exeファイルを実行するとコマン...
-
9
C言語win32api、エディットボッ...
-
10
O(n log n)について2
-
11
C#OpenCv V4にのエラーに関する...
-
12
[Unity]シーンファイルの中が消...
-
13
数字の位ごとの値を表示するプ...
-
14
C言語初心者の質問失礼します。
-
15
printf で二進表示を行いたい。
-
16
C++ クラスをメンバにもつクラ...
-
17
エラーの意味は? Lvalue req...
-
18
プログラムによく出てくるst...
-
19
C言語 配列の長さの上限
-
20
2の補数を計算するプログラム
おすすめ情報
公式facebook
公式twitter