如果是纯正弦信号,可以参考交流电路中有功无功功率的算法,先计算两个信号的有效值
RMSa = (1/n)*∑A^2(n);
RMSb = (1/n)*∑B^2(n);
然后分别求出这两个信号的"视在功率"和"有功功率";
视在功率 P_APP = RMSa*RMSb;
有功功率 P_ACT = (1/n)*∑A(n)*B(n);
两个信号的相位差就是功率因数 Q = cos(θ) = P_ACT/P_APP;
那么两个信号的相位差 θ = arccos(Q);
以上方法只能计算出两个信号相位差的绝对值,不能计算出到底是超前还是滞后,而且计算出的相位差只适用于纯正弦信号;
在有谐波存在的情况下,以上方法计算出的功率因数是准的,单相位差就不能用以上方法了;
有谐波存在的情况下,不同频率分量有着不同的相位差,需分开讨论;
可以对两个信号进行复数FFT;
FFT后,得到各频率分别的实部虚部,根据实部虚部的正负符号,可以判定具体再哪个象限,虚部除以实部,也可以得出正切值,对正切值进行反三角函数运算,再加上象限的判断,可以得出具体的相角,这样就可以得出某频率下,两信号的相位差,并能计算是超前还是滞后;
具体的可以参考STM32F4 官方DSP库FFT方面的一些例程;
|