ゆき社長

シーゲンガーのお勉強 ゲームプログラマ、ゲーマー、色々!

FFT 始めました! part.1

こんばんわ 自称スーパーハカーアイドル ちはやです

ここ数年風邪ひいてない、オレバカ確定wwwww

ってつぶやいて、まわりから

「ちはやさん頭いいよ!10まで数えられるもん!」

って 慰めてもらった翌日

100年に一度の風邪をひきやがりましたよ! こんちくしょ~!

ってことで、今まで 部屋の中で、着る寝袋を着て 毛布にくるまって

妖怪寝袋星人になってましたよ

ってことで続き

この間の数式から(結局TeXよくわからんから Wikipedia画像w)

FFT(高速フーリエ変換)ですね!

畳み込み

このあたり、実はわたし 算数得意じゃないからよくわからないんですよね。

積分が面積で シグマが合計で まぁ そんなレベルなのであります

なので フーリエ変換を基本から勉強せななーって。

まずは 習うより慣れろ!ってことで 有名なFFTライブラリ FFTW 導入しようと思います

今回は このサイト

WindowsでFFTを使う

さんを パク いや 参考にさせてもらいます!

http://www.fftw.org/download.html

から。

とりあえず 今回はWindowsのDLLをダウンロードし

展開したディレクトリ上で、VisualStudioのコマンドライン立ち上げ

今回は32ビットアプリで勘弁して!

lib /machine:i386 /def:libfftw3-3.def

lib /machine:i386 /def:libfftw3f-3.def

lib /machine:i386 /def:libfftw3l-3.def

ってやると 3つのライブラリができる

libfftw3-3.lib (単精度用)

libfftw3f-3.lib (倍精度用)

libfftw3l-3.lib (ロング精度用)

たぶん今回は 単精度しか使わないだろうけどっ!

で、それらの入ってるディレクトリを VisualStudioのリンク、実行ファイルのディレクトリに追加

そして サンプルのFFTWを使ったプログラムを ほぼそのままぱくりで

コンソールアプリとして作ります。

#include

#include

#include

#include "fftw3.h"

#pragma comment(lib, "c:/lib/fftw3/libfftw3-3.lib")

#define SIZE 128

#define RANGE 10

int main()

{

int i;

fftw_plan plan;

fftw_complex *in_buf, *out_buf;

in_buf = (fftw_complex *)fftw_malloc(sizeof(fftw_complex)*SIZE);

out_buf = (fftw_complex *)fftw_malloc(sizeof(fftw_complex)*SIZE);

for(i = 0; i < SIZE; i++){

in_buf[i][0]=0.0;

in_buf[i][1]=0.0;

}

for(i = 0; i < RANGE; i++)

in_buf[i][0] = in_buf[SIZE - i - 1][0] = 1.0;

printf("#Input Function\n");

for (i = 0; i< SIZE; i++)

printf("%d %f %f\n", i, in_buf[i][0], in_buf[i][1]);

printf("\n\n");

plan = fftw_plan_dft_1d(SIZE, in_buf, out_buf, FFTW_FORWARD, FFTW_ESTIMATE);

fftw_execute(plan);

const float rsize = 1.0f/sqrt((float)SIZE);

printf("#FFT by fftw\n");

for (i = 0; i< SIZE; i++)

printf("%d %f %f\n", i, out_buf[i][0] * rsize, out_buf[i][1] * rsize );

getch();

return 0;

}

すると コマンドプロンプトにそれっぽい値が出るはず

とりあえず 今回はこれで満足して

つぎは また例のページぱくりで グラフ出力!