按固定频率测得一个信号,我知道它是正弦波,知道它的频率,不关心它的幅值,只要知道它的相位,怎样做最简单?
这个应用是单片机编程要用的。更具体一点儿,三相交流电机驱动,用单片机输出一个逆变的PWM波,因此电压的相位是知道的,连续检测电流的值,期望得到电流的相位。这就是功率角。
更一般的应用,是知道一个正弦信号,要求出它的频率、幅值、相位和偏置,即所谓死参数估计。取点一个,就是三参数估计。对我们的应用,没那样复杂,只要知到相位。
在网上见到一个不错的文章,网址是:http://www.doc88.com/p-5520151326.html,以下的内容基于它。
这是用最小二乘法和FFT求信号的相位,事先知道频率,不管幅值,偏置为零。两种方法都能用,比较下来,最小二乘法简单。
现有信号序列s(t),0<=t<N,N为序列的长度,也是PWM波的长度,载波比,即这样长的序列,就对应电压或电流的一个整波形。即s(t)=Asin(t*2π/N+φ),现要求φ。其实,N不一定要是整周期的长度。
把前面式子改写一下,即
s(t)=C0sin(ωt)+C1cos(ωt),
其中C0=Acosφ,C1=Asinφ。既得到了两个未知数。根据最小二乘法,要求测量总的残差平方和最小,用求偏导数的方法得到C0和C1的最小二乘估计。
一项的残差为
v(t)=
C0sin(ωt)+C1cos(ωt)-s(t),
所有的残差平方和为
[v(t)^2]=Σ(C0sin(ωt)+C1cos(ωt)-s(t)),
分别对C0和C1求偏导,最终可以得到方程
A^TAC=A^TS,
其中A^T是A的转置的意思。A是一个二列N行的矩阵,第一列是sin(ωt),第二列是cos(ωt),t是变化的。因此A^TA其实是一个2*2的矩阵,而且它的值都可以事先算好保存备用。矩阵A自然也是如此。
这样,在我们取得一个序列S的时候,只要把S与事先知道的A相乘,就可以求解了。这是一个简单的二元一次方程组。
用excel作了简单的数字试验,如果N是一个整周期的话,效果反而不好,有几个项正好抵消了。只用半个周期的数据就很好了。
下周编程,把计算相位差的部分编进去,试验自动升速,看不同电压、转速下的电流相位。
A中的数据,不一定是零相位的,有一个初相位没有关系。总之是求得序列S与A中数据的相位差。
加载中,请稍候......