什么可能导致 FPGA 实现的 FFT 和 numpy.fft.rfft 之间的相位差

信息处理 fft 傅里叶变换
2022-02-14 20:50:43

我们有一个 FPGA 系统,它从 ADC 获取输入并计算 FFT。系统识别我们感兴趣的频率的位置,并将这些箱中的系数发送到我的软件。除了系数之外,我还收到了时间序列数据

当硬件人员在硬件上工作时,我开发了额外的信号处理代码。为了进行测试和开发,我编写了一些代码来合成我希望从硬件接收到的信号,并且效果很好。不出所料,现在我有实时数据没有任何效果。

在调试问题的过程中,我正在获取真实世界的时间序列数据并np.numpy.fft.rfft用于查看频谱。当我绘制频谱时,我会在正确的 FFT 箱中看到我们感兴趣的频率。我将 PSD 和 Python 的 FFT 标准化,硬件 FFT 匹配得很好。我看到的问题是系数的相位不匹配。阶段的差异看起来并不有序。(只看图中的相位差)。

当我使用 FPGA 提供的时间序列(这是真实世界的数据)计算 FFT 时,numpy.fft.rfft我希望我感兴趣的频率处的系数与 FPGA FFT 计算的系数具有相同的相位,后者在相同的条件下运行时间序列。

有谁知道什么可能导致相同真实世界时间序列数据上的 FFT 具有不同的系数相位?

谢谢

贾斯汀

2个回答

您已经在 Numpty (Python) 中模拟了 FFT,并且您已经在 FPGA 中实现了 FFT,大概使用了 FPGA 供应商(Xilinx、Altera 等)的 FFT 内核,对吗?

这是你应该做的:

1 - 制作一个 FPGA 仿真,也就是一个测试平台,您可以用 VHDL、Verilog、SystemVerilog 编写它来测试 FFT 内核。使用与 Python 中相同的输入。

2 - 将 FPGA 测试台的结果与 Python 结果进行比较。确保它们匹配,如果它们不匹配,那么在现实生活中测试它是没有意义的。

根据您的 FFT 内核,有很多选项,例如缩放、bin 输出顺序等。您需要在 Python 代码中对这些 FPGA 选项进行建模,否则您会比较苹果和橙子,或者更准确地说是红苹果和绿苹果。

编辑 :

一些 FPGA 供应商还提供其 FFT 内核的 Matlab 模型。您应该使用 Matlab 或 Octave(Matlab 克隆几乎 100% 兼容)进行尝试。

编辑 2:

正如 Tim Wescott 建议的那样,尝试从 FPGA 获取原始数字化数据。在 Python 中执行 FFT 并确保结果符合您的预期。

除非真实信号的采样与数据同步,否则采样的真实数据通常与合成数据具有不同的相位。真实的信号也不会是无噪音的。

将此视为以下之间的区别:

xreal[n]=Asin(ωn+θ)+ϵ[n]
xsynthetic[n]=Asin(ωn)
这里,θ是由于缺乏同步而导致的相位偏移,并且ϵ是噪声序列。


另一个想法:我想知道这是否是偏移量的问题? 的手册条目rfft说:

截断或补零的输入,沿轴指示的轴转换,如果未指定轴,则为最后一个。如果 n 是偶数,则变换轴的长度为(n/2)+1如果 n 为奇数,则长度为(n+1)/2

底部的数字示例显示:

rfft 的数值示例

这表明 whilefft返回N积分,rfft回报N1点。会不会是索引问题?