1. eclipseでC++プロジェクトを作成
eclipseのProject Explorerのコンテキストメニューから、New > Project > C++ ProjectでC++プロジェクトを作成。
2. fftssライブラリの指定
作成したプロジェクトのプロパティを開き、C/C++ Build > Settings > Tool settings > Cygwin C++ Linker > Librariesを選び、Libraries (-l)に"fftss"("libfftss.a"の"lib"と".a"をとったもの)を指定。
※インクルードパス、ライブラリパスの設定
デフォルトで指定されたインクルードパス、ライブラリパス以外の場所にヘッダファイルやライブラリファイルを配置した場合は、作成したプロジェクトのプロパティを開き、C/C++ Build > Settings > Tool settings > Cygwin C++ Comiler > Directoriesで、Include path (-I)にFFTSSのヘッダファイルがある場所を指定する必要があります。(私の場合はデフォルトのパスc:cygwinusrlocalinclude, C:cygwinusrlocallibに配置されたので必要ありませんでした。)
これで開発環境は整いました。次に、簡単なサンプルプログラムを作成して実際にFFTの処理をしてみました。
3. サンプルプログラムの作成
#include <stdio.h>
#include <math.h>
#include "fftss.h"
int main(int argc, char* argv[]) {
double f = 64.0; // Frequency of input wave
int n = 256; // Number of samples
FILE* outFile;
FILE* inFile;
fftss_plan plan;
double *inData;
double *outData;
inData = (double *)fftss_malloc(sizeof(double) * 2 * n);
outData = (double *)fftss_malloc(sizeof(double) * 2 * n);
// Create input data (sine wave)
for (int i = 0; i < n; i++) {
double t = 1.0 / n * i;
// Real part
inData[2 * i] = sin(2 * M_PI * f * t);
// Imaginary part
inData[2 * i + 1] = 0;
// Initialize output buffer
outData[2 * i] = 0;
outData[2 * i + 1] = 0;
}
// Execute FFT
plan = fftss_plan_dft_1d(n, inData, outData, FFTSS_FORWARD,
FFTSS_MEASURE | FFTSS_PRESERVE_INPUT);
fftss_execute(plan);
// Output the results
inFile = fopen("input.txt", "w");
outFile = fopen("output.txt", "w");
if (inFile != NULL && outFile != NULL) {
for (int i = 0; i < n; i++) {
fprintf(inFile, "%f + %fi ", inData[2 * i], inData[2 * i + 1]);
fprintf(outFile, "%f + %fi ", outData[2 * i], outData[2 * i + 1]);
}
fclose(inFile);
fclose(outFile);
} else {
printf("Error in opening files. ");
return 1;
}
return 0;
}
このプログラムでは、入力信号として周波数64Hzのサイン波を1秒分、サンプリング周波数256Hzで作成し、FFTした結果をoutput.txtというテキストファイルに出力しています。入力信号の値も確認のためにinput.txtに出力しています。
ポイントは、
- 入力信号はdoubleの配列で、「実部, 虚部, 実部, 虚部...」の順 (20-30行目)
- プランを作成するときに、最後の引数のフラグにFFTSS_PRESERVE_INPUTを追加する。これを追加しないとプランを作成する際に入力信号inDataの値がめちゃくちゃに破壊されてしまいます。これでかなり苦労しました。(33-34行目)
結果は、期待通り全体(256Hz)の1/4(64Hz)と3/4(192Hz)にピークが見られました。





