通信人家园

 找回密码
 注册

只需一步,快速开始

短信验证,便捷登录

搜索

军衔等级:

  新兵

注册:2019-12-12
跳转到指定楼层
1#
发表于 2020-4-23 13:40:32 |只看该作者 |倒序浏览
本代码主要对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);   %解调信号


举报本楼

本帖有 3 个回帖,您需要登录后才能浏览 登录 | 注册
您需要登录后才可以回帖 登录 | 注册 |

手机版|C114 ( 沪ICP备12002291号-1 )|联系我们 |网站地图  

GMT+8, 2024-11-17 06:51 , Processed in 0.503956 second(s), 15 queries , Gzip On.

Copyright © 1999-2023 C114 All Rights Reserved

Discuz Licensed

回顶部