本代码主要对MIMO系统进行MATLAB仿真,包括MIMO系统的发送和接收。仿真的结果图表示的是在不同的信噪比的条件下,有信道编码和无信道编码的2X2和2X1四种MIMO系统的误码率。 本代码共有5个部分,分别是主代码MIMO.m;QPSK调制代码QPSK.m;QPSK解调代码DEQPSK.m;卷积码编码convolutionalcode.m;卷积码解码(维特比译码)viterbi.m。这五部分组成完整的MIMO系统。 MIMO系统的流程图
MIMO系统的发送和接收过程是:首先,信源产生信号,然后通过信道编码器对信息进行信道编码,接着对信息进行调制。我采用的是QPSK调制。调制完成后对信号进行发射,然后通过信道到达接收端。接收端接收之后,先进行解调,然后信道译码,就可以得到发送端发送的信号。 在有信道编码的2发2收MIMO系统中,信源产生信号后,通过卷积码编码器进行编码,然后对信号进行QPSK调制。将调制好的信号分成两部分进行发射。发送信号之前先发送信道冲击响应。发送的信号通过AWGN信道,也就是加性高斯白噪声信道到达接收端,接收端通过QPSK解码与维比特译码(卷积码译码的一种),得到信号。 接收端接收到的信号如何区分:接收端接收到的信号包括信道冲击响应和和发送的序列卷积,接收端通过接收冲击响应和卷积序列将信息区分,然后将信息解码,合并,就可以得到发送的信息。 信道冲击响应反应了信道的基本特性。信号通过通信信道时,信道会对进过的信号产生作用,不同的信道作用效果不同。冲击响应就是当输入一个单位脉冲信号时,信道输出端的响应输出信号。简单的说,就是对信道输入一个冲击脉冲,通过输出端的输出信号,了解信道的基本特性。 信道编码也叫差错控制编码,就是在发送端对原数据添加冗余信息,这些冗余信息是和原数据相关的,再在接收端根据这种相关性来检测和纠正传输过程产生的差错,从而对抗传输过程的干扰。在本系统中,信道编码采用卷积码,它充分利用了各个信息块之间的相关性。在卷积码的译码过程中,不仅从本码中提取译码信息,还要充分利用以前和以后时刻收到的码组,从这些码组中提取译码相关信息,而且译码也是连续进行的,这样可以保证卷积码的译码延时相对比较小。译码时采用的是维比特译码。 %MIMO.m SNR_dB=0:1:30; %信噪比范围 LOOP=500; %------------------------------------------ %--------------信源产生--------------------- %------------------------------------------ for i=1:length(SNR_dB) snr=10^(SNR_dB(i)/10); %信噪比转换 sgma=sqrt(8/snr/3); %噪声方差 error0=0; error1=0; error2=0; error3=0; for a=1OOP N=2560; %仿真序列长度 S=randsrc(1,N,[0,1]); %二进制序列信源 产生n个随机数 %------------------------------------------- %------------有信道编码---------------------- %------------------------------------------- S00=convolutionalcode(S); %--------------QPSK调制--------------------- s=QPSK(S00); s0=zeros(1,3*N/4); %将调制后的信息奇偶拆分成两个信息以进行MIMO发射 s1=zeros(1,3*N/4); for b1=1:23*N/2) s0(ceil(b1/2))=s(b1); s1(ceil(b1/2))=s(b1+1); end N1=size(s0,2); %--------有信道编码(2发2收)----------------- h0=sqrt(0.5).*(randn(1,N1)+1i.*randn(1,N1)); %设置信道冲激响应 h1=sqrt(0.5).*(randn(1,N1)+1i.*randn(1,N1)); h2=sqrt(0.5).*(randn(1,N1)+1i.*randn(1,N1)); h3=sqrt(0.5).*(randn(1,N1)+1i.*randn(1,N1)); %------接收到的信号(冲激响应与发送序列卷积)--- R0=h0.*s0+h1.*s1; %接收信号矢量(不含高斯噪声) R1=-conj(s1).*h0+h1.*conj(s0); R2=h2.*s0+h3.*s1; R3=-conj(s1).*h2+h3.*conj(s0); %通过AWGN信道加入噪声后的冲击序列 r0=(R0+sgma.*(randn(1,N1)+1i*randn(1,N1)));%接收信号矢量(有噪声) r1=(R1+sgma.*(randn(1,N1)+1i*randn(1,N1))); r2=(R2+sgma.*(randn(1,N1)+1i*randn(1,N1))); r3=(R3+sgma.*(randn(1,N1)+1i*randn(1,N1))); s_0=conj(h0).*r0+h1.*conj(r1)+conj(h2).*r2+h3.*conj(r3);%STBC空时译码 s_1=conj(h1).*r0-h0.*conj(r1)+conj(h3).*r2-h2.*conj(r3); for l0=1:3*N/4 %将接收到的信号合并 Y0(2*l0-1)=s_0(l0); Y0(2*l0)=s_1(l0); end y0=DEQPSK(Y0); %QPSK解调 m0=viterbi(y0); %维特比译码 [n0,e0]=biterr(m0,S);%计算误比特率 error0=error0+n0; %-------------有信道编码2发1收-------------------- hr0=sqrt(0.5).*(randn(1,N1)+1i.*randn(1,N1)); %瑞利信道函数 hr1=sqrt(0.5).*(randn(1,N1)+1i.*randn(1,N1)); Rr0=hr0.*s0+hr1.*s1; %接收信号矢量(不含高斯噪声) Rr1=-conj(s1).*hr0+hr1.*conj(s0); rN0=(Rr0+sgma.*(randn(1,N1)+1i*randn(1,N1)));%接收信号矢量(含复高斯噪声) rN1=(Rr1+sgma.*(randn(1,N1)+1i*randn(1,N1))); sr_0=conj(hr0).*rN0+hr1.*conj(rN1);%STBC空时译码 sr_1=conj(hr1).*rN0-hr0.*conj(rN1); for l1=1:3*N/4 %将接收到的信号合并 Y1(2*l1-1)=sr_0(l1); Y1(2*l1)=sr_1(l1); end y1=DEQPSK(Y1); %QPSK解调 m1=viterbi(y1); %维特比译码 [n1,e1]=biterr(m1,S);%计算误比特率 error1=error1+n1; BER0(i)=error0/(LOOP*N); BER1(i)=error1/(LOOP*N); end semilogy(SNR_dB,BER0,'-b+'); %定义绘制曲线的线型、标记符号及绘制的线条的颜色。 hold on; semilogy(SNR_dB,BER1, 'r'); grid on; legend('2Tx2R ','2Tx1R '); xlabel('信噪比/dB'); ylabel('误比特码率'); %QPSK.m %QPSK调制 functionmodulatingsignal=QPSK(s) s=s'; H=modem.pskmod('M',4,'InputType','Bit'); %建立QPSK调制对象 modulatingsignal=modulate(H,s); %调制输入数据s modulatingsignal=modulatingsignal'; %调制信号 %convolutionalcode.m %卷积码编码 %msg信号 %constrainlength约束长度(寄存器数目加一) %codegenerator冲击响应g(转换成八进制) functioncode=convolutionalcode(msg) constrainlength=9; %设置约束长度 trel= poly2trellis(constrainlength,[557,663,711]); %设置冲击响应 code= convenc(msg,trel); %对信息进行编码 %viterbi.m %维特比译码 functiondecodingsequence=viterbi(m) trel= poly2trellis(9,[557,663,711]); %输入卷积多项式 tblen=7; %卷积码记忆深度 decodingsequence=vitdec(m,trel,tblen,'trunc','hard');%硬判决 decodingsequence=decodingsequence'; %DEQPSK.m %QPSK译码 functiondemodulatingsignal=DEQPSK(s) h=modem.pskdemod('M',4,'OutputType', 'Bit'); %建立QPSK解调对象 s=s'; demodulatingsignal=demodulate(h,s); %解调信号
|