Intel Integrated Performance Primitives(IPP) を使用したFFT

なんだかどこにも製品付属PDF以上のサンプルがなかったのと、苦労したあげくIPPの使用をあきらめられている方も見かけたので掲載。

Ipp64f src_re[4096], src_im[4096];
Ipp64f dst_re[4096], dst_im[4096];
Ipp64fc destr[4096];
IppsFFTSpec_C_64f* spec;
IppStatus st;
Ipp8u *buff;
int ncount, buffSize;
FILE* fp;
fopen_s(&fp, "data.csv", "wt");
for( ncount = 0; ncount < 4096; ncount++){
	src_re[ncount] = cos(2 * 3.14159265 * -1000 * 1/4096 * ncount) + cos(2 * 3.14159265 * 1000 * 1/4096 * ncount);
	src_im[ncount] = sin(2 * 3.14159265 * -1000 * 1/4096 * ncount) + sin(2 * 3.14159265 * 1000 * 1/4096 * ncount);
}
ippsFFTInitAlloc_C_64f( &spec, 12, IPP_FFT_DIV_FWD_BY_N, ippAlgHintAccurate);
ippsFFTGetBufSize_C_64f(spec, &buffSize);
buff = (Ipp8u*)malloc(sizeof(Ipp8u)*buffSize);
st = ippsFFTFwd_CToC_64f(src_re, src_im, dst_re, dst_im, spec, buff);
for(ncount = 0; ncount < 4096; ncount++){
	fprintf(fp, "%f,%f,%f\n", dst_re[ncount], dst_im[ncount], dst_re[ncount]*(dst_re[ncount])+dst_im[ncount]*(dst_im[ncount]));
}
ippsFFTFree_C_64f(spec);
free(buff);
fclose(fp);

VisualStudio2005上でCとしてこれでコンパイルできまする。
includeとlibraryのパス並びに依存ファイルの列挙は忘れずに。
<プロジェクトのプロパティーで構成の変更、includeはコンパイラー設定、libraryのパスと依存ファイルはリンカー設定です。

もちろんippcore.h、ipps.hやstdlib.hにmath.hも必要です。

手順としては、ソースデータの準備、作業用領域の確保ならびに出力データの形式(ノーマライズするか否か、精度と速度どっちを優先するか)の選択、そして肝心のFFTをしてCSV形式で実数、虚数、パワーを1行ずつ出力しています。この設定だと1000Hzと-1000Hzあたりでピークが出ます。