MSK调制MATLAB仿真程序
MSK为相位连续的FSK调制,其基本原理如图所示:
方案一:按照上图的流程编写代码:
根据上图a和d两组码元的关系,不难看出这一部分应属于差分编码,在调制系统中,有两类调制需要用到,一个是DPSK,另一个就是MSK,仔细观察两种调制的关系,可以发现,不是同一种差分编码,而且好多资料里也写的是MSK差分编码是a(i)和d(i-1)异或。其实不是这样,正确关系应该是d(1)=a(1);d(i)是a(i)和d(i-1)同或结果。这里可以去书上查看相应a和d组码元,自己计算一下就明白了。
%方法一:计算相位变量
c=zeros(1,length(a));
c(1)=0;
for i=2:length(a)
if a(i)==a(i-1)
c(i)=c(i-1);
else a(i)~=a(i-1);
c(i)=c(i-1)+(a(i-1)-a(i))*((i-1)pi/2);
end
end
I=cos©; %I(k)
Q=a.cos©; %-Q(k)
%扩展码元,每个码元采样点数为number1,一共number个码元
I1=zeros(1,numbernumber1);
Q1=zeros(1,numbernumber1);
for i=1:number;
I1((i-1)number1+1:inumber1)=I(i);
Q1((i-1)number1+1:inumber1)=Q(i);
end
%加权系数
t1=1/fs:1/fs:length(a)tb;
I=I1.cos(pit1/2/tb);
Q=Q1.sin(pit1/2/tb);
I和Q的波形如图所示:
然后进行中频搬移即可:
multi=4;
I=interp(I,multi);
Q=interp(Q,multi);
t=1/fs:1/fs:length(I)1/fs;
I=I.cos(2pifct);
Q=Q.sin(2pifct);
out=I-Q;
方案二:利用ak和相位的联系,如下图:
for i=1:number1
data_sample(i:number1:numbernumber1)=a;
end
%计算相位
phase=zeros(1,numbernumber1);
phase(1)=0;%phase(1)=data_sample(1)pi/2/number1;
for i=2:numbernumber1
phase(i)=phase(i-1)+data_sample(i-1)pi/2/number1;
end
%phase=phase+(0-phase(1));
I=cos(phase);
Q=sin(phase);
[r1,r2]=fen(a);
r(1)=-r2pi;
for i=2:(r1+r2)2+1
r(i)=-r2pi+(pi/2)(i-1);
end
figure;
subplot(2,1,1);stem(a);axis([0,length(a)+1,-2,2]);grid;
subplot(2,1,2);plot(phase);grid;
set(gca,‘YTick’,-r2pi:pi/2:r1*pi);
set(gca,‘YTickLabel’,{r/pi});
title(‘相位图’);ylabel(‘pi’);
结果如图所示:
然后再进行调制。
关于这一部分,有的资料上计算相位phase时,初始化令phase(1)=data_sample(1)*pi/2/number1;
我仿真之后发现是有误差的,I和Q路的图像也是有误差,经过仔细检查发现,这里phase(1)=0,也就是第一个相位值应该为1。具体可以自己仿真一下试试。
|
请发表评论