RIGHT:寄稿:東條遼平 * 1次元フーリエ変換の応用 [#s76c8e31] 2次元フーリエ変換は文字どおり2次元のものについてフーリエ変換を行うものです。例えば音声などのデータは1次元ですが、画像などは縦と横の2次元ですので、画像にフーリエ変換を適用するためには2次元フーリエ変換を使う必要があります。 といっても2次元フーリエ変換の実装はそんなに難しくなく、1次元フーリエ変換が完成していればそれを利用して簡単に作る事ができます。 #ref(img16.png,nolink) これを離散化し、変形したものが #ref(img17.png,nolink) となります。これは2次元のものをx軸方向に各行フーリエ変換し、その結果に対してy軸方向に各行フーリエ変換すればよいということです。 for(i=0; i<height; i++){ for(j=0; j<width; j++){ temp_re[j] = re[i*width + j]; temp_im[j] = im[i*width + j]; } dft_idft(temp_re, temp_im, width, flag); for(j=0; j<width; j++){ re[i*width + j] = temp_re[j]; im[i*width + j] = temp_im[j]; } } これは横方向にフーリエ変換しているものですが、この後同じように縦方向にもフーリエ変換をします。 2次元の場合も1次元と同じくフラグを使うことで逆フーリエ変換との分岐をしています。また、2次元もN/2だけシフトする必要がありますが、 x,y軸共にシフトすることになります。今回関数内でシフトしていませんので、呼び出しもとでシフトしてやります。ここでx、y軸共にシフトすると、画像の中心を原点に第一象限と第三象限、第二象限と第四象限を入れ換えればよいことになります。 ちなみに2次元フーリエ変換を大きいデータに適用すると大変処理に時間がかかります。そのため時間を短縮するために高速フーリエ変換というものがあるのですが、これはデータのサイズが2の累乗でなければいけないという制約があるために、時間はかかりますが通常のフーリエ変換にしています。 - &ref(main.c); - &ref(calculation.c); - &ref(calculation.h);