如何使用2048点FFT硬件模块计算512点FFT

时间:2019-02-09 22:58:24

标签: signal-processing fft

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

2 个答案:

答案 0 :(得分:3)

有多种方法可以完成此操作,但是最简单的方法是将输入数据复制4次,以获得2048个样本的信号。请注意,DFT(这是FFT计算的)可以看作是假设输入信号被无限复制。因此,我们只是提供了这个无限长的周期性信号的更大“视图”。

所得的FFT将具有512个非零值,中间为零。每个非零值也将是产生512点FFT的四倍,因为输入样本的数量是四倍(即,如果通常使用归一化,而在正向变换和逆变换中的1 / N归一化。

这是MATLAB中的原理证明:

Serial.write("ON\n")

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

答案 1 :(得分:1)

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

由于您提到了使用硬件模块,因此可以通过将前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所需的输出相同。