引言:
近日,博主与队友共同完成了小学期作业——“基于Matlab的MIMO通信系统仿真”,收获良多,特将其记录下来,与诸位分享。此主题分为上下两部分,第一部分主要涉及系统架构,第二部分侧重程序优化。若能帮助读者一二,实属万幸。
PS:信源、信道编码译码、调制解调由队友独立完成,特此声明。
系统结构:
1、产生信源
function bit_in=bit_source(len)
% source generation
% this program generate the information source
% input:len ->the length of binary source which will be generate
% output:bit_in ->the binary source(01010....)
%% begin
bit_in=randi([0 1],1,len);
end
2、信道编码
- 卷积码
function code= codec2( m ) % input:m -> bit source % output:code g0=[1 0 1 1 0 1 1 1 1]; %g0=[1 1 1 1 0 1 1 0 1]; g1=[1 1 0 1 1 0 0 1 1]; %g1=[1 1 0 0 1 1 0 1 1] g2=[1 1 1 0 0 1 0 0 1]; %g2=[1 0 0 1 0 0 1 1 1]; m0=conv(m,g0); m1=conv(m,g1); m2=conv(m,g2); l=length(m0); for i=1:l; code([3*i-2])=rem(m0([i]),2); code([3*i-1])=rem(m1([i]),2); code([3*i])=rem(m2([i]),2); end end
- 咬尾卷积码
function code= TailBiting_codec(m) num=length(m); constLen=7; fprintf('信号长度%d\n',length(m)); %1/2咬尾卷积码:先输入尾部的码6比特,再输入正常码 c = [m(end-(constLen-2):end),m]; fprintf('补充尾部后信号长度%d\n',length(c)); %打孔器设计 %信号的长度必须是打孔向量长度的整数倍 %打孔长度本来为num/2*4 比特,但是由于信号多输入了6比特,会多产生12比特,所以打孔向量的长度为num/2*4 +12 %这12比特需要被被完全打掉 g = [1 0 1 1 0 1 1 ;1 1 1 1 0 0 1;1 1 1 0 1 0 1]; g =reshape(g,1,21); for i = 1:(num/2)-1 g = [g,1 1 1 0 1 1 1 1 1 1 1 0 0 0 1 1 0 0 1 1 1]; end %前面补0是为了打孔时,将前面的尾部生成的比特打掉(尾部本来是应该放在初始状态中的) g = [zeros(1,12),g]; fprintf('打孔器的长度为 %d\n',length(g)) % 卷积编码 trellis = poly2trellis([7],[133 171 165]); code= convenc(c, trellis); fprintf('卷积编码输出长度为 %d\n',length(code)) end
3、调制(QPSK)
function QPSK = QPSK_F( m )
%UNTITLED 此处显示有关此函数的摘要
% 此处显示详细说明
num=length(m);
QPSK_in=-2*m+1;% 转换成双极性非归零码
QPSK_in_I=QPSK_in(1:2: (num-1));
QPSK_in_Q=QPSK_in(2:2:num);
QPSK_IQ=[QPSK_in_I;QPSK_in_Q];
p=[1,1i];
QPSK=p*QPSK_IQ;
end
4、stbc编码
function send = stbc( qpsk )
% stbc encoding for sending signal
% this pr