【问题标题】:How to calculate 512 point FFT using 2048 point FFT hardware module如何使用 2048 点 FFT 硬件模块计算 512 点 FFT
【发布时间】:2019-02-09 22:58:23
【问题描述】:

我有一个 2048 点 FFT IP。如何使用它来计算 512 点 FFT?

【问题讨论】:

    标签: signal-processing fft


    【解决方案1】:

    有不同的方法可以做到这一点,但最简单的是将输入数据复制 4 次,以获得 2048 个样本的信号。请注意,可以将 DFT(这是 FFT 计算的内容)视为假设输入信号被无限复制。因此,我们只是为这个无限长的周期性信号提供了一个更大的“视图”。

    生成的 FFT 将有 512 个非零值,中间有零。每个非零值也将是 512 点 FFT 产生的四倍大,因为输入样本的数量是四倍(也就是说,如果通常应用归一化,则在正向变换和逆变换中的 1/N 归一化)。

    这是 MATLAB 中的原理证明:

    data = randn(1,512);
    
    ft = fft(data);         % 512-point FFT
    
    data = repmat(data,1,4);
    ft2 = fft(data);        % 2048-point FFT
    ft2 = ft2(1:4:end) / 4; % 512-point FFT
    
    assert(all(ft2==ft))
    

    (令人惊讶的是,这些值完全相等,在这种情况下,由于数值精度没有出现差异!)

    【讨论】:

      【解决方案2】:

      Cris Luengo 提供的不需要任何重新缩放的正确解决方案的替代解决方案是将数据用零填充到所需的 2048 个样本长度。然后,您可以通过读取每个 2048/512 = 4 输出(即 output[0]output[3]、... 在基于 0 的索引系统中)来获得结果。

      由于您提到使用硬件模块,这可以通过连接前 512 个输入引脚并将所有其他输入接地并读取每 4 个输出引脚(忽略所有其他输出引脚)在硬件中实现。

      请注意,这是有效的,因为零填充信号的 FFT 是原始信号 FFT 频域中的插值。在这种情况下,您不需要插值,因此您可以忽略它们。下面是一个使用 16 点模块计算 4 点 FFT 的示例(为了简洁起见,我减小了 FFT 的大小,但两者之间的比率保持为 4):

      x = [1,2,3,4]
      fft(x)
      ans> 10.+0.j,
           -2.+2.j,
           -2.+0.j,
           -2.-2.j
      
      x = [1,2,3,4,0,0,0,0,0,0,0,0,0,0,0,0]
      fft(x)
      ans> 10.+0.j,  6.499-6.582j, -0.414-7.242j, -4.051-2.438j,
           -2.+2.j,  1.808+1.804j,  2.414-1.242j, -0.257-2.3395j,
           -2.+0.j, -0.257+2.339j,  2.414+1.2426j, 1.808-1.8042j,
           -2.-2.j, -4.051+2.438j, -0.414+7.2426j, 6.499+6.5822j
      

      正如您在第二个输出中看到的,第一列(对应于输出 0、3、7 和 11)与第一个较小尺寸 FFT 的所需输出相同。

      【讨论】:

      • 这也是正确的,并且比我的方法更易于实现。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多