離散フーリエ変換

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
s-rush

離散フーリエ変換

#1

投稿記事 by s-rush » 16年前

度々すいません。
大学の課題で、画像拡大のプログラムを作っているのですが、行き詰ってしまいました。
画像拡大そのもののプログラムは完成して、あとは画像向上のための処理なのですが、
その準備段階で、行き詰っています。

フーリエ変換を用いて、画像の向上を図るのですが、
ためしに1次元のフーリエ変換のプログラムなんですが、sin波を入れても
出力がすべて0になってしまいます。(±ありますが)

変換の式が間違えているのでしょうか?
申し訳ないですが、アドバイスお願いします。
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <math.h>

#define PI 3.14159265358979323846

int dft(double *re, double *im, int n)
{
	double *t_re, *t_im;
	int i, j;

	/*メモリ確保*/
	t_re = (double *)malloc(sizeof (double) *n);
	if(t_re == NULL){
		printf("malloc errer1\n");
		return -1;
	}
	t_im = (double *)malloc(sizeof (double) *n);
	if(t_im == NULL){
		printf("malloc errer2\n");
		return -1;
	}

	for(i=0; i<n; i++)
	{
		t_re = 0;
		t_im = 0;
	}

	/*フーリエ変換*/
	for(i=0; i<n; i++)
	{
		for(j=0; j<n; j++)
		{
			t_re += re*cos(2*PI*i*j/n)+im*sin(2*PI*i*j/n);
			t_im += -re*sin(2*PI*i*j/n)+im*cos(2*PI*i*j/n);
		}
	}

	for(i=0; i<n; i++)
	{
		re = t_re;
		im[i] = t_im[i];
	}

	/*メモリ解放*/
	free(t_re);
	free(t_im);

	return 0;
}



int main()
{
	double re[32], im[32];
	int i;
	for(i=0; i<32; i++)
	{
		re[i] = sin(2.0*PI*i/32);
		im[i] = 0;
		printf("%f\n", re[i]);
	}
	dft(re, im, 32);

	for(i=0; i<32; i++)
	{
		printf("re=%f im=%f\n", re[i], im[i]);
	}
	return 0;
}

s-rush

Re:離散フーリエ変換

#2

投稿記事 by s-rush » 16年前

追記です。

環境はVC++2008 EEです。

なぜかM_PIを使おうとすると、定義されていないとエラーが出てしまったので、
#defineでPIを定義しています。

御津凪

Re:離散フーリエ変換

#3

投稿記事 by 御津凪 » 16年前

試しにブレイクポイントやステップ実行で計算過程を確認してみてはどうでしょうか?
どこかで計算が狂っているかもしれません。
(フーリエ変換の式を知らない者なので、それしかいえません…)

> なぜかM_PIを使おうとすると、定義されていないとエラーが出てしまったので、

math.h をインクルードする前に _USE_MATH_DEFINES を定義しておくとマクロが定義されますよ。
詳しくは math.h を開いて見てください。

s-rush

Re:離散フーリエ変換

#4

投稿記事 by s-rush » 16年前

>>試しにブレイクポイントやステップ実行で計算過程を確認してみてはどうでしょうか?
一応ブレイクポイントで確認してみたのですが、やはり計算が途中でおかしいようなんです。
といってもほとんどが0になるので、本当にくるっているのかどうか怪しいところなんですが^^;

しかし、いろんなサイトを見回ったり、手計算で何度も計算式を導出したりしているので、
式は間違っていないと思うんです。

他にも、サイトで、フーリエ変換のプログラムを紹介されているところを見つけたので、
そのプログラムでの変換式をコピーして貼り付けたのですが
(変数は自分のプログラムに合わせて変更しました)
出力は変わらずすべてが0でした。


ちなみにそのサイトで紹介されていたプログラムを実行させたところ、
正常に動作してました。

なので、どこに問題があるのかがわからないです。

SCI

Re:離散フーリエ変換

#5

投稿記事 by SCI » 16年前

この部分
t_re += re[j]*cos(2*PI*i*j/n)+im[j]*sin(2*PI*i*j/n);
    t_im += -re[j]*sin(2*PI*i*j/n)+im[j]*cos(2*PI*i*j/n);
こうじゃないですか?

s-rush

Re:離散フーリエ変換

#6

投稿記事 by s-rush » 16年前

iではなくてjでした^^;
SCIさん、どうもありがとうございました。

今度はこのプログラムをもとにして、2次元のフーリエ変換を頑張ります。

閉鎖

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