FFT 始めました! part.1
こんばんわ 自称スーパーハカーアイドル ちはやです
ここ数年風邪ひいてない、オレバカ確定wwwww
ってつぶやいて、まわりから
「ちはやさん頭いいよ!10まで数えられるもん!」
って 慰めてもらった翌日
100年に一度の風邪をひきやがりましたよ! こんちくしょ~!
ってことで、今まで 部屋の中で、着る寝袋を着て 毛布にくるまって
妖怪寝袋星人になってましたよ
ってことで続き
この間の数式から(結局TeXよくわからんから Wikipedia画像w)
畳み込み
このあたり、実はわたし 算数得意じゃないからよくわからないんですよね。
積分が面積で シグマが合計で まぁ そんなレベルなのであります
なので フーリエ変換を基本から勉強せななーって。
まずは 習うより慣れろ!ってことで 有名なFFTライブラリ FFTW 導入しようと思います
今回は このサイト
さんを パク いや 参考にさせてもらいます!
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;
}
すると コマンドプロンプトにそれっぽい値が出るはず
とりあえず 今回はこれで満足して
つぎは また例のページぱくりで グラフ出力!