2008年 8月 15日(金曜日) 06:17

FFTSSでFFTを実行するサンプルプログラム

評価:
(0 票)

FFTSSを使って実際にFFTの処理を行うサンプルプログラムを作成しました。

開発環境は、Windows + Cygwin + eclipse CDTです。

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)にピークが見られました。

最終更新日: 2011年 6月 27日(月曜日) 01:48
くらち たかよし

くらち たかよし

モバイル・Webアプリ作家。最近は主にiPhoneアプリ制作を手がける。企画から、UIデザイン、設計、実装、テスト、多言語対応、ユーザーサポートまでを1人〜数人の個人で行う全人的開発手法の確立を目指している。

使う言語はObjective-C, C++, C#, Java, PHPなど。Web関連で使うものはCakePHP, MySQL, Joomla! CMSなど。デザインはシロウトながらPhotoshopとIllustratorをなんとかがんばって使う。

場所や時間に縛られない、インターネット時代の新しい働き方、自由な生き方を模索中。海外移住、低予算&低リスク起業、キャリアデザイン、心理学などにも興味あり。

Web: awaresoft.jp/
このカテゴリの他の記事: « FFTライブラリ