代码之家  ›  专栏  ›  技术社区  ›  Pazu

尝试对长度幂为2的向量实现快速傅立叶变换

  •  0
  • Pazu  · 技术社区  · 7 年前

    如果操作正确,则应具有运行时间O(n log n)。

    function d = ffTU(f)
    
    n = [size(f)](1);
    
    if n==1
      d = f;
      return;
    
    else
    
      even=ffTU(f(2:2:end,:));
      odd =ffTU(f(1:2:end,:));
    
      for k=0:(n/2)-1
        T(k+1)= exp(-2i*pi*k/n)*odd(k+1);
    
      end
    
      for k=0:(n/2)-1
        d(k+1) = even(k+1) + T(k+1) + even(k+1) - T(k+1);
      end
    
    end
    

    我不断收到以下错误:

    error: ffTU: A(I): index out of bounds; value 2 out of bound 1
    error: called from
        ffTU at line 16 column 11
    

    我知道我必须调整函数的索引,但我认为我已经解决了这个问题。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Cris Luengo    7 年前

    预先分配 T 循环之前:

    T = zeros(n/2,1);
    

    或者更好的是,不使用循环计算它:

    k = (0:(n/2)-1).';
    T = exp(-2i*pi*k/n).*odd(:);
    

    你也应该这样做 d .

    您还需要测试输入的大小是否均匀。

    而不是

    n = [size(f)](1);
    

    n = size(f,1);
    

    但如果您的输入不是列向量,则会出现问题。用修复它

    f = f(:);
    n = size(f,1);
    

    你的计算中有一个错误 d 因为你把它设置为 2*even , T 未使用(如中所示 T-T==0 .