使用图像对 FFT 1D 进行 MATLAB 重建
MATLAB reconstruction of FFT 1D with an image
我正在尝试在 MATLAB 中重建 fft
函数。参考手册, fft 函数执行以下操作:
如果 X
是矩阵,则 fft(X)
将 X
的列视为向量,returns 对每一列进行傅立叶变换。
所以我在读取图像并将其转换为 double 后构建了一个临时选项卡,其中包含要计算的当前列。然后我 assemble 将结果放在一个新数组中(名为 FinalMatrix
)。 (顺便说一句,图像是 256x256 像素)
目前我得到以下代码,但输出看起来不像 MATLAB 中 fft
函数的输出。
A = imread('start.jpg','jpg');
Agray = rgb2gray(A);
x=double(Agray);
FourierMachine1 = fft(x);
FourierMachine2 =fft2(x);
figure;imshow(real(FourierMachine1));
figure;imshow(real(FourierMachine2));
[largeur,hauteur]= size(Agray);
FinalMatrix= zeros(largeur,hauteur);
X = zeros(largeur,1);
for k = 1: largeur
PremiereColonne= x(1:hauteur,k);
for n = 1:hauteur
X(k) = X(k) + PremiereColonne(n)*exp(-1i*pi/2*n*k);
end
FinalMatrix(1:hauteur,k)=X;
end
S=fftshift(FinalMatrix);
figure;imshow(real(S));
我究竟缺少什么?感谢您的任何建议。
主要问题是您没有正确计算每列的一维 DFT。您也没有正确迭代每一列。因此,您需要有一个额外的循环来遍历每一列,然后您将需要一对 nested for
循环。一个循环将控制在输出向量中写入位置的访问,另一个循环迭代单个列的每个样本。
此外,DFT 的指数项不正确。如果你还记得,DFT 的方程是:
(来源:alwayslearn.com)
这不是我在您的代码中看到的指数。此外,因为 MATLAB 从 1 开始索引,您必须 减去 指数中的 k
和 n
,以便我们从 0 开始,而不是从 1 ,根据 DFT 的定义。
通过这些更改,我们得到:
for k = 1: hauteur %// Change
X = zeros(largeur,1);
PremiereColonne = x(1:hauteur,k);
for y = 1 : largeur %// Change
for n = 1 : largeur %// Change
X(y) = X(y) + PremiereColonne(n)*exp(-1i*2*pi*(n-1)*(y-1)/largeur); %// Change
end
end
FinalMatrix(1:hauteur,k)=X;
end
这里有证明它有效的证据。让我们生成一个随机的 10 x 10 矩阵,随机种子设置为 123:
>> rng(123);
>> x = rand(10);
>> x
x =
0.6965 0.3432 0.6344 0.0921 0.6240 0.1206 0.6693 0.0957 0.3188 0.7050
0.2861 0.7290 0.8494 0.4337 0.1156 0.8263 0.5859 0.8853 0.6920 0.9954
0.2269 0.4386 0.7245 0.4309 0.3173 0.6031 0.6249 0.6272 0.5544 0.3559
0.5513 0.0597 0.6110 0.4937 0.4148 0.5451 0.6747 0.7234 0.3890 0.7625
0.7195 0.3980 0.7224 0.4258 0.8663 0.3428 0.8423 0.0161 0.9251 0.5932
0.4231 0.7380 0.3230 0.3123 0.2505 0.3041 0.0832 0.5944 0.8417 0.6917
0.9808 0.1825 0.3618 0.4264 0.4830 0.4170 0.7637 0.5568 0.3574 0.1511
0.6848 0.1755 0.2283 0.8934 0.9856 0.6813 0.2437 0.1590 0.0436 0.3989
0.4809 0.5316 0.2937 0.9442 0.5195 0.8755 0.1942 0.1531 0.3048 0.2409
0.3921 0.5318 0.6310 0.5018 0.6129 0.5104 0.5725 0.6955 0.3982 0.3435
使用这个,我得到这个作为你的结果矩阵:
>> FinalMatrix
FinalMatrix =
Columns 1 through 5
5.4420 + 0.0000i 4.1278 + 0.0000i 5.3795 + 0.0000i 4.9542 + 0.0000i 5.1894 + 0.0000i
-0.7167 + 0.5845i 0.3827 - 0.0441i 0.6872 - 1.1141i -0.1564 + 0.9087i -0.3029 + 0.8021i
0.2819 - 0.0768i 0.6751 + 0.0040i 0.2472 + 0.1070i -1.2778 + 0.1311i -0.2934 + 0.6208i
1.0166 + 0.1215i -1.1997 - 0.5153i 0.0443 - 0.0726i -0.2362 - 0.4714i 1.0213 - 0.3459i
-0.2040 - 0.2060i -0.0361 + 0.0325i -0.5435 + 0.1292i -0.1884 - 0.0683i -0.1153 + 0.8681i
0.7670 + 0.0000i -0.3402 - 0.0000i 0.0941 - 0.0000i -0.3156 - 0.0000i 0.4307 - 0.0000i
-0.2040 + 0.2060i -0.0361 - 0.0325i -0.5435 - 0.1292i -0.1884 + 0.0683i -0.1153 - 0.8681i
1.0166 - 0.1215i -1.1997 + 0.5153i 0.0443 + 0.0726i -0.2362 + 0.4714i 1.0213 + 0.3459i
0.2819 + 0.0768i 0.6751 - 0.0040i 0.2472 - 0.1070i -1.2778 - 0.1311i -0.2934 - 0.6208i
-0.7167 - 0.5845i 0.3827 + 0.0441i 0.6872 + 1.1141i -0.1564 - 0.9087i -0.3029 - 0.8021i
Columns 6 through 10
5.2262 + 0.0000i 5.2544 + 0.0000i 4.5066 + 0.0000i 4.8248 + 0.0000i 5.2380 + 0.0000i
0.3612 + 0.2466i 0.1933 - 0.8737i 0.2852 - 0.7816i -0.5467 - 1.0722i 0.3197 - 1.0983i
-1.1157 - 0.2910i 0.2011 + 0.0622i 0.0105 - 0.6416i 0.8486 + 0.3168i 0.6180 - 0.0535i
-0.5658 - 0.4700i 0.8047 + 0.4189i -0.7276 + 0.9442i -0.8086 - 0.4696i 0.2864 - 0.7590i
-0.4355 - 0.3588i -0.9470 + 0.0380i -0.5385 - 0.5152i -0.3600 + 0.0700i 0.2547 - 0.3598i
-0.5083 - 0.0000i 0.9345 + 0.0000i -1.6087 - 0.0000i 0.0961 - 0.0000i -1.1459 - 0.0000i
-0.4355 + 0.3588i -0.9470 - 0.0380i -0.5385 + 0.5152i -0.3600 - 0.0700i 0.2547 + 0.3598i
-0.5658 + 0.4700i 0.8047 - 0.4189i -0.7276 - 0.9442i -0.8086 + 0.4696i 0.2864 + 0.7590i
-1.1157 + 0.2910i 0.2011 - 0.0622i 0.0105 + 0.6416i 0.8486 - 0.3168i 0.6180 + 0.0535i
0.3612 - 0.2466i 0.1933 + 0.8737i 0.2852 + 0.7816i -0.5467 + 1.0722i 0.3197 + 1.0983i
使用 MATLAB 的 fft
函数验证,其中每一列都是单独处理的,我得到:
>> out = fft(x)
out =
Columns 1 through 5
5.4420 + 0.0000i 4.1278 + 0.0000i 5.3795 + 0.0000i 4.9542 + 0.0000i 5.1894 + 0.0000i
-0.7167 + 0.5845i 0.3827 - 0.0441i 0.6872 - 1.1141i -0.1564 + 0.9087i -0.3029 + 0.8021i
0.2819 - 0.0768i 0.6751 + 0.0040i 0.2472 + 0.1070i -1.2778 + 0.1311i -0.2934 + 0.6208i
1.0166 + 0.1215i -1.1997 - 0.5153i 0.0443 - 0.0726i -0.2362 - 0.4714i 1.0213 - 0.3459i
-0.2040 - 0.2060i -0.0361 + 0.0325i -0.5435 + 0.1292i -0.1884 - 0.0683i -0.1153 + 0.8681i
0.7670 + 0.0000i -0.3402 + 0.0000i 0.0941 + 0.0000i -0.3156 + 0.0000i 0.4307 + 0.0000i
-0.2040 + 0.2060i -0.0361 - 0.0325i -0.5435 - 0.1292i -0.1884 + 0.0683i -0.1153 - 0.8681i
1.0166 - 0.1215i -1.1997 + 0.5153i 0.0443 + 0.0726i -0.2362 + 0.4714i 1.0213 + 0.3459i
0.2819 + 0.0768i 0.6751 - 0.0040i 0.2472 - 0.1070i -1.2778 - 0.1311i -0.2934 - 0.6208i
-0.7167 - 0.5845i 0.3827 + 0.0441i 0.6872 + 1.1141i -0.1564 - 0.9087i -0.3029 - 0.8021i
Columns 6 through 10
5.2262 + 0.0000i 5.2544 + 0.0000i 4.5066 + 0.0000i 4.8248 + 0.0000i 5.2380 + 0.0000i
0.3612 + 0.2466i 0.1933 - 0.8737i 0.2852 - 0.7816i -0.5467 - 1.0722i 0.3197 - 1.0983i
-1.1157 - 0.2910i 0.2011 + 0.0622i 0.0105 - 0.6416i 0.8486 + 0.3168i 0.6180 - 0.0535i
-0.5658 - 0.4700i 0.8047 + 0.4189i -0.7276 + 0.9442i -0.8086 - 0.4696i 0.2864 - 0.7590i
-0.4355 - 0.3588i -0.9470 + 0.0380i -0.5385 - 0.5152i -0.3600 + 0.0700i 0.2547 - 0.3598i
-0.5083 + 0.0000i 0.9345 + 0.0000i -1.6087 + 0.0000i 0.0961 + 0.0000i -1.1459 + 0.0000i
-0.4355 + 0.3588i -0.9470 - 0.0380i -0.5385 + 0.5152i -0.3600 - 0.0700i 0.2547 + 0.3598i
-0.5658 + 0.4700i 0.8047 - 0.4189i -0.7276 - 0.9442i -0.8086 + 0.4696i 0.2864 + 0.7590i
-1.1157 + 0.2910i 0.2011 - 0.0622i 0.0105 + 0.6416i 0.8486 - 0.3168i 0.6180 + 0.0535i
0.3612 - 0.2466i 0.1933 + 0.8737i 0.2852 + 0.7816i -0.5467 + 1.0722i 0.3197 + 1.0983i
我们可以看到它们确实匹配。如果你 绝对 想要确定,让我们检查两个数组之间的每个元素,并显示它们的幅度差异小于某个阈值......比如说...... 1e-10
:
>> all(abs(FinalMatrix(:) - out(:)) < 1e-10)
ans =
1
我正在尝试在 MATLAB 中重建 fft
函数。参考手册, fft 函数执行以下操作:
如果 X
是矩阵,则 fft(X)
将 X
的列视为向量,returns 对每一列进行傅立叶变换。
所以我在读取图像并将其转换为 double 后构建了一个临时选项卡,其中包含要计算的当前列。然后我 assemble 将结果放在一个新数组中(名为 FinalMatrix
)。 (顺便说一句,图像是 256x256 像素)
目前我得到以下代码,但输出看起来不像 MATLAB 中 fft
函数的输出。
A = imread('start.jpg','jpg');
Agray = rgb2gray(A);
x=double(Agray);
FourierMachine1 = fft(x);
FourierMachine2 =fft2(x);
figure;imshow(real(FourierMachine1));
figure;imshow(real(FourierMachine2));
[largeur,hauteur]= size(Agray);
FinalMatrix= zeros(largeur,hauteur);
X = zeros(largeur,1);
for k = 1: largeur
PremiereColonne= x(1:hauteur,k);
for n = 1:hauteur
X(k) = X(k) + PremiereColonne(n)*exp(-1i*pi/2*n*k);
end
FinalMatrix(1:hauteur,k)=X;
end
S=fftshift(FinalMatrix);
figure;imshow(real(S));
我究竟缺少什么?感谢您的任何建议。
主要问题是您没有正确计算每列的一维 DFT。您也没有正确迭代每一列。因此,您需要有一个额外的循环来遍历每一列,然后您将需要一对 nested for
循环。一个循环将控制在输出向量中写入位置的访问,另一个循环迭代单个列的每个样本。
此外,DFT 的指数项不正确。如果你还记得,DFT 的方程是:
(来源:alwayslearn.com)
这不是我在您的代码中看到的指数。此外,因为 MATLAB 从 1 开始索引,您必须 减去 指数中的 k
和 n
,以便我们从 0 开始,而不是从 1 ,根据 DFT 的定义。
通过这些更改,我们得到:
for k = 1: hauteur %// Change
X = zeros(largeur,1);
PremiereColonne = x(1:hauteur,k);
for y = 1 : largeur %// Change
for n = 1 : largeur %// Change
X(y) = X(y) + PremiereColonne(n)*exp(-1i*2*pi*(n-1)*(y-1)/largeur); %// Change
end
end
FinalMatrix(1:hauteur,k)=X;
end
这里有证明它有效的证据。让我们生成一个随机的 10 x 10 矩阵,随机种子设置为 123:
>> rng(123);
>> x = rand(10);
>> x
x =
0.6965 0.3432 0.6344 0.0921 0.6240 0.1206 0.6693 0.0957 0.3188 0.7050
0.2861 0.7290 0.8494 0.4337 0.1156 0.8263 0.5859 0.8853 0.6920 0.9954
0.2269 0.4386 0.7245 0.4309 0.3173 0.6031 0.6249 0.6272 0.5544 0.3559
0.5513 0.0597 0.6110 0.4937 0.4148 0.5451 0.6747 0.7234 0.3890 0.7625
0.7195 0.3980 0.7224 0.4258 0.8663 0.3428 0.8423 0.0161 0.9251 0.5932
0.4231 0.7380 0.3230 0.3123 0.2505 0.3041 0.0832 0.5944 0.8417 0.6917
0.9808 0.1825 0.3618 0.4264 0.4830 0.4170 0.7637 0.5568 0.3574 0.1511
0.6848 0.1755 0.2283 0.8934 0.9856 0.6813 0.2437 0.1590 0.0436 0.3989
0.4809 0.5316 0.2937 0.9442 0.5195 0.8755 0.1942 0.1531 0.3048 0.2409
0.3921 0.5318 0.6310 0.5018 0.6129 0.5104 0.5725 0.6955 0.3982 0.3435
使用这个,我得到这个作为你的结果矩阵:
>> FinalMatrix
FinalMatrix =
Columns 1 through 5
5.4420 + 0.0000i 4.1278 + 0.0000i 5.3795 + 0.0000i 4.9542 + 0.0000i 5.1894 + 0.0000i
-0.7167 + 0.5845i 0.3827 - 0.0441i 0.6872 - 1.1141i -0.1564 + 0.9087i -0.3029 + 0.8021i
0.2819 - 0.0768i 0.6751 + 0.0040i 0.2472 + 0.1070i -1.2778 + 0.1311i -0.2934 + 0.6208i
1.0166 + 0.1215i -1.1997 - 0.5153i 0.0443 - 0.0726i -0.2362 - 0.4714i 1.0213 - 0.3459i
-0.2040 - 0.2060i -0.0361 + 0.0325i -0.5435 + 0.1292i -0.1884 - 0.0683i -0.1153 + 0.8681i
0.7670 + 0.0000i -0.3402 - 0.0000i 0.0941 - 0.0000i -0.3156 - 0.0000i 0.4307 - 0.0000i
-0.2040 + 0.2060i -0.0361 - 0.0325i -0.5435 - 0.1292i -0.1884 + 0.0683i -0.1153 - 0.8681i
1.0166 - 0.1215i -1.1997 + 0.5153i 0.0443 + 0.0726i -0.2362 + 0.4714i 1.0213 + 0.3459i
0.2819 + 0.0768i 0.6751 - 0.0040i 0.2472 - 0.1070i -1.2778 - 0.1311i -0.2934 - 0.6208i
-0.7167 - 0.5845i 0.3827 + 0.0441i 0.6872 + 1.1141i -0.1564 - 0.9087i -0.3029 - 0.8021i
Columns 6 through 10
5.2262 + 0.0000i 5.2544 + 0.0000i 4.5066 + 0.0000i 4.8248 + 0.0000i 5.2380 + 0.0000i
0.3612 + 0.2466i 0.1933 - 0.8737i 0.2852 - 0.7816i -0.5467 - 1.0722i 0.3197 - 1.0983i
-1.1157 - 0.2910i 0.2011 + 0.0622i 0.0105 - 0.6416i 0.8486 + 0.3168i 0.6180 - 0.0535i
-0.5658 - 0.4700i 0.8047 + 0.4189i -0.7276 + 0.9442i -0.8086 - 0.4696i 0.2864 - 0.7590i
-0.4355 - 0.3588i -0.9470 + 0.0380i -0.5385 - 0.5152i -0.3600 + 0.0700i 0.2547 - 0.3598i
-0.5083 - 0.0000i 0.9345 + 0.0000i -1.6087 - 0.0000i 0.0961 - 0.0000i -1.1459 - 0.0000i
-0.4355 + 0.3588i -0.9470 - 0.0380i -0.5385 + 0.5152i -0.3600 - 0.0700i 0.2547 + 0.3598i
-0.5658 + 0.4700i 0.8047 - 0.4189i -0.7276 - 0.9442i -0.8086 + 0.4696i 0.2864 + 0.7590i
-1.1157 + 0.2910i 0.2011 - 0.0622i 0.0105 + 0.6416i 0.8486 - 0.3168i 0.6180 + 0.0535i
0.3612 - 0.2466i 0.1933 + 0.8737i 0.2852 + 0.7816i -0.5467 + 1.0722i 0.3197 + 1.0983i
使用 MATLAB 的 fft
函数验证,其中每一列都是单独处理的,我得到:
>> out = fft(x)
out =
Columns 1 through 5
5.4420 + 0.0000i 4.1278 + 0.0000i 5.3795 + 0.0000i 4.9542 + 0.0000i 5.1894 + 0.0000i
-0.7167 + 0.5845i 0.3827 - 0.0441i 0.6872 - 1.1141i -0.1564 + 0.9087i -0.3029 + 0.8021i
0.2819 - 0.0768i 0.6751 + 0.0040i 0.2472 + 0.1070i -1.2778 + 0.1311i -0.2934 + 0.6208i
1.0166 + 0.1215i -1.1997 - 0.5153i 0.0443 - 0.0726i -0.2362 - 0.4714i 1.0213 - 0.3459i
-0.2040 - 0.2060i -0.0361 + 0.0325i -0.5435 + 0.1292i -0.1884 - 0.0683i -0.1153 + 0.8681i
0.7670 + 0.0000i -0.3402 + 0.0000i 0.0941 + 0.0000i -0.3156 + 0.0000i 0.4307 + 0.0000i
-0.2040 + 0.2060i -0.0361 - 0.0325i -0.5435 - 0.1292i -0.1884 + 0.0683i -0.1153 - 0.8681i
1.0166 - 0.1215i -1.1997 + 0.5153i 0.0443 + 0.0726i -0.2362 + 0.4714i 1.0213 + 0.3459i
0.2819 + 0.0768i 0.6751 - 0.0040i 0.2472 - 0.1070i -1.2778 - 0.1311i -0.2934 - 0.6208i
-0.7167 - 0.5845i 0.3827 + 0.0441i 0.6872 + 1.1141i -0.1564 - 0.9087i -0.3029 - 0.8021i
Columns 6 through 10
5.2262 + 0.0000i 5.2544 + 0.0000i 4.5066 + 0.0000i 4.8248 + 0.0000i 5.2380 + 0.0000i
0.3612 + 0.2466i 0.1933 - 0.8737i 0.2852 - 0.7816i -0.5467 - 1.0722i 0.3197 - 1.0983i
-1.1157 - 0.2910i 0.2011 + 0.0622i 0.0105 - 0.6416i 0.8486 + 0.3168i 0.6180 - 0.0535i
-0.5658 - 0.4700i 0.8047 + 0.4189i -0.7276 + 0.9442i -0.8086 - 0.4696i 0.2864 - 0.7590i
-0.4355 - 0.3588i -0.9470 + 0.0380i -0.5385 - 0.5152i -0.3600 + 0.0700i 0.2547 - 0.3598i
-0.5083 + 0.0000i 0.9345 + 0.0000i -1.6087 + 0.0000i 0.0961 + 0.0000i -1.1459 + 0.0000i
-0.4355 + 0.3588i -0.9470 - 0.0380i -0.5385 + 0.5152i -0.3600 - 0.0700i 0.2547 + 0.3598i
-0.5658 + 0.4700i 0.8047 - 0.4189i -0.7276 - 0.9442i -0.8086 + 0.4696i 0.2864 + 0.7590i
-1.1157 + 0.2910i 0.2011 - 0.0622i 0.0105 + 0.6416i 0.8486 - 0.3168i 0.6180 + 0.0535i
0.3612 - 0.2466i 0.1933 + 0.8737i 0.2852 + 0.7816i -0.5467 + 1.0722i 0.3197 + 1.0983i
我们可以看到它们确实匹配。如果你 绝对 想要确定,让我们检查两个数组之间的每个元素,并显示它们的幅度差异小于某个阈值......比如说...... 1e-10
:
>> all(abs(FinalMatrix(:) - out(:)) < 1e-10)
ans =
1