利用矩阵乘法在Matlab中实现了二维离散傅里叶变换。
我意识到这可以是一个可分离的操作,所以我正在为一维DFT创建一个矩阵,并将它与输入图像的列以及图像的行相乘。
然而,所得到的二维密度泛函的数值与利用MATLAB内建函数(即fft2
)计算的密度泛函有很大的差别。因此,当执行逆DFT重新创建图像时,结果图像不能正确地重新创建(即它与原始图像不相同,但如果使用fft2
函数,则是相同的)。
这是我写的代码。
%% 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
如果有人能指出任何有用的东西来编辑我的代码,或者指出我的理论理解中的一个缺陷,我将非常感激。
发布于 2015-04-02 01:48:21
好吧,你有一些错误我们需要修正.如果你想让它和fft2
的工作原理完全一样的话。
错误#1 -错误归一化因子
fft
和最终的fft2
在计算转换时没有规范化因子。在计算DFT矩阵的第一部分时,可以去掉该除法语句。另外,DFT矩阵的第一部分,在指数中,你需要除以信号的总长度,而不是减去1的长度。
错误#2 -完成DFT矩阵最后部分的电源操作是错误的
计算从1到0
.的meshgrid
,但是电源操作要求从开始。因此,在进行功率计算之前,需要将u
和x
减去1。
错误#3 - FFT在行和列中的应用
正如您已经注意到的,2D FFT是可分离的,可以首先在行上执行一维FFT,然后是列。不幸的是你做的手术是不正确的。post_dft
需要是转换的,因为您希望在列上应用最终的中间操作。
因此,对于上面提到的所有修复,您的更正代码是:
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
进行比较。
rng(123123);
in = rand(7);
out1 = myDFT(in);
out2 = fft2(in);
out1
包含修正后的自定义实现,而out2
包含fft2
算法的结果。我们得到:
>> 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
在我看来很好!
https://stackoverflow.com/questions/29315365
复制相似问题