编辑:从建议使用
我有两个原始数据数组,对应于同一(已知)频率上的两个正弦信号随时间变化,其中一个信号相位被未知量delta,
这里得到的相位移随时间变化既有正值又有负值,并呈波形振荡。它的形状相当一致,但我不知道如何解释结果。在对相位移进行
图表:
对于这两种方法,我该如何使用结果来引用在一组周期内的单个相移值?取
快速计算相位移我使用了:
我对这种分析方法还比较新,并且对Matlab不太熟悉,所以非常感谢您提供的任何更正/指导。
编辑:鉴于这是一个非线性系统,有哪些方法可以最好地评估相位移?
xcorr
函数得出的结果为零来看,这些数据更可能代表非线性系统,而不是我最初想的那样。在这种情况下,a
和b
的表达式被简化了,不一定完全与真实数据相比。此外,相移d
的值不能再被假定为常数。我有两个原始数据数组,对应于同一(已知)频率上的两个正弦信号随时间变化,其中一个信号相位被未知量delta,
d
所改变。这些信号可以描述为:a = A*sin(wt)
b = B*sin(wt+d)
其中w = 2*pi*f
,A, B
分别为a
和b
的振幅。
这里的目标是评估给定信号随时间的相位移动。这可以作为瞬时值或在许多周期内平均值来完成(相对于总周期数很小,即在f = 150Hz下,10秒测试相当于1500个周期)。
我知道有许多方法可以用来解决这个问题,许多其他用户已经就此提出/回答了问题。下面是链接到原始帖子和我实现的代码的方法。我目前遇到的问题是:
- 如何解释评估后的相移(对于我的情况,相移通常被引用为一个单一的、正数的数字,在许多周期内保持相对稳定)
- 不同方法之间的值差异
- 是否有任何我错过的额外方法?
对于我的数据,a
和b
都是[1 x 399]的大小,涵盖了20个周期。这只是预期数据的一小部分,我正在使用它来测试不同的方法。可以合理地期望至少有10度的相位移,尽管确切数值未知:
傅里叶变换
fft_a = fft(a);
fft_a = fft_a(2:end); %Drop the first point
angle_a = angle(fft_a); %Angle the result
fft_b = fft(b);
fft_b = fft_b(2:end); %Drop the first point
angle_b = angle(fft_b); %Angle the result
ps1 = rad2deg(abs(angle_a - angle_b)); %Phase shift calculation
使用这种方法,我该如何消除开头/结尾的峰值?我需要设置变换在一定数量的点上执行吗?
然后,我该如何绘制相移与时间的图像,因为这个结果现在肯定是在频域中?
希尔伯特变换
来源:识别信号之间的相移
ha = hilbert(a); %Hilbert transform
hb = hilbert(b);
ps2 = rad2deg(angle(hb./ha)); %Phase shift calculation
这里得到的相位移随时间变化既有正值又有负值,并呈波形振荡。它的形状相当一致,但我不知道如何解释结果。在对相位移进行
abs
值处理后,结果现在在 0 到 30 度之间变化。图表:
![Hilbert Phase Shift Time Plot](https://istack.dev59.com/IvuS2.webp)
mean
看起来不是一个精确的方法。快速计算相位移我使用了:
ps3 = rad2deg(acos(dot(a,b)/(norm(a)*norm(b)))) %Norm product method
ps3 =
11.8289
我对这种分析方法还比较新,并且对Matlab不太熟悉,所以非常感谢您提供的任何更正/指导。
编辑:鉴于这是一个非线性系统,有哪些方法可以最好地评估相位移?
fminsearch
吗?只需使用可参数化的相位偏移减去一个信号,优化最小平方差之和。 - Rody Oldenhuisxcorr
函数的替代方法吗?此外,似乎我可以对每对点评估相位偏移,而不是整个数组的相位偏移......感谢@rodyoldenhuis的建议,我一定会尝试它。 - Natalie