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。具体可以自己仿真一下试试。