寻找与输入信号最佳匹配的正弦波的算法

信息处理 离散信号 参数估计
2022-01-29 17:58:09

问题

假设我取一个信号并均匀采样它长达 2 秒。y(t)=cos(2π4.1t+2)

仅给定这些时间样本,我将如何设计一种算法来找到这对值(频率 = 4.1 Hz,相位 = 2 Rad)?

笔记

我不想要 DFT。DFT 假设信号在边界处是圆形的,并通过在许多频率区间中使用许多值来工作。我想要的是找到最小化输入数据和重建信号之间的均方误差的最佳奇异相位和频率。

作为参考,400 个样本的 DFT 功率谱给出: 4.1hz信号的功率谱

我的尝试

我尝试了网格搜索方法。中的1000 个相位和 1000 个频率直到奈奎斯特频率( Hz)ϕ[0,2π)f100

一旦我有了我的 cos 波网格,我就评估了每对的信号(ϕf

yguess[n]=cos(2πft[n]+ϕ)

并计算猜测和原始信号之间的均方误差 其中是样本数。

MSE=n(y[n]yguess[n])2N
N

运行这个算法,我发现 MSE 最低的对是 ( = 2.0357..., =4.0938...),MSE 为 0.000247。ϕf

这些都是很好的价值观。问题是,它真的很慢。我不禁觉得可能有更好、更优雅的方式来做我想做的事。

我还要提到,虽然它不在这个问题的范围内,但一旦我弄清楚了这个算法,我想要一种方法,我尝试用 N 个正弦波重建一个信号(比如,N=5 会找到5 个正弦波的参数,可以最大限度地减少误差)。

2个回答

好吧,在这种无噪声的情况下,您可以直接估计频率:取每个样本的,找出连续样本之间的差异:这就是每个样本的相位变化量,即您的arccos(y(t))f

您有时可能需要“解包”相位:如果两个连续样本之间的差的绝对值是,那么你只需要加/减来保持一致。|arccos(y(t+1))arccos(y(t))|>π2π

您的相位只是第一个样本的反正切,因为φt=0

在嘈杂的情况下,您可以在展开后进行平均。或者,如果这是针对连续信号且达到中等 SNR,则使用 PLL 锁定信号,并从 PLL 振荡器被调节到的频率读取信号频率。

在大量噪声下,或对于多个频率分量的总和,使用参数谱估计器FFT / DFT 不是您选择的工具 - 它只会对精确落在由采样率除以 DFT 长度定义的网格上的频率本身是精确的,并且插值方法对噪声敏感.

想要一种方法,我尝试用 N 个正弦波重建一个信号(例如,N=5 会找到 5 个最能最小化误差的正弦波的参数)。

ESPRIT 在现实中听起来像是正确的工具:您知道它是纯音调,并且您知道音调的数量。唯一缺少的是噪音——完全没有噪音,这个算法变得不稳定。这是一种将信号映射到信号和噪声子空间的投影方法 - 并且通过正交性的特性,可以最大限度地减少平方误差。

从 DFT 或 FFT 开始时,可​​以使用具有二进制搜索逐次逼近的复分量的 Sinc 插值来估计 DFT 结果箱之间的窄带或单频谱峰值。或者,如果不需要计算效率,您可以将 FFT 零填充 1000 倍以上,以获得更精细的 bin 分辨率。