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あたりでピークが出ます。