-1

我在给定的网格上有一个周期性信号,比如:

t = 1:30;
omega = 2*pi/18.431;
phi = -pi+2*pi*rand(1);   % a random phase [-pi,pi]
x = sin(omega*t+phi);     % the signal
x = x+0.5*rand(1,length(x)); % add some noise

在此处输入图像描述

现在我想检索 phase phi。有几种方法可以解决这个问题,例如,将其与 a 相匹配sin,但如果我需要执行 1e6 次(除非有办法将其并行化?),这将花费太长时间。另一个是使用fft. 问题是我的网格不足以准确选择该频率,因此与之相关的相位(我无法改变)。我怎样才能通过其他方式获得那个阶段?(以及如何估计该相位检索中的误差?我希望轨迹太嘈杂而无法很好地估计,我想知道这种情况下的相位误差)

4

2 回答 2

3

FT 只是您的信号与余弦和正弦波的相关性,结果为您提供相位和幅度。无需对整个信号进行 FT,只需计算您感兴趣频率处的系数即可。

至于准确性 - 您的信号越长,您的检查频率与相邻频率的“区别”就越多,所以我不确定如果没有更长的样本长度,您可以使用这种方法获得更高的准确性。

编辑:

手头没有 Matlab,所以要在 Python 中执行此操作(我试图让它看起来类似于 Matlab):

from numpy import arange, pi, cos, dot, exp, angle
from numpy.random import rand

N = 1  # Number of cycles
t = arange(30 * N) + 1  # [1, 2 ... 30 * N]
omega = 2 * pi / 18.431
phi = -pi + 2 * pi * rand(1)[0]
x = cos(omega * t + phi)
x = x + 0.5 * rand(len(x))

coeff = dot(x, exp(-1j * omega * t))
phase = angle(coeff)

print "Actual phase:", phi
print "Calculated phase:", phase

即使对于单个循环,这也能产生相当好的结果。有时计算的阶段会2*pi结束,这并不意味着它给出了错误的答案,但在后续计算中需要牢记这一点。

增加周期数N会产生始终如一的良好结果,但这显然会增加计算时间,因此您可能想尝试一下并找到速度与准确性的折衷方案(取决于您的应用程序)。

希望这可以帮助!

于 2014-12-28T22:28:06.090 回答
0

您可以尝试搜索局部最小值/最大值以获得相位和频率。

编辑

如果您知道频率,则可以对信号进行归一化,与 cos 相乘并积分一次,然后与 sin 相乘。如果信号显示为,这会让您直接获得 A 和 B

A*sin(x) +B*cos(x) 
于 2014-12-28T22:14:21.370 回答