首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >二维离散傅里叶变换在MATLAB中的实现

二维离散傅里叶变换在MATLAB中的实现
EN

Stack Overflow用户
提问于 2015-03-28 09:01:02
回答 1查看 5.2K关注 0票数 2

利用矩阵乘法在Matlab中实现了二维离散傅里叶变换。

我意识到这可以是一个可分离的操作,所以我正在为一维DFT创建一个矩阵,并将它与输入图像的列以及图像的行相乘。

然而,所得到的二维密度泛函的数值与利用MATLAB内建函数(即fft2)计算的密度泛函有很大的差别。因此,当执行逆DFT重新创建图像时,结果图像不能正确地重新创建(即它与原始图像不相同,但如果使用fft2函数,则是相同的)。

这是我写的代码。

代码语言:javascript
运行
复制
%% signal is a matrix of MxN size
function res=myDFT(signal)
    signal=double(signal);

    l=size(signal,1);   
    x=[1:l];

    %% u and x are matrices of MxM size
    [x u]=meshgrid(x,x);
    M1=l-1;

    pre_dft=exp(1i*(-2*pi)./M1)/sqrt(M1);

    pre_dft=(pre_dft.^(u.*x));

    %the below matrix will be multiplied with the rows of the signal
    post_dft=pre_dft;        

    % res is the resultant DFT of the signal matrix
    % 1D DFT matrix is first multiplied with columns and then the    
    % rows of signal matrix

    res=pre_dft*signal*post_dft;
end 

如果有人能指出任何有用的东西来编辑我的代码,或者指出我的理论理解中的一个缺陷,我将非常感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-02 01:48:21

好吧,你有一些错误我们需要修正.如果你想让它和fft2的工作原理完全一样的话。

错误#1 -错误归一化因子

fft和最终的fft2在计算转换时没有规范化因子。在计算DFT矩阵的第一部分时,可以去掉该除法语句。另外,DFT矩阵的第一部分,在指数中,你需要除以信号的总长度,而不是减去1的长度。

错误#2 -完成DFT矩阵最后部分的电源操作是错误的

计算从1到0.的meshgrid,但是电源操作要求从开始。因此,在进行功率计算之前,需要将ux减去1。

错误#3 - FFT在行和列中的应用

正如您已经注意到的,2D FFT是可分离的,可以首先在行上执行一维FFT,然后是列。不幸的是你做的手术是不正确的。post_dft需要是转换的,因为您希望在列上应用最终的中间操作。

因此,对于上面提到的所有修复,您的更正代码是:

代码语言:javascript
运行
复制
function res=myDFT(signal)
    signal=double(signal);

    l=size(signal,1);   
    x=[1:l];

    [x, u]=meshgrid(x,x);

    %// Error #1
    pre_dft=exp(1i*(-2*pi)./l); %// Change

    %// Error #2
    pre_dft=(pre_dft.^((u-1).*(x-1))); %// Change

    %// Error #3
    post_dft = pre_dft.'; %// Change

    res = pre_dft*signal*post_dft;
end

用一些随机数据测试上述数据,并与fft2进行比较。

代码语言:javascript
运行
复制
rng(123123);
in = rand(7);
out1 = myDFT(in);
out2 = fft2(in);

out1包含修正后的自定义实现,而out2包含fft2算法的结果。我们得到:

代码语言:javascript
运行
复制
>> out1

out1 =

  Columns 1 through 4

  26.2182 + 0.0000i  -1.3805 + 1.0956i   2.2881 - 0.4435i  -0.8005 + 1.5133i
  -1.3067 + 0.3236i  -0.5703 - 1.3884i  -0.7127 + 0.1303i   3.2689 - 0.5995i
  -0.6136 - 2.0731i  -0.2776 + 1.2926i   0.1587 - 1.4504i  -0.5305 + 1.4018i
  -3.0703 + 0.3715i  -1.5094 - 0.0216i   0.2573 - 3.2934i  -1.1100 + 1.4180i
  -3.0703 - 0.3715i  -0.9940 + 0.1328i   1.7269 + 0.2915i   0.2814 + 2.2212i
  -0.6136 + 2.0731i   1.8351 + 1.0629i   1.2891 + 1.7418i   0.4402 + 1.8756i
  -1.3067 - 0.3236i  -0.4974 - 0.9678i  -2.2419 + 2.0839i  -1.6844 + 0.9781i

  Columns 5 through 7

  -0.8005 - 1.5133i   2.2881 + 0.4435i  -1.3805 - 1.0956i
  -1.6844 - 0.9781i  -2.2419 - 2.0839i  -0.4974 + 0.9678i
   0.4402 - 1.8756i   1.2891 - 1.7418i   1.8351 - 1.0629i
   0.2814 - 2.2212i   1.7269 - 0.2915i  -0.9940 - 0.1328i
  -1.1100 - 1.4180i   0.2573 + 3.2934i  -1.5094 + 0.0216i
  -0.5305 - 1.4018i   0.1587 + 1.4504i  -0.2776 - 1.2926i
   3.2689 + 0.5995i  -0.7127 - 0.1303i  -0.5703 + 1.3884i

>> out2

out2 =

  Columns 1 through 4

  26.2182 + 0.0000i  -1.3805 + 1.0956i   2.2881 - 0.4435i  -0.8005 + 1.5133i
  -1.3067 + 0.3236i  -0.5703 - 1.3884i  -0.7127 + 0.1303i   3.2689 - 0.5995i
  -0.6136 - 2.0731i  -0.2776 + 1.2926i   0.1587 - 1.4504i  -0.5305 + 1.4018i
  -3.0703 + 0.3715i  -1.5094 - 0.0216i   0.2573 - 3.2934i  -1.1100 + 1.4180i
  -3.0703 - 0.3715i  -0.9940 + 0.1328i   1.7269 + 0.2915i   0.2814 + 2.2212i
  -0.6136 + 2.0731i   1.8351 + 1.0629i   1.2891 + 1.7418i   0.4402 + 1.8756i
  -1.3067 - 0.3236i  -0.4974 - 0.9678i  -2.2419 + 2.0839i  -1.6844 + 0.9781i

  Columns 5 through 7

  -0.8005 - 1.5133i   2.2881 + 0.4435i  -1.3805 - 1.0956i
  -1.6844 - 0.9781i  -2.2419 - 2.0839i  -0.4974 + 0.9678i
   0.4402 - 1.8756i   1.2891 - 1.7418i   1.8351 - 1.0629i
   0.2814 - 2.2212i   1.7269 - 0.2915i  -0.9940 - 0.1328i
  -1.1100 - 1.4180i   0.2573 + 3.2934i  -1.5094 + 0.0216i
  -0.5305 - 1.4018i   0.1587 + 1.4504i  -0.2776 - 1.2926i
   3.2689 + 0.5995i  -0.7127 - 0.1303i  -0.5703 + 1.3884i

在我看来很好!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29315365

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档