http://www.pudn.com/downloads95/sourcecode/comm/detail381335.html
一个教你如何用 matlab 写 mimo 系统的程序,可以任意改变编码方式和天线数目,真的不
错 -A teach you how to write matlab MIMO system procedures, can change the number of
encoding and antenna, really good
二、在 MIMO 系统中的二乘二系统的模型代码,以及性能分析
%**************** 内容:发射端已知 SVD ****************
%****************
****************
%**************** 编程人:徐娜 ***********************
%**************** 时间:2008.2.27 ********************
4*4 STBC U 1
clear;
clc;
%**************************** 初始化 ******************************
Num_Tr = 4;
Num_Re = 4;
Len_Frame = 100;
Data = zeros(1,Num_Tr*Len_Frame);
矩阵,这里是串行数据向量,数据个数与分层一样)
Data_Modulated=zeros(1,Num_Tr*Len_Frame);
Transmit = zeros(Num_Tr,Num_Tr*Len_Frame*2);
Receive = zeros(Num_Re,Num_Tr*Len_Frame*2);
SNR_Begin = 0;
SNR_Step = 5;
SNR_End = 30;
Step_Num = (SNR_End - SNR_Begin)/SNR_Step+1;
Err = zeros(Step_Num,1);
便在 Monte Carlo 仿真时叠加
% 发射天线数
% 接收天线数
% 每帧数据长度
% 原始数据(分层空时码原始数据是
% 已调信号
% 发射符号矩阵
% 加噪声时的接收信号
% SNR 单位为 dB
% SNR 坐标的个数
% 对各 SNR 下的误码个数初始化,以
a = 0;
for SNR0 = SNR_Begin : SNR_Step : SNR_End
% 将信噪比的取值点存成向量
a = a+1;
SNR(a,1) = SNR0;
end
table=exp(j*[pi/4 3*pi/4 -3*pi/4 -pi/4]);
板
% 产生 QPSK 信号星座图模
temp=[];
temp1=[];
temp2=[];
for a=1:4
for b=1:4
for c=1:4
for d=1:4
temp1=[table(a);table(b);table(c);table(d)];
temp2=[temp2 temp1];
temp1=[];
end
temp=[temp temp2];
temp2=[];
end
temp=[temp temp2];
temp2=[];
end
temp=[temp temp2];
temp2=[];
end
矩阵 temp 的维数为 4*256
t = waitbar(0,'Please wait...');
% 模板
Num_Mon = 2500;
% Monte Carlo 仿真次数(发送帧数)
%************************* Monte Carlo 仿真 *************************
for MM = 1:Num_Mon
%**************************** 发射信号 *****************************
Fd = 1;
Fs = 1*Fd;
Md = 4;
Md=4,则 Md_PSK=QPSK
% 消息序列的采样速率
% 已调信号的采样速率
% 调制进制数,如: 若 Md=2,则 Md_PSK=BPSK;若
Data = randint(1,Num_Tr*Len_Frame,Md);
制,则此处 Data 为 0-3 的整数)
Data_Modulated = dmodce(Data,Fd,Fs,'QAM',Md);
% 随机产生原始信号(4QAM 调
% 生成 Md 进制的 QAM 调制信号
for k=1:Len_Frame;
%产生发射信号
Transmit(1,8*k-7)= Data_Modulated(1,4*k-3);
Transmit(1,8*k-6)=-Data_Modulated(1,4*k-2);
Transmit(1,8*k-5)=-Data_Modulated(1,4*k-1);
Transmit(1,8*k-4)=-Data_Modulated(1,4*k);
Transmit(1,8*k-3)= conj(Data_Modulated(1,4*k-3));
Transmit(1,8*k-2)=-conj(Data_Modulated(1,4*k-2));
Transmit(1,8*k-1)=-conj(Data_Modulated(1,4*k-1));
Transmit(1,8*k) =-conj(Data_Modulated(1,4*k));
Transmit(2,8*k-7)= Data_Modulated(1,4*k-2);
Transmit(2,8*k-6)= Data_Modulated(1,4*k-3);
Transmit(2,8*k-5)= Data_Modulated(1,4*k);
Transmit(2,8*k-4)=-Data_Modulated(1,4*k-1);
Transmit(2,8*k-3)= conj(Data_Modulated(1,4*k-2));
Transmit(2,8*k-2)= conj(Data_Modulated(1,4*k-3));
Transmit(2,8*k-1)= conj(Data_Modulated(1,4*k));
Transmit(2,8*k) =-conj(Data_Modulated(1,4*k-1));
Transmit(3,8*k-7)= Data_Modulated(1,4*k-1);
Transmit(3,8*k-6)=-Data_Modulated(1,4*k);
Transmit(3,8*k-5)= Data_Modulated(1,4*k-3);
Transmit(3,8*k-4)= Data_Modulated(1,4*k-2);
Transmit(3,8*k-3)= conj(Data_Modulated(1,4*k-1));
Transmit(3,8*k-2)=-conj(Data_Modulated(1,4*k));
Transmit(3,8*k-1)= conj(Data_Modulated(1,4*k-3));
Transmit(3,8*k) = conj(Data_Modulated(1,4*k-2));
Transmit(4,8*k-7)= Data_Modulated(1,4*k);
Transmit(4,8*k-6)= Data_Modulated(1,4*k-1);
Transmit(4,8*k-5)=-Data_Modulated(1,4*k-2);
Transmit(4,8*k-4)= Data_Modulated(1,4*k-3);
Transmit(4,8*k-3)= conj(Data_Modulated(1,4*k));
Transmit(4,8*k-2)= conj(Data_Modulated(1,4*k-1));
Transmit(4,8*k-1)=-conj(Data_Modulated(1,4*k-2));
Transmit(4,8*k) = conj(Data_Modulated(1,4*k-3));
end
if Md == 2
Transmit = Transmit;
16QAM 等,还需增加代码
elseif Md == 4
Transmit = Transmit/sqrt(2);
else
Md
disp('没有定义此时的情况,请修改程序');
return
end
% 每根发送天线发送功率归一化
% 此处只适用 Md=2 和 4,对于
%**************************** MIMO 信道 *****************************
%H = zeros(Num_Re,Num_Tr);
%x = randn(Num_Re,Num_Tr);
%Rayleigh 信道
%y = randn(Num_Re,Num_Tr);
%H(:,:) = x + j*y ;
%H
=random('Rayleigh',sqrt(0.5),Num_Re,Num_Tr)+i*random('Rayleigh',sqrt(0.5),Num_Re,Num_Tr)
;
%Rayleigh 信道
H
=random('Rayleigh',sqrt(0.5),Num_Re,Num_Tr)+i*random('Rayleigh',sqrt(0.5),Num_Re,Num_Tr)
;
[Q R]=qr(H);
H_U=Q;
%得到酉矩阵
%酉矩阵的奇异值全为 1,乘以 4 将奇异值改为 4
%************************ 接收信号(无噪声) *************************
Receive_noN = zeros( Num_Re, Num_Tr*Len_Frame*2 );
Receive_noN = H_U * Transmit;
% 不加噪声时的接收信号
% 接收信号
%********************* 不同 SNR 条件下接收译码 ***********************
a = 0;
for SNR0 = SNR_Begin : SNR_Step : SNR_End
a = a+1;
% ---------------------- 定义噪声 -------------------------
% 将信噪比的取值点存成向量
Power_Sig = sum( sum( abs(H_U).^2 ) );
Power_Noise = Power_Sig * 10^(-SNR0/10);
% 所有接收天线上总的信号功率
% 采用等增益合并方式,各接收
天线上噪声功率相等
功率来改变(增加)信噪比
% 通过改变(降低)每次的噪声
Noise = 1/sqrt(2) * ( normrnd( 0,sqrt(Power_Noise),Num_Tr,(Num_Tr*Len_Frame*2) ) +
j*normrnd( 0,sqrt(Power_Noise),Num_Tr,(Num_Tr*Len_Frame*2) )
); % 定义噪声
% 除以 sqrt(2)是因为复高斯
噪声功率为实部虚部平方和
% ---------------------- 接收信号 -------------------------
Receive = Receive_noN + Noise;
% ------------------------ 译码 ---------------------------
Receive_Decode=zeros(Num_Re,Len_Frame);
for k=1:Len_Frame
% 书 94 页
for p=1:Num_Re
Receive_Decode(1,k)=Receive_Decode(1,k)+Receive(p,8*k-7)*conj(H(p,1))+Receive(p,8*k-6)*c
onj(H(p,2))+Receive(p,8*k-5)*conj(H(p,3))+Receive(p,8*k-4)*conj(H(p,4))+conj(Receive(p,8*k-
3))*H(p,1)+conj(Receive(p,8*k-2))*H(p,2)+conj(Receive(p,8*k-1))*H(p,3)+conj(Receive(p,8*k))
*H(p,4);
Receive_Decode(2,k)=Receive_Decode(2,k)+Receive(p,8*k-7)*conj(H(p,2))-Receive(p,8*k-6)*c
onj(H(p,1))-Receive(p,8*k-5)*conj(H(p,4))+Receive(p,8*k-4)*conj(H(p,3))+conj(Receive(p,8*k-
3))*H(p,2)-conj(Receive(p,8*k-2))*H(p,1)-conj(Receive(p,8*k-1))*H(p,4)+conj(Receive(p,8*k))*
H(p,3);
Receive_Decode(3,k)=Receive_Decode(3,k)+Receive(p,8*k-7)*conj(H(p,3))+Receive(p,8*k-6)*c
onj(H(p,4))-Receive(p,8*k-5)*conj(H(p,1))-Receive(p,8*k-4)*conj(H(p,2))+conj(Receive(p,8*k-3)
)*H(p,3)+conj(Receive(p,8*k-2))*H(p,4)-conj(Receive(p,8*k-1))*H(p,1)-conj(Receive(p,8*k))*H
(p,2);
Receive_Decode(4,k)=Receive_Decode(4,k)+Receive(p,8*k-7)*conj(H(p,4))-Receive(p,8*k-6)*c
onj(H(p,3))+Receive(p,8*k-5)*conj(H(p,2))-Receive(p,8*k-4)*conj(H(p,1))+conj(Receive(p,8*k-
3))*H(p,4)-conj(Receive(p,8*k-2))*H(p,3)+conj(Receive(p,8*k-1))*H(p,2)-conj(Receive(p,8*k))*
H(p,1);
end
end
h=norm(H_U,'fro');
Receive_Decode=Receive_Decode/(2*(h.^2));
%----------------- STBC 的 ML 译码 -------------------
% 译码后
dif=[];
Decode=[];
的结果
for m=1:Len_Frame
for n=1:256
dif(:,n)=abs(Receive_Decode(:,m)-temp(:,n)).^2;
end
f=sum(dif);
[y1 x1]=min(f);
Decode(:,m)=[temp(:,x1)];
dif=[];
f=[];
end
% -------------- 求误码个数(不是误 bit 个数) ----------------
for q=1:Len_Frame
Data_Matrix(1,q)=Data(1,4*q-3);
Data_Matrix(2,q)=Data(1,4*q-2);
Data_Matrix(3,q)=Data(1,4*q-1);
Data_Matrix(4,q)=Data(1,4*q);
end
Data_Est = ddemodce(Decode,Fd,Fs,'QAM',Md);
% 对译码结果进行判决,并
转化为 0-3
Err(a,1) = nnz(Data_Matrix - Data_Est) + Err(a,1);
end
% 结束不同 SNR 的循环
waitbar(MM/Num_Mon);
end
% 结束不同 Monte Carlo 循环
close(t);
SER=Err/(Num_Tr*Len_Frame*Num_Mon)
%************************** 显示误码率曲线 **************************
semilogy(SNR,SER,'o-');
xlabel('SNR(dB)');
ylabel('SER');