QPSK调制解调完整程序(配有注释)clc;clearall;%假定接收端已经实现载波同步,位同步(盲信号解调重点要解决的问题:载波同步(costas环(未见到相关代码)),位同步(Gardner算法(未见相关代码)),帧同步)%carrierfrequencyformodulationanddemodulationfc=5e6;%QPSKtransmitterdata=5000;%码数率为5MHZ%原码个数rand_data=randn(1,5000);fori=1:dataifrand_data(i)=0.5rand_data(i)=1;elserand_data(i)=0;endend%serieltoparallel%同时单极性码转为双极性码fori=1:dataifrem(i,2)==1ifrand_data(i)==1I(i)=1;I(i+1)=1;elseI(i)=-1;I(i+1)=-1;endelseifrand_data(i)==1Q(i-1)=1;Q(i)=1;elseQ(i-1)=-1;Q(i)=-1;endendend%zeroinsertion,此过程称为成形。成形的意思就是实现由消息到波形的转换,以便发射,脉冲成形应该是在基带调制之后。zero=5;%samplingrate25MHZ,明白了,zero为过采样率。它等于采样率fs/码速率。fori=1:zero*data%采样点数目=过采样率*原码数目ifrem(i,zero)==1Izero(i)=I(fix((i-1)/zero)+1);Qzero(i)=Q(fix((i-1)/zero)+1);elseIzero(i)=0;Qzero(i)=0;endend%pulseshapefilter,接着,将进行低通滤波,因为随着传输速率的增大,基带脉冲的频谱将变宽%如果不滤波(如升余弦滤波)进行低通滤波,后面加载频的时候可能会出现困难。%平方根升余弦滤波器%psf=rcosfir(rf,n_t,rate,fs,'sqrt')rate:过采样率,rf:滚降因子,n_t:滤波器阶数,fs:采样率%用在调制或发送之前,用在解调或接受之后,用来降低过采样符号流带宽并不引发ISI(码间串扰)NT=50;N=2*zero*NT;%=500fs=25e6;rf=0.1;psf=rcosfir(rf,NT,zero,fs,'sqrt');%psf大小为500Ipulse=conv(Izero,psf);Qpulse=conv(Qzero,psf);%为什么数字信号传输也要过采样,成形滤波?%答:过采样的数字信号处理起来对低通滤波器的要求相对较低,如果不过采样,滤波的时候滤波器需要很陡峭,指标会很严格%成形滤波的作用是保证采样点不失真。如果没有它,那信号在经过带限信道后,眼图张不开,ISI非常严重。成形滤波的位置在基带调制之后。%因为经成形滤波后,信号的信息已经有所损失,这也是为避免ISI付出的代价。换句话说,成形滤波的位置在载波调制之前,仅挨着载波调制。%即:(发送端)插值(采样)-成形-滤波(LPF)-加载频(载波调制)-加噪声至(接收端)乘本振-低通-定时抽取-判决。%modulationfori=1:zero*data+N%采样点数目改变(因为卷积的缘故)t(i)=(i-1)/(fs);%这里因为假设载频与码速率大小相等,所以用载频fc乘以过采样率=采样率。Imod(i)=Ipulse(i)*sqrt(2)*cos(2*pi*fc*t(i));Qmod(i)=Qpulse(i)*(-sqrt(2)*sin(2*pi*fc*t(i)));endsum=Imod+Qmod;%QPSKreceiver%demodulationfori=1:zero*data+NIdem(i)=sum(i)*sqrt(2)*cos(2*pi*fc*t(i));Qdem(i)=sum(i)*(-sqrt(2)*sin(2*pi*fc*t(i)));end%matchedfiltermtf=rcosfir(rf,NT,zero,fs,'sqrt');Imat=conv(Idem,mtf);Qmat=conv(Qdem,mtf);%dataselectionfori=1:zero*dataIsel(i)=Imat(i+N);Qsel(i)=Qmat(i+N);end%sampler%提取码元fori=1:dataIsam(i)=Isel((i-1)*zero+1);Qsam(i)=Qsel((i-1)*zero+1);end%decisionthresholdthreshold=0.2;fori=1:dataifIsam(i)=thresholdIfinal(i)=1;elseIfinal(i)=-1;endifQsam(i)=thresholdQfinal(i)=1;elseQfinal(i)=-1;endend%paralleltoserialfori=1:dataifrem(i,2)==1ifIfinal(i)==1final(i)=1;elsefinal(i)=0;endelseifQfinal(i)==1final(i)=1;elsefinal(i)=0;endendend%绘图figure(1)plot(20*log(abs(fft(rand_data))));axis([0data-40100]);gridon;title('spectrumofinputbinarydata');figure(2)subplot(221);plot(20*log(abs(fft(I))));axis([0data-40140]);gridon;title('spectrumofI-channeldata');subplot(222);plot(20*log(abs(fft(Q))));axis([0data-40140]);gridon;title('spectrumofQ-channeldata');subplot(223);plot(20*log(abs(fft(Izero))));axis([0zero*data-20140]);gridon;title('spectrumofI-channelafterzeroinsertion');subplot(224);plot(20*log(abs(fft(Qzero))));axis([0zero*data-20140]);gridon;title('spectrumofQ-channelafterzeroinsertion');figure(3);subplot(221);plot(psf);axis([200300-0.20.6]);title('timedomainresponseofpulseshapingfilter');gridon;subplot(222);plot(20*log(abs(fft(psf))));axis([0N-35050]);gridon;title('transferfunctionofpulseshapingfilter');subplot(223);plot(20*log(abs(fft(Ipulse))));axis([0zero*data+N-250150]);gridon;title('spectrumofI-channelafterimpulseshapingfilter');subplot(224);plot(20*log(abs(fft(Qpulse))));axis([0zero*data+N-250150]);gridon;title('spectrumofQ-channelafterpluseshapingfilter');figure(4)subplot(211);plot(20*log(abs(fft(Imod))));axis([0zero*data+N-250150]);gridon;title('spectrumofI-channelaftermodulation');subplot(212);plot(20*log(abs(fft(Qmod))));axis([0zero*data+N-250150]);gridon;title('spectrumofQ-channelaftermodulation');figure(5)subplot(221);plot(20*log(abs(fft(Idem))));axis([0zero*data-200150]);gridon;title('spectrumofI-channelafterdemodulation');subplot(222);plot(20*log(abs(fft(Qdem))));axis([0zero*data+N-200150]);gridon;title('spectrumofQ-channelafterdemodulation');subplot(223);plot(20*log(abs(fft(Imat))));axis([0zero*data-400200]);gridon;title('spectrumofI-channelaftermatchedfilter');subplot(224);plot(20*log(abs(fft(Qmat))));axis([0zero*data-400200]);gridon;title('spectrumofQ-channelaftermatchedfilter');figure(6)subplot(221);plot(20*log(abs(fft(Isam))));axis([0data-40150]);gridon;title('spectrumofI-channelaftersampler');subplot(222);plot(20*log(abs(fft(Qsam))));axis([0data-40150]);gridon;title('spectrumofQ-channelaftersampler');subplot(223);plot(20*log(abs(fft(Ifinal))));axis([0data-40150]);gridon;title('spectrumofI-channelafterdecisionthreshold');subplot(224);plot(20*log(abs(fft(Qfinal))));axis([0data-40150]);gridon;title('spectrumofQ-channelafterdecisionthreshold');figure(7)plot(Isel,Qsel);axis([-1.61.6-1.61.6]);gridon;title('constellationofmatchedfilteroutput');figure(8)plot(Isam,Qsam,'X');axis([-1.21.2-1.21.2]);gridon;title('constellationofsampler');figure(9)plot(20*log(abs(fft(final))));axis([0data0100]);gridon;title('aspectrumoffinalreceivedbinarydata');