GSL の FFT に関する機能について,一部分を紹介する.
GNU Scientific Library -- Reference Manual の 15 章 「Fast Fourier Transforms (FFTs)」
Windows での GSL のインストール(ソースコードを使用)(MSYS2,configure,make を利用): 別ページ »で説明
【要点】
gsl_fft_real_transform の出力である半複素数列を, 一般的な複素数配列に変換するには,次の関数を使う
int gsl_fft_halfcomplex_unpack (const double halfcomplex_coefficient [], gsl_complex_packed_array complex_coefficient, size_t stride, size_t n)データ長 N = 5 半複素数列
#include<gsl/gsl_fft_real.h> #include<gsl/gsl_fft_halfcomplex.h>
スタートメニューで,「MSYS2」の下の「MSYS2 MINGW64」を選ぶ.
#include<stdio.h> #include<math.h> #include<gsl/gsl_fft_real.h> #include<gsl/gsl_fft_halfcomplex.h> #define N 18 int main (int argc, char **argv) { int i; double data[N]; gsl_fft_real_wavetable * real; gsl_fft_halfcomplex_wavetable * hc; gsl_fft_real_workspace * w; data[0] = 0.0; data[1] = 0.0; data[2] = 0.0; data[3] = 0.0; data[4] = 0.0; data[5] = 0.0; data[6] = 1.0; data[7] = 1.0; data[8] = 1.0; data[9] = 1.0; data[10] = 1.0; data[11] = 1.0; data[12] = 0.0; data[13] = 0.0; data[14] = 0.0; data[15] = 0.0; data[16] = 0.0; data[17] = 0.0; /* 元データの表示 */ for (i = 0; i < N; i++) { printf ("%d: %e\n", i, data[i]); } w = gsl_fft_real_workspace_alloc(N); real = gsl_fft_real_wavetable_alloc(N); gsl_fft_real_transform (data, /* stride */ 1, N, real, w); gsl_fft_real_wavetable_free (real); /* 変換結果の表示 */ for (i = 0; i < N; i++) { printf ("%d: %e\n", i, data[i]); } hc = gsl_fft_halfcomplex_wavetable_alloc(N); gsl_fft_halfcomplex_inverse (data, 1, N, hc, w); gsl_fft_halfcomplex_wavetable_free(hc); /* 逆変換結果の表示 */ for (i = 0; i < N; i++) { printf ("%d: %e\n", i, data[i]); } gsl_fft_real_workspace_free (w); return 0; }
gcc -I"C:\gsl\include" -c -o a.o a.c gcc -L"C:\gsl\lib" -o a.exe a.o -lgsl -lgslcblas ./a.exe
長さ N の実数データの FFT のための作業領域の確保
gsl_fft_real_workspace *w = gsl_fft_real_workspace_alloc(N);
gsl_fft_real_wavetable *real = gsl_fft_real_wavetable_alloc(N);
gsl_fft_halfcomplex_wavetable *hc = = gsl_fft_halfcomplex_wavetable_alloc(N);
作業領域 w, 波形表 real,波形データ data,長さ N,とび数(stride) が1.
gsl_fft_real_transform(data, 1, N, real, w);
作業領域 w, 波形表 hc,波形データ data,長さ N,とび数(stride) が1.
gsl_fft_halfcomplex_inverse(data, 1, N, hc, w);
gsl_fft_real_wavetable_free(r);
gsl_fft_halfcomplex_wavetable_free(hc);
gsl_fft_real_workspace_free(w);