This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

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

Other Parts Discussed in Thread: FFTLIB
在网上和书上都看过一维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”的结果并不相同,是我理解错了吗?
  • 二维FFT的具体概念可以百度一下,根据你的描述,感觉在做行列翻转的时候应该是对输入数据a进行翻转,然后再做吧,个人感觉,纯属臆测。

    c = transpose(a);
  • 你好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));
    end
    cc = transpose(bb);
    for i=1:m
         dd(:,i) = fft(cc(:,i));
    end
    ee = transpose(dd);

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

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

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

    望回复!谢谢!

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

    //输入图像尺寸为32x32

    //每一行做一次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);

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

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

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

  • 感谢大哥,因为TI自带的fftlib 中fft2的库函数和连接器问题一直不能使用,无奈之下自己尝试实现了fft2,结果用cycle测试时间,发现绝大部分时间都用在翻转矩阵上了,矩阵越大这个问题越明显,看到你这里使用的DSPF_dp_mat_trans真的茅塞顿开,将运算量下降了近4倍,实在是帮了大忙,虽然您的回复已经过去5年,在这里致以谢意,希望您能看见。