問題
OpenCVのライブラリを利用して、以下のデータ(複素数列)に対し離散フーリエ変換を行い、
その結果を出力せよ。
(0,0),(0,0),(1,0),(1,0),
(1,0),(1,0),(0,0),(0,0)
→
OpenCV::離散フーリエ変換2 (2次元離散フーリエ変換)
答え
#include <cv.h>
#include <highgui.h>
#include <cstdio>
using namespace std;
float data[8][2] =
{
{0,0},
{0,0},
{1,0},
{1,0},
{1,0},
{1,0},
{0,0},
{0,0}
};
int main( int argc, char **argv)
{
CvMat f = cvMat (1,8, CV_32FC2, &data[0][0]);
for(int i = 0;i<16;i+=2)
printf("%f,%f \n",f.data.fl[i],f.data.fl[i+1]);
puts("------ DFT -------");
cvDFT(&f,&f,CV_DXT_FORWARD);
for(int i = 0;i<16;i+=2)
printf("%f,%f \n",f.data.fl[i],f.data.fl[i+1]);
return 0;
}
メモ
このプログラムは、1次元離散フーリエ変換。
CvMatは以下のような構造体
http://opencv.jp/opencv/document/opencvref_cxcore_...
よってデータのアクセスは、
f.data.fl[i] (←「構造体」の中にある「共用体のfloat型のデータ」にアクセス)
のようになる。
cvDFT関数
http://opencv.jp/opencv/document/opencvref_cxcore_...
※DFTを高速に計算するには、cvGetOptimalDFTSize()で最適なDFTのサイズを得るようだ。
http://opencv.jp/opencv/document/opencvref_cxcore_...