自己的快速傅立叶变换算法的实现不起作用

时间:2018-12-06 15:32:44

标签: matlab fft

我已经找到并定制了用于快速傅立叶变换的算法。算法如下:

function X = myFFT(x)
   %only works if N = 2^k
   N = numel(x);
   xp = x(1:2:end);
   xpp = x(2:2:end);
   if N>=8
      Xp = myFFT(xp);
      Xpp = myFFT(xpp);
      X = zeros(N,1);
      Wn = exp(-1i*2*pi.*((0:N/2-1)')/N);
      tmp = Wn .* Xpp;
      X = [(Xp + tmp);(Xp -tmp)];
   else
     switch N
       case 2
          X = [1 1;1 -1]*x;
       case 4
          X = [1 0 1 0; 0 1 0 -1i; 1 0 -1 0;0 1 0 1i]*[1 0 1 0;1 0 -1 0;0 1 0 1;0 1 0 -1]*x;
       otherwise
          error('N not correct.');
     end
   end
end

以上算法存储在名为myFFT的.m文件中。

我想将代码用于两个后续信号: h1 = sin(t2)且时间t2 = 0:1:255;

我以这种方式在另一个.m文件中调用myFFT函数:

x=h1;
X11 = myFFT(x);

但是它给了我这个错误:

Error using  * 
Inner matrix dimensions must agree.

Error in myFFT (line 18)
           X = [1 0 1 0; 0 1 0 -1i; 1 0 -1 0;0 1 0 1i]*[1 0 1 0;1 0 -1 0;0 1 0 1;0 1 0 -1]*x;

Error in myFFT (line 7)
    Xp = myFFT(xp);

Error in myFFT (line 7)
    Xp = myFFT(xp);

Error in myFFT (line 7)
    Xp = myFFT(xp);

Error in myFFT (line 7)
    Xp = myFFT(xp);

Error in myFFT (line 7)
    Xp = myFFT(xp);

Error in myFFT (line 7)
    Xp = myFFT(xp);

老实说,我不知道如何解决它。请你帮助我好吗? 提前非常感谢您!

1 个答案:

答案 0 :(得分:2)

问题是4x4乘以1x4矩阵。变量x需要转置。

   function X = myFFT(x)
       %only works if N = 2^k
       N = numel(x);
       xp = x(1:2:end);
       xpp = x(2:2:end);
       if N>=8
          Xp = myFFT(xp);
          Xpp = myFFT(xpp);
          X = zeros(N,1);
          Wn = exp(-1i*2*pi.*((0:N/2-1)')/N);
          tmp = Wn .* Xpp;
          X = [(Xp + tmp);(Xp -tmp)];
       else
         switch N
           case 2
              X = [1 1;1 -1]*x';
           case 4
              X = [1 0 1 0; 0 1 0 -1i; 1 0 -1 0;0 1 0 1i]*[1 0 1 0;1 0 -1 0;0 1 0 1;0 1 0 -1]*x';
           otherwise
              error('N not correct.');
         end
       end
    end

然后用

进行测试
t2 = 0:1:255;
myFFT(sin(t2));