• ベストアンサー

一次元IFFTとFFTにおけるプログラムをください。

プログラミング経験1年くらいの者です。 通信シュミレーションのプログラムを書かなくてはいけないことになりました。しかし、私は、IDFTやDFTは作れるのですが、IFFTとFFTのアルゴリズムが難しく、また、プログラミングがまだまだということもあり、なかなかIFFT、FFTのプログラムがかけません。参照となるようなプログラムが欲しいと思っています。どうかよろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • elttac
  • ベストアンサー率70% (592/839)
回答No.1

 参考 URL の,大浦氏のプログラムを使用させていただいてはいかがでしょうか。

参考URL:
http://www.kurims.kyoto-u.ac.jp/~ooura/fftman/

その他の回答 (1)

  • mcurry
  • ベストアンサー率28% (45/158)
回答No.2

おおざっぱにDFTとFFTを説明します^^; dtに関してf(t)と重みexp(-iwt)を掛算し、最後に『まとめて』足し算するのが、DFT f(t)と重みexp(-iwt)を掛けたもの2項を足して、掛けて足して、掛けて足して、・・・・ をやるのがFFT^^; 説明が下手ですみません。 元の式を上手く書き換えてやることで、 『掛けて足して掛けて足して・・・』のような形に式を書き換える→掛算の回数が減る(足し算の回数は増える)ので、計算が速くなります。 うっすら覚えてるポイントとして、 式の書き換えで、expを偶数と奇数の項に分けて、 exp(-iπt)の項を・・・・な気がしました。 あと、バタフライ演算で、 f(t)_kのところにg(w)_kがこないので、順番入れ替え どうこうの処理があったりで、わかりにくいですね。 最小のFFTは、DFTだったような気がします。

sheep_toshi
質問者

お礼

ありがとうございました。 またよろしくお願いします

関連するQ&A

  • FFT(高速フーリエ変換)のプログラム

    お世話になります。 仕事でFFTのプログラムを内製しようとしています。 初心者なので、他の人(今は退社していません)が昔作ったFFTのプログラムを参考にしようと思いそれを解読中です。 そのプログラムはC言語で書かれていますが、「ガウスの消去法を使って連立方程式を解く」というプロセスが含まれています。 私の認識では、FFTではガウスの消去法を使う事はないので、私が見たプログラムはFFTではなくDFTのプログラムではないかと思っています。 FFTのプログラムでガウスの消去法を使う事はあるのでしょうか?勉強中なのと、周りに知っている人がいないため、どなたか教えて下さい。 よろしくお願いします。

  • C言語FFTからのパワースペクトル表示の質問

    手元にはC言語で作成したFFT/IFFTの処理を行うプログラムがあります。FFT,IFFTともに1次元です。 それを使って、図の信号をフーリエ変換し、パワースペクトルを図示できません。 どうすればいいでしょうか? できたら、結果も含めて教えてください。 詳細は画像を張ります。

  • C言語プログラムの離散フーリエ変換

    C言語プログラムの離散フーリエ変換について教えてください。「C言語による画像再構成の基礎」という本のプログラムをもとに二次元画像をDFT(通常の離散フーリエ変換)→InveresFFT(逆高速フーリエ変換)すると画像が左右反転、上下反転してしまいます。DFT→InverseDFTやFFT→InverseFFTだとそのようにはなりません。通常のDFTとFFTのアルゴリズムの違いからしかたがないのでしょうか?それともプログラムの変更で修正できるのでしょうか?どうしてもDFT→InverseFFTでがぞうをもとに戻したいのです。 サンプルページ http://www.iryokagaku.co.jp/frame/03-honwosagasu/370/370-dl.html P4-14fourier2d1d.c (離散フーリエ変換DFT)   P4-15fft.c(高速フーリエ変換)プログラムです

  • C# ネット上に公開されているFFTライブラリを使いたい。

    FFT、IFFT(高速フーリエ変換)のプログラムを使いたいのですが、ネット上で公開されているのはCやC++で書かれたものばかりです。 そういう他の言語で書かれたものをC#でライブラリとして使うことは可能でしょうか? また、可能であればその方法を教えて下さい。

  • C言語によるディジタル信号処理のお勧めの本やサイト

    C言語を使ったディジタル信号処理でFFT,DFT,ハミング窓,ギブスの現象,FIR(IIR)フィルタなどのいろいろなアルゴリズム,プログラムが載っていてしかも分かりやすかったり,有名な本ってありますか? また,何故その本がお勧めのかの理由も聞かせていただければ大変有難く思います。

  • FFTの基底の選び方について教えてください。

    FFTの基底の選び方について教えてください。 NETLIB-NAPACKから任意個数のFFTをダウンロードし、個数が素数の計算をしたところ計算時間がものすごくかかります。例えば、N=16411で複素数の場合、そのままだと約15秒、後にゼロをつけて2のべき乗(N=32768)にすると0.02秒、N=17496(=2^3*3^7、試行で求めた)にすると0.03秒となります。そこで後につけるゼロの個数をできるだけ減らし、かつ元個数に最も近いような個数(例えば今回の17496)を、2,3,5,7のべき乗で表す個数(今回の17496)を求めるアルゴリズム、もしくはプログラムは無いものでしょうか。

  • FFTで小数点以下のsin周波数を検出することはできるのでしょうか?

    FFTで小数点以下のsin周波数を検出することはできるのでしょうか? 私はFFTどころか「フーリエの冒険」を読んででやっとDFTがなんたるかを理解できた人間なんですが、 今どうしてもC言語のFFTのプログラムを必要としています。 で、今の私ではFFTのプログラムを作ることはできないと思ったので インターネットからプログラムをコピーして使用していたのですが、 私が調べた限りだと小数点以下のsin周波数を正常に検出できるようなFFTのプログラムはみつかりませんでした。 ですので、詳しい人がいたら小数点以下のプログラムがあるところを教えてください。お願いします。 あと気になる点があるのですが、 http://mak-oto.cocolog-nifty.com/blog/2009/10/post-84b1.html ↑のURL先の記事を読んで、小数点以下の周波数をどう検出したらいいのかよく分からなくなりました。 そこについての補足もできればよろしくお願いします。

  • Excel VBAにてFFT

    Excel VBAにておよそ5万点のデータをFFTする方法についての質問をさせてください。 いつもはあるソフトを用いて実験データのFFTを行っているのですが、作業効率を改善したいと考えExcel VBAにてFFTをしたいと考えています。 私はC言語を少しですが学習したことがあるので、FFTWのようなFFT を実装したフリーソフトウェアが存在しているのを知っています。 時間節約のためExcel VBAにてFFTのコードを位置から書くのではなく、FFTWのアルゴリズムでExcel VBAで利用できるプログラムを使いたいと考えています。 この場合、自分でFFTWのコードを見ながらExcel VBA用にコードを書きかえるしか手はないのでしょうか。私はC言語もExcel VBAも未熟であるため、この作業を行うことができそうにありません、、、 Excel VBAで利用することのできるFFTのコードはあるのでしょうか。 なお、FFTするためのデータ点数は約5万点、多いと10万点ほどで、データ点数が2の累乗に限定しないものを使いたいと考えています。

  • 多次元フーリエ変換のプログラムについて

    ある物理量に関して物理空間(x,y,z,t)と周波数・波数空間(kx,ky,kz,ω)の変換ができるプログラムを探しています。多次元フーリエ変換(この場合は4次元フーリエ変換?)のプログラムになると思いますが、ネット上などで検索できるでしょうか。1次元の場合は手元にありますが、それを変形して作成することができるかな?と思っていますが。それよりもこのようなプログラムはちゃんとしたものが1つあればよいわけですから、しっかりした既存のものを使いたいです。変換のアルゴリズムはFFTになると思いますが、そうでなくてもいいのです。ブラックボックス的なことでよいのですが。 以上、よろしくお願いします。

  • FFTを使って信号を周波数変換する方法を教えてください。

    音信号を周波数変換するプログラムを作成しています。 FFTを使って実現しようとしているのですが、うまくいきません。 現時点で作った方法では、 (1)FFTする。結果は配列x_re[NFFT]、x_im[NFFT]に格納。(x_re:実数部 x_im:虚数部 NFFT:ポイント数、配列の内容としては周波数の低い順に結果データが並んでいる) (2) x_re,x_imの内容をずらす。(例えば以下のように配列内容を1つずらせばIFFTをした時周波数が高くなるはず) for(i=0;i<NFFT-1;i++){ x_re[i+1]=x_re[i]; x_im[i+1]=x_im[i]; } (3)配列x_re[NFFT]、x_im[NFFT]に対しIFFTする。 FFT・IFFTが正しく動作するのは確認しています。 (動作実績も結構あります。(2)を省略し(1)(3)だけとすれば出力結果は入力結果と同じ(出力音声を聴いた感じで)になるので、正しく動作していると思います。) よって(2)が間違っていると思います。 (2)をどのようにすれば周波数変換できるのか教えてください。また今の所FFTを使おうとしているのですが、別に入力信号を周波数変換できればOK(周波数を上げたり下げたりしたい)なので、その方法があれば教えてください(><)

専門家に質問してみよう