我在给定网格上有一个周期性信号,比如说:
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
现在我想要检索阶段phi
。有一些方法,例如,将它适合sin
,但如果我需要做1e6次(除非有一种方法可以并行化它?),这会花费太长时间。另一种方法是使用fft
。问题是我的网格不够好,无法准确地选择该频率,因此与之相关的阶段(我无法改变它)。如何通过其他方式设法实现这一阶段? (以及如何估计相位检索中的误差?我希望估算得太嘈杂以至于无法估算出来并且我想知道那种情况下的相位误差)
答案 0 :(得分:3)
FT只是信号与余弦和正弦波的相关性,结果给出了相位和幅度。而不是对整个信号进行FT,只需根据您感兴趣的频率计算系数。
至于准确度 - 信号越长,信号越多,越不清楚。您的检查频率将来自相邻频率,因此我不确定使用此方法可以在没有更长采样长度的情况下获得更高的准确度。
编辑:
Haven没有得到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
会产生一致的良好效果,但这显然会增加计算时间,因此您可能想要使用它并找到速度与精度的折衷方案(取决于您的应用)。
希望这有帮助!
答案 1 :(得分:0)
您可以尝试搜索局部最小值/最大值以获得相位和频率。
修改的
如果您知道频率,您可以对信号进行归一化,乘以一次与cos,然后与sin进行整合。如果信号显示为
,这将直接获得A和B.A*sin(x) +B*cos(x)