本文基于《正弦相位的取样数值测量——高庆》在MATLAB上进行仿真实验,也可看成对此方法的验证。
1.理论基础
假设输入的两个模拟信号的表达式分别为:
μ1(t)=U1msin(ωt+θ1)
μ2(t)=U2msin(ωt+θ2)
将模拟信号转化为数字信号的采样序列:
μ1(n)=U1msin(2πnN+θ1)
μ2(n)=U2msin(2πnN+θ2)
其中
N=TTs
为模拟信号一个周期内的采样点数,
Ts
是采样器的取样周期
从数学的角度可以得到以下推导:
∑Nn=1U1(n)U2(n)=2∑Nn=1Umsin(2πnN+θ1)sin(2πnN+θ2)=∑Nn=1Umcos(θ1−θ2)−∑Nn=1Umcos(4πnN+θ1+θ2)
其中用到
sinαsinβ=12cos(α−β)−12cos(α+β)
Um=12U1mU2m
,其中
U1m=Max(U1(n)),U2m=Max(U2(n))
,这样就可以通过对采样序列的查询来得到
U1mU2m
的值。
从数学方面可以知道,余弦信号在一个周期内整数倍取样和为0,所以上式可以变成
上式=∑Nn=1Umcos(θ1−θ2)=NUmcosϕ
其中
ϕ=θ1−θ2
就是所求两个信号的相位差
求两个采样序列乘积的平均值为
U¯¯¯=1N∑Nn=1U1(n)U2(n)=Umcosϕ
这表明满足采样定理,且
TTs=N
时,一个周期内的正弦信号瞬间取样值的乘积的平均值正比于它们之间的相位差
ϕ
的余弦值,即
cosϕ=U¯¯¯Um
又根据泰勒公式可以得到:
cosϕ=1−ϕ22!+ϕ44!−ϕ66!+⋯+(−1)nϕ2n(2n)!+(−1)n+1ϕ2n+2(2n+2)!cosζϕ,0<ζ<1
可以近似表示为
cosϕ≈1−ϕ22!⋯
我们可以得出被测相位差
ϕ
,
ϕ=2−2cosϕ−−−−−−−−√=2−2U¯¯¯Um−−−−−−−−√(取正值)
但这样得出的相位差会有较大误差,我们需要进行校正,所采用的方法是直接迭代法,取泰勒展开式的前四项:
cosϕ≈1−ϕ22+ϕ424−ϕ6720
令
y=ϕ2
得
cosϕ=1−y2+y224−y3720
得到迭代公式
yi=2(1−U¯¯¯Um)+y2i−124−y3i−1720
当
yi−yi−1<a(a为所给定的精确系数)
时,则被测相位差为
ϕ=yi−−√(取正值)
2.流程图
3.MATLAB仿真实现
clear all;
%N = 200; %采样数量
F = 1; %被采样信号频率1Hz
Ts = 0.01; %采样间隔
Fs = 1/Ts; %采样频率
%T = N*Ts; %采样时长
%n = 0:N-1; %时域采样序列(N个采样)
NP = floor( (1/F)/(Ts) ); %1个周期采样点数,floor()向负无穷大方向取整
n = 0:NP-1;
nTs = n*Ts; %时域采样时间序列
%对下列信号进行研究
g1=inline('2*sin(t)');
g2=inline('3*sin(t+pi/4)');
%采样序列
f1=g1(2*pi*nTs);
f2=g2(2*pi*nTs);
%f2转置
f2=f2.';
U1m=max(max(f1)); %求出f1中的最大值
U2m=max(max(f2)); %求出f2中的最大值
Um=U1m*U2m/2; %计算Um
Uv=(f1*f2)/NP; %计算平均值
angle=sqrt(2-2*(Uv/Um)); %获得初始相位差
%下面通过迭代提高相位差的精度
Y0=angle*angle;
a=0.00001; %要求
for i=1:10000000000
Y1=2*(1-Uv/Um)+Y0*Y0/12-Y0*Y0*Y0/360; %迭代公式
if(Y1-Y0)<a %若两次迭代数值小于所要求精度,则停止迭代
break
else
Y0=Y1;
end
end
angle=sqrt(Y1)
4.误差分析
4.1采样数量
此方法的精确度与采样数量有着密切的关系,虽然在满足采样定理的前提下采样的数据越多越好,但是单片机的处理能力是有限度的,它的取样频率是有上限的。
4.2求取 U1m、U2m 的误差
此方法是处理的离散采样点,虽然可以保证取出 U1(n)、U2(n) 中的最大值来作为 U1m、U2m 的近似值,但是无法保证离散采样点的最大值就是原始信号的峰值。
4.3时间误差
上述我们得到的采样序列都是基于同步采样,即采样时间均一致。但在实际情况中,单片机对两信号的采样会有先后顺序。而这会导致在计算时发生偏差。
以上就是我对于模拟信号求解相位差的理解和仿真实现,初次涉及此领域,有不足之处希望大家能够给予宝贵意见。