フーリエ変換について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
wagunar
記事: 1
登録日時: 5年前

フーリエ変換について

#1

投稿記事 by wagunar » 5年前

コード:

 

#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <math.h>
#define PI 3.14159265358979

#define N 512 

#define M 9 /*ビット数*/

int dsize;
double x[N];
double y[N];
double z[N];
double wx[N], wy[N];
double datai[N];


void fft(void)
{
	
	double xx, xy;
	int i, ii, il, j, jj, k, l, l2, nv2;
	double z;
	nv2 = N / 2;

	j = 0;

	for (i = 0; i < N - 1; i++){
		if (i < j){
			z = y[j]; y[j] = y[i];  y[j] = z;
			z = datai[j];  datai[j] = datai[i];  datai[j] = z;
		}
		k = nv2;
		if (k < j + 1) do{ j = j - k; k = k / 2; } while (k < j + 1);
		j = j + k;
	}/*ビット反転*/
	
	for (i = 1; i <= M; i++){

		l = 1;
		l = l << i;
		l2 = l / 2;
		jj = 0;
		ii = N / l;
		for (j = 0; j < l2; j++){
			for (k = j; k < N; k = k + l){
				il = k + l2;
				xx = y[il] * wx[jj] - datai[il] * wy[jj];
				xy = datai[il] * wx[jj] + y[il] * wy[jj];
				y[il] = y[k] - xx;
				datai[il] = datai[k] - xy;
				y[k] = y[k] + xx;
				datai[k]= datai[k] + xy;
			}
			jj = jj + ii;
		}
	}/*バタフライ演算*/

}

int main(void){
	double wstep;
	int i;
	wstep = -2.0 * PI/(N*0.01);

	for (i = 0; i < N; i++){
		wx[i] = cos((N/2*0.01-x[i])*wstep);
		wy[i] = sin((N / 2 * 0.01 - x[i])*wstep);/*三角関数の値格納*/
		datai[i] = 0.0;/*虚数部分 0*/
	}
	fft();
	for (i = 0; i < N; i++){
		z[i] = (datai[i] * datai[i] + y[i] * y[i])/(N*N);
	}
	_getch();
	return 0;
}

プログラム初心者でVisual Studio Express 2013を用いてやってます.
ファイルを読み込んで配列x{i}にtの値,配列yにYの値を代入して高速フーリエ変換をしたのですが,少し違うようでわからない有様です.一応printfにてtとYの値が配列x,yに格納されるのは確認できました.恐らく刻み時間か三角関数の扱いが悪いのだと思いますがどうすれば直るでしょうか
添付ファイル
file.csv
FFT1を読み込んで上記プログラムでやってみた結果
(17.3 KiB) ダウンロード数: 47 回
FFT1.csv
読み込むデータ
(9.07 KiB) ダウンロード数: 46 回

“C言語何でも質問掲示板” へ戻る