HYPERLINK"http://blog.csdn.net/labixiaoxin99/article/details/6129323"msk的调制解调MATLAB源代码functionout=delay(data,n,sample_number)%data:延迟的数据%n:延迟码元个数%sample_number:码元采样个数out=zeros(1,length(data));out(n*sample_number+1:length(data))=data(1:length(data)-n*sample_number);function[data_diff]=difference(data)%差分编码%**************************************************************************%data 输入信号%data_diff 差分编码后信号%************************************************************************** %--------------------------------------------------------------------------data_diff=zeros(1,length(data));data_diff(1)=1*data(1); %1为差分编码的初始参考值fori=2:length(data) data_diff(i)=data_diff(i-1)*data(i);end%**************************************************************************function[signal_out,I_out,Q_out]=mod_msk(data,data_len,sample_number,Rb)%MSK基带调制%**************************************************************************%data 调制信号%data_len 码元个数%sample_number 每个码元采样点数%Rb 码元速率%signal_out 基带调制输出%I_out I路输出%Q_out Q路输出%************************************************************************** %data_len=10; %码元个数%sample_number=8; %采样点数%Rb=16000; %码元速率%data1=randint(1,data_len);%data=2*data1-1; %传输的序列 Tb=1/Rb; %码元时间fs=Rb*sample_number; %采样速率 %--------------------------------------------------------------------------%差分编码[data_diff]=difference(data);%************************************************************************** %--------------------------------------------------------------------------%并串转换,延时I(1)=1; %fai0=0,cos(fai0)=1fori=1:2:data_len Q(i)=data_diff(i); Q(i+1)=data_diff(i);endfori=2:2:data_len I(i+1)=data_diff(i); I(i)=data_diff(i);end fori=1:sample_number I1(i:sample_number:data_len*sample_number)=I(1:data_len); Q1(i:sample_number:data_len*sample_number)=Q(1:data_len);end%************************************************************************** %--------------------------------------------------------------------------%乘加权函数t=1/fs:1/fs:data_len*Tb;I_out=I1.*cos(pi*t/2/Tb);Q_out=Q1.*sin(pi*t/2/Tb);%************************************************************************** %--------------------------------------------------------------------------%调制信号产生signal_out=I_out+j*Q_out;%************************************************************************** %%--------------------------------------------------------------------------%%画图%subplot(221)%plot(data,'.-');title('MSK传输的数据');xlabel('时间');ylabel('幅度')%subplot(222)%plot(data_diff,'.-');title('差分后的数据');xlabel('时间');ylabel('幅度')%subplot(223)%plot(I1,'.-');title('加权前I路');xlabel('时间');ylabel('幅度');%subplot(224)%plot(Q1,'.-');title('加权前Q路');xlabel('时间');ylabel('幅度');% %figure(2)%subplot(221)%plot(cos(pi*t/2/Tb),'.-');title('加权函数cos(πt/(2Tb))');xlabel('时间');ylabel('幅度')%subplot(222)%plot(sin(pi*t/2/Tb),'.-');title('加权函数sin(πt/(2Tb))');xlabel('时间');ylabel('幅度')%subplot(223)%plot(I_out,'.-');title('加权后I路');xlabel('时间');ylabel('幅度');%subplot(224)%plot(Q_out,'.-');title('加权后Q路');xlabel('时间');ylabel('幅度');%%**************************************************************************function[signal_out,I_out,Q_out,phase]=mod_msk2(data,data_len,sample_number,Rb)%MSK基带调制%**************************************************************************%data 调制信号%data_len 码元个数%sample_number 每个码元采样点数%Rb 码元速率%signal_out 基带调制输出%I_out I路输出%Q_out Q路输出%************************************************************************** %data_len=10; %码元个数%sample_number=8; %采样点数%Rb=16000; %码元速率%data1=randint(1,data_len);%data=2*data1-1; %传输的序列 Tb=1/Rb; %码元时间fs=Rb*sample_number; %采样速率 %--------------------------------------------------------------------------%采样fori=1:sample_number data_sample(i:sample_number:data_len*sample_number)=data;end%************************************************************************** %--------------------------------------------------------------------------%计算相位phase=zeros(1,data_len*sample_number);phase(1)=data_sample(1)*pi/2/sample_number;fori=2:data_len*sample_number phase(i)=phase(i-1)+data_sample(i-1)*pi/2/sample_number;end%************************************************************************** %--------------------------------------------------------------------------%I/QI_out=cos(phase);Q_out=sin(phase);%************************************************************************** %--------------------------------------------------------------------------%调制信号产生signal_out=I_out+j*Q_out;%**************************************************************************%MSK调制,差分解调方法一clearallcloseall %--------------------------------------------------------------------------%参数设置data_len=10000; %码元个数sample_number=8; %采样个数Rb=24000; %码元速率fc=96000; %载波频率%************************************************************************** %--------------------------------------------------------------------------%随机产生传输信号data=rand_binary(data_len);%************************************************************************** %--------------------------------------------------------------------------%MSK基带调制[signal_out,I_out,Q_out]=mod_msk(data,data_len,sample_number,Rb);%************************************************************************** %--------------------------------------------------------------------------%中频搬移multi=fc/Rb;I_temp=interp(I_out,multi);Q_temp=interp(Q_out,multi); Fs=fc*sample_number;t=1/Fs:1/Fs:length(I_temp)*1/Fs;signal_i=I_temp.*cos(2*pi*fc*t);signal_q=Q_temp.*sin(2*pi*fc*t);signal_mod=I_temp.*cos(2*pi*fc*t)-Q_temp.*sin(2*pi*fc*t);%************************************************************************** %--------------------------------------------------------------------------%加噪声forSNR=0:8signal_mod1=awgn(signal_mod,SNR); %-------------------------------------------------------------------------- %去载波 N=300; %滤波器的阶数为(N+1) F=[0,fc-1000,fc+1000,Fs/2]*2/Fs; A=[1,1,0,0]; lpf=firls(N,F,A); [amp_lpf,w]=freqz(lpf); I_dem=signal_mod1.*cos(2*pi*fc*t)*2; I_dem=conv(I_dem,lpf); I_dem=I_dem(N/2+1:N/2+length(I_temp)); Q_dem=signal_mod1.*sin(2*pi*fc*t)*2; Q_dem=conv(Q_dem,lpf); Q_dem=-Q_dem(N/2+1:N/2+length(I_temp)); I_dem_out=zeros(1,length(I_dem)/multi); %抽取 Q_dem_out=zeros(1,length(Q_dem)/multi); fori=1:length(I_dem_out) I_dem_out(i)=I_dem(multi*(i-1)+1); Q_dem_out(i)=Q_dem(multi*(i-1)+1); end; %************************************************************************** %-------------------------------------------------------------------------- %差分解调 demod_data=zeros(1,data_len); demod_data(1)=Q_dem_out(sample_number); fori=2:data_len demod_data(i)=Q_dem_out(i*sample_number)*I_dem_out((i-1)*sample_number)-I_dem_out(i*sample_number)*Q_dem_out((i-1)*sample_number); end %************************************************************************** %-------------------------------------------------------------------------- %判决 demod_data=demod_data>0; demod_data=2*demod_data-1; %************************************************************************** %-------------------------------------------------------------------------- %计算误码率 [num,ber(SNR+1)]=symerr(demod_data,data); %**************************************************************************end%************************************************************************** %--------------------------------------------------------------------------%误码率曲线semilogy([0:8],ber,'r*-');%************************************************************************** %--------------------------------------------------------------------------%误码率理论值snr=0:0.1:8;fori=1:length(snr) snr1(1,i)=10^(snr(1,i)/10); ps(1,i)=1/2*erfc(sqrt(snr1(1,i))); pe(1,i)=2*ps(1,i);endholdonsemilogy([0:.1:8],pe);%**************************************************************************%MSK调制,差分解调方法二clearallcloseall %--------------------------------------------------------------------------%参数设置data_len=10000; %码元个数sample_number=8; %采样个数Rb=24000; %码元速率fc=96000; %载波频率%************************************************************************** %--------------------------------------------------------------------------%随机产生传输信号data=rand_binary(data_len);%************************************************************************** %--------------------------------------------------------------------------%MSK基带调制[signal_out,I_out,Q_out]=mod_msk(data,data_len,sample_number,Rb);%************************************************************************** %--------------------------------------------------------------------------%中频搬移multi=fc/Rb;I_temp=interp(I_out,multi);Q_temp=interp(Q_out,multi); Fs=fc*sample_number;t=1/Fs:1/Fs:length(I_temp)*1/Fs;signal_i=I_temp.*cos(2*pi*fc*t);signal_q=Q_temp.*sin(2*pi*fc*t);signal_mod=I_temp.*cos(2*pi*fc*t)-Q_temp.*sin(2*pi*fc*t);%************************************************************************** %--------------------------------------------------------------------------%加噪声forSNR=0:8signal_mod1=awgn(signal_mod,SNR); %-------------------------------------------------------------------------- %去载波 N=300; %滤波器的阶数为(N+1) F=[0,fc-1000,fc+1000,Fs/2]*2/Fs; A=[1,1,0,0]; lpf=firls(N,F,A); [amp_lpf,w]=freqz(lpf); I_dem=signal_mod1.*cos(2*pi*fc*t)*2; I_dem=conv(I_dem,lpf); I_dem=I_dem(N/2+1:N/2+length(I_temp)); Q_dem=signal_mod1.*sin(2*pi*fc*t)*2; Q_dem=conv(Q_dem,lpf); Q_dem=-Q_dem(N/2+1:N/2+length(I_temp)); I_dem_out=zeros(1,length(I_dem)/multi); %抽取 Q_dem_out=zeros(1,length(Q_dem)/multi); fori=1:length(I_dem_out) I_dem_out(i)=I_dem(multi*(i-1)+1); Q_dem_out(i)=Q_dem(multi*(i-1)+1); end; %************************************************************************** %-------------------------------------------------------------------------- %差分解调 demod_data=zeros(1,data_len); demod_data(1)=Q_dem_out(sample_number); fori=2:2:data_len demod_data(i)=-I_dem_out(i*sample_number)*Q_dem_out((i-1)*sample_number); end fori=3:2:data_len demod_data(i)=Q_dem_out(i*sample_number)*I_dem_out((i-1)*sample_number); end %************************************************************************** %-------------------------------------------------------------------------- %判决 demod_data=demod_data>0; demod_data=2*demod_data-1; %************************************************************************** %-------------------------------------------------------------------------- %计算误码率 [num,ber(SNR+1)]=symerr(demod_data,data); %**************************************************************************end%************************************************************************** %--------------------------------------------------------------------------%误码率曲线semilogy([0:8],ber,'r*');%************************************************************************** %--------------------------------------------------------------------------%误码率理论值snr=0:0.1:8;fori=1:length(snr) snr1(1,i)=10^(snr(1,i)/10); ps(1,i)=1/2*erfc(sqrt(snr1(1,i))); pe(1,i)=2*ps(1,i);endholdonsemilogy([0:.1:8],pe);%**************************************************************************%MSK调制,解调clearallcloseall %--------------------------------------------------------------------------%参数设置data_len=30000; %码元个数sample_number=8; %采样个数Rb=24000; %码元速率fc=96000; %载波频率%************************************************************************** %--------------------------------------------------------------------------%随机产生传输信号data=rand_binary(data_len);%************************************************************************** %--------------------------------------------------------------------------%MSK基带调制[signal_out,I_out,Q_out]=mod_msk(data,data_len,sample_number,Rb);%************************************************************************** %--------------------------------------------------------------------------%中频搬移multi=fc/Rb;I_temp=interp(I_out,multi);Q_temp=interp(Q_out,multi); Fs=fc*sample_number;t=1/Fs:1/Fs:length(I_temp)*1/Fs;signal_i=I_temp.*cos(2*pi*fc*t);signal_q=Q_temp.*sin(2*pi*fc*t);signal_mod=I_temp.*cos(2*pi*fc*t)-Q_temp.*sin(2*pi*fc*t);%signal_mod1=real((I_temp+j*Q_temp).*exp(j*2*pi*fc*t));%************************************************************************** %--------------------------------------------------------------------------%加噪声forSNR=0:8signal_mod1=0.01*awgn(signal_mod,SNR); %-------------------------------------------------------------------------- %去载波 N=300; %滤波器的阶数为(N+1) F=[0,fc-1000,fc+1000,Fs/2]*2/Fs; A=[1,1,0,0]; lpf=firls(N,F,A); [amp_lpf,w]=freqz(lpf); I_dem=signal_mod1.*cos(2*pi*fc*t)*2.*cos(pi*t*Rb/2); I_dem=conv(I_dem,lpf); I_dem=I_dem(N/2+1:N/2+length(I_temp)); Q_dem=signal_mod1.*sin(2*pi*fc*t)*2.*sin(pi*t*Rb/2); Q_dem=conv(Q_dem,lpf); Q_dem=-Q_dem(N/2+1:N/2+length(I_temp)); I_dem_out=zeros(1,length(I_dem)/multi); %抽取 Q_dem_out=zeros(1,length(Q_dem)/multi); fori=1:length(I_dem_out) I_dem_out(i)=I_dem(multi*(i-1)+1); Q_dem_out(i)=Q_dem(multi*(i-1)+1); end; %************************************************************************** %-------------------------------------------------------------------------- %解调,判决 demod_data=zeros(1,data_len); fori=1:data_len I_dem1(i)=I_dem_out(i*sample_number)>0; Q_dem1(i)=Q_dem_out(i*sample_number)>0; end fori=1:2:data_len m1(i)=Q_dem1(i); end fori=2:2:data_len m1(i)=I_dem1(i); end m1=2*m1-1; %************************************************************************** %-------------------------------------------------------------------------- %差分解码 demod_data=zeros(1,data_len); demod_data(1)=1*m1(1); fori=2:data_len demod_data(i)=m1(i-1)*m1(i); end %************************************************************************** %-------------------------------------------------------------------------- %计算误码率 [num,ber(SNR+1)]=symerr(demod_data,data); %**************************************************************************end %/forsnr%************************************************************************** %--------------------------------------------------------------------------%误码率曲线semilogy([0:8],ber,'r*-');%************************************************************************** %--------------------------------------------------------------------------%误码率理论值snr=0:0.1:8;fori=1:length(snr) snr1(1,i)=10^(snr(1,i)/10); ps(1,i)=1/2*erfc(sqrt(snr1(1,i))); pe(1,i)=2*ps(1,i);endholdonsemilogy([0:.1:8],pe);%**************************************************************************function[data_binary,data_binary1]=rand_binary(data_len);%随机产生一个二进制序列作为仿真用的消息序列%**************************************************************************%data 序列长度%data_binary 产生的二进制序列%************************************************************************** %--------------------------------------------------------------------------data1=randn(1,data_len);data_binary=zeros(1,data_len);data_binary1=zeros(1,data_len);fori=1:data_len ifdata1(i)<0 data_binary(i)=-1; data_binary1(i)=0; else data_binary(i)=1; data_binary1(i)=1; endend(资料素材和资料部分来自网络,供参考。可复制、编制,期待你的好评与关注)
本文档为【msk的调制解调MATLAB源代码】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。