使用图像对 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 开始索引,您必须 减去 指数中的 kn ,以便我们从 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