TI中文支持网
TI专业的中文技术问题搜集分享网站

关于一维FFT 与 二维FFT的关系转换

在网上和书上都看过一维FFT与二维FFT的关系,二维FFT相当于每一行做一维FFT后再每一列做一维FFT,可是我用MATLAB实现了一下,发现结果并不相同,代码如下:
clc;
close all;
clear all;

%生成一个32x32的单位矩阵
a = eye(32);
[m,n]=size(a);

%每一行分别做一维FFT
for i=1:m
b(i,:) = fft(a(i,:));
end
%行列翻转
c = transpose(b);
%每一行分别做一维FFT(由于翻转了,此时相当于每一列分别做一维FFT)
for i=1:m
d(i,:) = fft(c(i,:));
end
%行列翻转
e = transpose(d);

afft = fft2(a);

可以出来的"e" 和 “afft”的结果并不相同,是我理解错了吗?
Andy Yin1:

二维FFT的具体概念可以百度一下,根据你的描述,感觉在做行列翻转的时候应该是对输入数据a进行翻转,然后再做吧,个人感觉,纯属臆测。

c = transpose(a);

jimmy cui:

回复 Andy Yin1:

你好Andy Yin1:

根据这两天的测测,以下三段MATLAB代码的二维FFT输出结果是完全相同的,其中"a"为输入图像

方法一:

f = fft(fft(a).').';

方法二:

b = fft(a);c = transpose(b);d = fft(c);e = transpose(d);

方法三:

afft = fft2(a);

但是,如果我将方法展开成

[m,n]=size(a);

for i=1:n     bb(:,i) = fft(a(:,i));endcc = transpose(bb);for i=1:m     dd(:,i) = fft(cc(:,i));endee = transpose(dd);

在这种方法下如果a的尺寸为32×32,64×64,128×128时输出结果跟前三种方法输出结果不同,而尺寸为8×8,16×16,256×256,512×512,1024×1024时输出结果跟前三种方法的输出结果是完全一样的,这果甚是不解!

归根到底,我验证这个方法只是为了清楚理解FFT的1D和2D之间的关系,以便在DSP上实现1DFFT算法实现图像的2DFFT处理(因为,实不相瞒,我的确看不懂TI提供的fftlib中的2DFFT算法是如何使用的,只好想办法用1D转2D 了)

Andy Yin1 您是DSP的资深玩家,现在姑且先不纠结MATLAB的实验结果为何不相同了,我只想Andy Yin1 您指点一条明路,如何实现图像的FFT!

望回复!谢谢!

jimmy cui:

回复 Andy Yin1:

下面是我用DSPLIB中的DSPF_sp_fftSPxSP算法(1DFFT) 实现2DFFT 的代码

//输入图像尺寸为32×32

//每一行做一次1DFFT for (i=0; i<32; i++) { DSPF_sp_fftSPxSP(32, (float *)target2buffer + i*64, w_sp, (float *)target3buffer + i*64, brev, 4, 0, 32); } //行列翻转 (由于每一个点都是复数,包含实部和虚部,实部和虚部都是float格式,所以每一个点都当相一个double来做行列翻转) DSPF_dp_mat_trans((double *)target3buffer, 32, 32, (double *)target2buffer); //翻转后,每一行做一次1DFFT(相当于每一列做一个1DFFT) for (i=0; i<32; i++) { DSPF_sp_fftSPxSP(32, (float *)target2buffer + i*64, w_sp, (float *)target3buffer + i*64, brev, 4, 0, 32); } //行列翻转 (由于每一个点都是复数,包含实部和虚部,实部和虚部都是float格式,所以每一个点都当相一个double来做行列翻转) DSPF_dp_mat_trans((double *)target3buffer, 32, 32, (double *)target2buffer);

Elory Du:

回复 jimmy cui:

你好,我最近也在研究图像的fft2d变换,想把它应用到dsp平台下。现在是一头雾水,想向您请教一下。我的联系方式是QQ是416758648。谢谢您

lun he2:

回复 jimmy cui:

你好,很简单,你的系数设置错误,你的行宽是32的话,参数中4要改成2;只有行宽是4的幂次方,4的那个形参位置才能设置为4.

lun he2:

回复 Andy Yin1:

行列翻转的时候应该对中间结果数组b进行翻转。

赞(0)
未经允许不得转载:TI中文支持网 » 关于一维FFT 与 二维FFT的关系转换
分享到: 更多 (0)