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

3
我有一个2048点FFT IP,如何使用它来计算512点FFT?
2个回答

3

有不同的方法可以实现这一点,但最简单的方法是将输入数据复制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))

非常惊奇的是这些值 完全 相等,没有因数字精度而出现差异的情况!

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的期望输出完全相同。

这也是正确的,而且比我的方法更简单易行。 - Cris Luengo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接