• 締切済み

フーリェ変換

フーリェ変換の勉強をしているものです。フーリェ変換の関数はここ(http://www.kurims.kyoto-u.ac.jp/~ooura/fftman/ftmndl.html)からとってきた、fft.tgz (71 KB)と言うファイルの、dfst()を使いました。ですが、周波数440Hzのサイン波を作り、それをフーリェ変換したところ、どうしてもスペクトルが880Hzで最大になってしまいます。下記にそのコードを載せました。どうしてそうなってしまうのか 教えてください。それとなぜかセグメンテーション違反がでます・・・・(涙 ※ところどころ無駄なコードがありますが、気にしないで下さい。 //==================================================================はじまり //---------------------------------------------------------------- // fft4g.h ファイル void dfst(int,double *,double *,int *,double *); //---------------------------------------------------------------- // fft.c ファイル #include <float.h> #include <stdio.h> #include <math.h> #include <limits.h> #include <stdlib.h> #include "fft4g.h" #define BUFSIZE 4097 #define N 4097 // ↑ いつでも変えられるように int main(){ double total = 1, tt; double freq = 440.0; short buf[ BUFSIZE ]; int i; int cur_stream = 0; double a4 = 0; int ii = 0; //data length + 1  int n = N; //input/output  double *a = (double *)malloc(sizeof(double)*N + 100); //work table   const int a3 = (int)(N - 1);  double *t = (double *)malloc(sizeof(double)*a3 + 100);  const int a1 = (int)(2 + sqrt(N/4));  int *ip = (int *)malloc(sizeof(int)*a1 + 100);  const int a2 = (int)(N*(5/8) - 1);  double *w = (double *)malloc(sizeof(double)*a2 + 100); // ↑ + 100 は、予備。 if(a == NULL){printf("a\n");fflush(stdout);exit(1);} if(t == NULL){printf("t\n");fflush(stdout);exit(1);} if(ip == NULL){printf("ip\n");fflush(stdout);exit(1);} if(w == NULL){printf("w\n");fflush(stdout);exit(1);} /* 正弦波データ作成 */ for ( i = 0; i < BUFSIZE; i ++ ) { tt = ( total / BUFSIZE ) * i; buf[i] = (short)(SHRT_MAX * sin( 2.0 * 3.14159 * freq * tt )); } // dfstの仕様による ip[0] = 0; /* データ入力 */ for(i = 0;i < N;i++,cur_stream++){ a[i] = (double)buf[cur_stream]; } /* 変換 */ dfst(n, a, t, ip, w); /* 結果を見る */ for(i = 1;i < N - 1;i++){ if(a4 < a[i]){a4 = a[i];ii = i;} printf("\n[%d]-[%f]",i,a[i]); printf("\n[%d]--------[%f]",ii,a4); } printf("\n"); free(a); free(t); free(ip); free(w); return 0; } //============================================終わり

みんなの回答

  • sgwjn
  • ベストアンサー率70% (47/67)
回答No.1

一般的にフーリエ変換を行うと、実数部と虚数部で構成された複素数データが得られます。 お使いのdfst()では、実数部と虚数部を連結した元データの2倍のデータを返す仕様になっているのではないでしょうか? 試されたデータだと441Hzの前後ではおそらく符号が反転しただけの同一のデータが格納されていると思います。 実際に使うときは、1~440Hzまでで良いと思いますよ。 詳しくは↓などをお読みください。 http://www009.upp.so-net.ne.jp/hachinami/note004/index.htm

0-o
質問者

お礼

どうもありがとうございます。その通りでした。ですが、実際に返されている値の意味をよく見ると実数部と虚数部を連結したデータではなく、実数部と他のものの様に見えました。この値が何を示すかは、実際に自分で調べてみて、分からなかったらまた新しく質問させてもらうことにします。

関連するQ&A