我有一个2048点FFT IP。如何使用它来计算512点FFT?
答案 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所需的输出相同。