頭と尻尾はくれてやる!

パソコンおやじのiPhoneアプリ・サイト作成・運営日記


iOSでPOCに挑戦(3) 画像のデータを配列に入れる

頭と尻尾はくれてやる! iOSでPOCに挑戦(2) フーリエ変換その前に
の続きだよ。

vDSP_fft2d_zipというFFT処理するのに必要な引数の二つ目のDSPSplitComplexというモノについてだけど、これはリファレンスを見るとこうあるんだ。
struct DSPSplitComplex {
   float *realp;
   float *imagp;
};
ということでfloat型の実部と虚部の配列を持つ構造体ってことだよね。実部とか虚部なんて聞くとおしりがむずむずしてきそうだけど、ここに画像データを入れておく必要があるんだ。

じゃあ画像データってどういうのを用意すりゃいいんだろう?ってことになるよね。
iPhoneなどのデバイスにあるカメラを使うなら画像データのポインタは得られるからそこから白黒画像(にするかどうかは開発者次第)の輝度を持つ配列を作ればいいし、UIImageオブジェクトがあるならそこから輝度データを得ればいい。
ともかくなんらかの方法で得た輝度データが
float brArray[256*256];
に入っていることにしよう。どうせ0から255ならunsined charでええやんか、だって?うん、そのとおりなんだけど、まあ細かいことは気にせずに、、、ね。

輝度データを最初のDSPSplitComplexに入れるんだけど、実部と虚部二つあるけどどうすんのよ?って感じだけど虚部には入れなくてよくてゼロクリアだけしておく。ゼロを入れておかないとおかしくなることがあるよ。

ということでコードはこんな感じで。
{
    //メモリ確保
    DSPSplitComplex splitComplex;
    splitComplex.realp = calloc(nData, sizeof(float));
    splitComplex.imagp = calloc(nData, sizeof(float));
    
    //データのコピー
    memcpy(splitComplex.realp, brArray, nData*sizeof(float));
}
ここにはないけどnDataは256 x 256ね。
callocはゼロクリアしてくれるから、これで両方に必要なデータが入ったね、めでたしめでたし。callocでメモリ確保したから不要になったらfreeでメモリ解放が必要だよ。

残りの必要な引数の三つ目、、、えーっとどこまで行ったっけ?
void vDSP_fft2d_zip (
   FFTSetup __vDSP_setup,
   DSPSplitComplex *__vDSP_ioData,
   vDSP_Stride __vDSP_strideInRow,
   vDSP_Stride __vDSP_strideInCol,
   vDSP_Length __vDSP_log2nInCol,
   vDSP_Length __vDSP_log2nInRow,
   FFTDirection __vDSP_direction
);
↑これね、この三つ目と四つ目。
vDSPのリファレンスを読んでるとよくこのstrideってのが出てくるんだ。配列を順に読むなら1でいいし、一つとばしでいくなら2を指定するようになってる。
変数名からわかるようにrowとcolの両方があるんだけど、今回は配列を順番に読めばいいので1,0と指定する。これで先頭から一つずつ読んでくれる。

引数の五つ目、六つ目はサイズ指定だ。2の何乗かを示す数字、ここでは256 = 2^8なのでcol,rowとも8を入れればOK。

最後の引数はFFTするのか逆FFTするのかを指定するんだけど、ここでは普通のFFTなのでFFT_FORWARDって定数を指定する。ちなみに逆FFTの場合はFFT_INVERSEって定数があるんだ。

ふー、長くなったので今回はここまで!



<< サマータイムがある所で不具合発生してた   TopPage  RunKeeperと契約してないiPhoneでジョギング記録 >>

コメント


管理者にだけ表示を許可する
 

トラックバック

トラックバックURL
http://ringsbell.blog117.fc2.com/tb.php/732-c1238e5b




Copyright ©頭と尻尾はくれてやる!. Powered by FC2 Blog. Template by eriraha.

FC2Ad