使用 FFT/DFT 找到两个正弦曲线之间的相位(ArduinoFFT w/C)

信息处理 自由度 阶段
2022-02-08 18:11:02

我无法找到两个数据集之间的已知相位,我们称它们为数据集 11 和数据集 12。我获得了 1024 个样本的样本大小,采样率为 500kHz,总采样时间为 2.048 毫秒。

此问题中使用的所有数据和代码都可以在此存储库中找到 - https://github.com/smake5730/fft_phase/graphs/contributors

从下面的两个数据集的示例数据可以看出,电压领先电流约 90°。(放大)

在此处输入图像描述

当我用 1024 个 bin 计算 FFT 时,我得到了清晰的峰值。(放大)

在此处输入图像描述

我在此期间应用 Hanning 窗口并且不使用零填充。

我使用 atan2(a/b) 方法使用最大峰值的位置来获取相位,发现我得到以下内容。第一个数据给我+90°,第二个数据给我-90°。频率被正确识别。 在此处输入图像描述

我尝试在信号末尾添加零填充,但并没有解决问题。我也尝试过上采样,它也没有给出正确的相位。

有人对我可以尝试什么或哪里出错有任何想法/提示吗?


编辑正如下面所指出的,我的代码采用单独的垃圾箱,并且在第二组中使用了不正确匹配的垃圾箱。

在此处输入图像描述

3个回答

根据我的经验,你不能做得比这更好。

选择 1 1/2 周期或 2 1/2 周期的框架尺寸。

您只需要计算两个 bin,1 和 2,或 2 和 3。不需要完整的 DFT。所以它也非常有效。通过将频率正好放置在两个 bin 的中心附近,您可以最大限度地减少噪声影响并避免需要处理需要一组不同的拟合向量方程组的邻近 bin 频率。

另一种形式是当频率非常接近一个 bin 时。

还有其他技巧可以逐点进行。我会让其他人提供这些。

我注意到了几件事,它们的结合很可能是问题的根源。首先,当您应用窗口时,您将线性相移应用于频率变换。你可以减去它,它可能会解决这个问题。这不一定是个问题,除非...

其次,您的代码独立计算电流和电压幅度的最大值。这意味着您正在比较不同 bin 的相位。同样,如果不是由于开窗导致的相移,这将不是问题(大部分)。

您可以从窗口中移除相移,确保对电压和电流相位使用相同的 bin,或者两者都做。Dawg 先生是对的,有其他/更好的方法可以做到这一点,但我想帮忙考虑一下这种技术应该有效。

编辑:另外,我不知道该库是如何工作的,但您可能希望将峰值搜索限制在转换输出的前半部分。下半年的阶段将是负面的。

补充源数据的性质

在测试我的 pll 软件模拟器时,我在你的 github 参考的电压/电流数据集上运行它,并注意到相位检测器输出的异常行为(相位错误)。很感兴趣,我计算了您的数据集电压/电流的 fft。

电压的 FFT 非常平滑,范围末端的相位噪声是由量化噪声引起的:

在此处输入图像描述

但是电流的 FFT 显示了电压到电流转换的非线性(如果数据集的电流是由某些电子电路从数据集的电压生成的)。请注意 ABS(FFT) 图中的三次和五次谐波以及 ARG(FFT) 中的几乎全圆相位噪声:

在此处输入图像描述

电流的非线性可归因于 生成如下图所示的 FFT 了解这些 github 数据集的来源以及它们与相位噪声/相位失真的关系会很有趣。

cos(2πωt+(α+βcos2(2πωt))γcos2(2πωt)normalDistRandomFunc(mu,sigma))
在此处输入图像描述

在检查数据集电流波形时,几乎不会注意到这种强相位噪声。然而,当它存在时,它会加重受影响信号的处理。