MIMO通信系统的信道估计与信号检测
MIMO通信系统的信道估计与信号检测项目意义义
一项目意
多输入多输出(MIMO)技术由于能够在不增加传输带宽的条件下成倍的提高无线信道的信道容量,因而被认为是下一代移动通信系统4G的关键技术之一。MIMO技术是未来无线通信系统中实现高数据速率传输、改善传输质量、提高系统容量的重要途径。MIMO信道模型无论是在MIMO技术的理论研究阶段还是在MIMO系统的应用阶段都是必需的。因此,MIMO信道的建模是MIMO理论研究中的重要内容。多输入多输出(MIMO)衰落信道是迄今为止所考虑的单输入单输出(SISO)随机信道的多变量推广。从SISO入手,逐步增加天线数,通过对MIMO 信道的建模和仿真,深刻理解MIMO的系统的内涵。
二项目内容
1.MIMO信道的建模。搭建1*1,2*2,4*4,8*8,MIMO-任一路的信道符合
Rayleigh Fading。
2.在接收端基于导频的信道估计。
3.利用估计的信道分别进行MLD和Zero-forcing信号检测。
4.1×1,2×2,4×4,8×8,(理想信道)模型的传输性能比较。
5.1×1,2×2,4×4,8×8,(估计信道)模型的传输性能比较。
6.估计信道和理想信道(4×4)之间的传输性能比较。
三项目原理
(1)MIMO系统模型
以2×2MIMO为例:
r1=H11*S1+H21*S2+n1
n2
r2=H12*S1+H22*S2
+
说明:H信道符合Rayleigh衰落。n为信道的高斯白噪声。S为发射信号,r为接收端接收信号。
(2)基于导频的信道估计
在2×2MIMO信道模型中,导引信号的数量可以是2
当导引信号时p1p2=[10],
r1=H11*p1+H21*p2+n1(p1=0),不考虑噪声的影响
n2(p1=0),不考虑噪声的影响。
r2=H12*S1+H22*S2
+
则有:
H11=r1/p1;
H12=r2/p1;
当导引信号时p1p2=[01],
r1=H11*p1+H21*p2+n1(p1=0),不考虑噪声的影响
r2=H12*S1+H22*S2
n2(p1=0),不考虑噪声的影响。
+
则有:
H21=r1/p2;
H22=r2/p2;
因此,采用导引结构,可以在接收端估计出信道H为:
H=[H11H12
H21H21]
(3)最大似然检测(MLD)
这是理论最优的检测方法,能够完全获得接收分集增益。由估计理论可知,对于Y=HX+Z中的H的估计,最大似然估计方法构造了一种代价函数p(H|Y,X),使该代价函数取得最大值的H为最终的估计值:
本项目主要针对4×4的MIMO系统进行仿真,星座映射图选择QPSK,在接收端采用最大似然检测算法,主要是考察信道估计算法的性能,所以在检测时采用对发射信号空间进行了穷尽搜索的方法来进行最大似然检测,以充分展示信道估计算法的BER性能。
(4)迫零检测(ZF)
迫零检测算法是给接收信号乘以信道矩阵的逆,其他用户对它的的干扰可以消除,但同时噪声也乘以信道矩阵的逆,一般来说,信道矩阵的系数都小于1,那么它的逆就是大于1的,也就是说给噪声乘了一个大于1的因子,必然是放大了噪声。
四项目分析
图一图二
图三图四
结果分析:
从图一图三中可以看出,在MLD检测中,当发射和接收的天线数越多,误码率越低,从而证明了MIMO通信系统可以克服多径衰落带来的不良影响,实现了信号传输的可靠性,而且还可以增加系统容量,提高频谱利用率。
从图二图四中可以看出,在ZF检测中,当发射和接收的天线数越多,误码率越高,迫零检测算法是给接收信号乘以信道矩阵的逆,其他用户对它的的干扰可以消除,但同时噪声也乘以信道矩阵的逆,一般来说,信道矩阵的系数都小于1,那么它的逆就是大于1的,也就是说给噪声乘了一个大于1的因子,必然是放大了噪声。所以误码率会随着天线数的增多而增大。
图五
图六
结果分析
从结果可以看出,使用MLD检测时,理想信道和估计信道误码率总体趋势一样,但理想信道的误码率比估计信道的误码率要低,说明基于导频进行信道估计在MIMO通信系统是可行的。
使用ZF检测时,理想信道和估计信道误码率总体趋势一样,但理想信道的误码率比估计信道的误码率要高,所以一般不建议在基于导频的信道估计中使用ZF检测算法。
图七
图八
结果分析
从结果可以看出,使用理想信道时,MLD算法比ZF算法的误码率小,且总体趋势一样,但在高信噪比部分MLD算法误码率比ZF算法的误码率明显低了很多,说明MLD算法全局搜索的性能极佳。
使用估计信道时,MLD算法和ZF算法的误码率相差不大,其中MLD算法的信噪比稍低一些。
从运算量和运行时间来看,当num=256,loop=1000时,使用MLD算法一共大约1200s,而使用ZF算法一共需要时间大约180s。MLD算法的运算量远大于ZF算法,所用时间也长于ZF算法。
五项目总结
通过本课程的学习,我们知道MIMO将多径无线信道与发射、接收视为一个整体进行优化,从而实现高的通信容量和频谱利用率。这是一种近于最优的空域时域联合的分集和干扰对消处理。而本项目通过建立MIMO通信系统,并基于导频估计出信道H,再利用估计的信道分别进行MLD和Zero-forcing信号检测,最后应用MATLAB对本系统进行仿真,画图,观察图形,通过仿真结果进行误码率分析。从上面进行到的项目过程,我们进一步了解到MIMO系统突出的性能优势,为未来学习4G通信打下基础。
六参考文献
[1].樊昌信通信原理北京国防工业出版社2001
[2].魏巍MATLAB信息工程工具箱技术手册北京国防工业出版社2004
[3].陈永春MATLAB M语言高级编程北京清华大学出版社2004
[4].肖扬MIMO多天线无线通信系统北京人民邮电出版社2009
[5].章坚武移动通信陕西西安电子科技大学出版社2003
七、附录
%4x4天线MLD检测,理想信道与估计信道的MIMO系统误码率分析%
clear all;
close;
Eb_N0=-10:1:10;
tx=4;%发送天线数目%
rx=4;%接收天线数目%
num=256;
loop=1000;%循环次数(100/BER=1000)%
SNR_num=length(Eb_N0);%number of SNR
error=zeros(2,SNR_num);
for p=1:SNR_num
tic
for w=1:loop
Sig=randint(1,num);%随机产生二进制序列
modSig=modBaseBandQPSK(Sig);%QPSK调制
%估计信道发送矩阵初始化%
transmit_array_estimated=zeros(tx,num/tx/2+tx);
transmit_array_estimated(:,1:tx)=eye(tx,tx);
transmit_array_estimated(:,tx+1:num/tx/2+tx)=series2array(modSig,tx)./sqrt(tx);%将序列转换为数组,用于送给不同天线,有功率分配%
%理想信道发送矩阵初始化%
transmit_array_ideal=series2array(modSig,tx)./sqrt(tx);
%4x4MIMO信道%
Channel=zeros(tx,rx,num);
for n=1:tx
for m=1:rx
Channel(n,m,:)=wgn(1,1,0,'complex');
end
end
H=Channel;
%通过MIMO理想信道%
for n=1:num/tx/2
recSig_ideal(:,n)=H(:,:,n)*transmit_array_ideal(:,n);
end
for n=1:tx
recSig_ideal(n,:)=awgn(recSig_ideal(n,:),Eb_N0(p));
end
%通过MIMO估计信道%
for n=1:num/tx/2+tx
recSig_estimated(:,n)=H(:,:,n)*transmit_array_estimated(:,n);
%信号通过4x4MIMO信道
end
%加awgn噪声%
for n=1:tx
recSig_estimated(n,:)=awgn(recSig_estimated(n,:),Eb_N0(p));
end
%估计信道
H_estimated=recSig_estimated(:,1:tx);%信道估计%
receive=recSig_estimated(:,tx+1:num/tx/2+tx);%有用信息(去除信道估计用的信息后)%
%最大似然检测%
S_estimated=MLD1(receive,H_estimated);%估计信道%
S_ideal=MLD1(recSig_ideal,H(:,:,num));%理想信道%
%将数组转换为序列%
x_estimated=conj(S_estimated(:)');%估计信道%
x_ideal=conj(S_ideal(:)');%理想信道%
%QPSK解调%
demodSig_estimated=demodQPSK(x_estimated);%估计信道%
demodSig_ideal=demodQPSK(x_ideal);%理想信道%
%错误点数%
error(1,p)=error(1,p)+length(find((demodSig_estimated-Sig)~=0));%估计信道%
error(2,p)=error(2,p)+length(find((demodSig_ideal-Sig)~=0));%理想信道% end
error(:,p)=error(:,p)/loop/num%误码率%
toc
end
%画误码率曲线
semilogy(Eb_N0,error(1,:),'r*-',Eb_N0,error(2,:),'b*-');
grid on;
title('4×4天线,MLD检测,理想信道和估计信道的性能比较(11组)');
xlabel('E_b/N_0(dB)');
ylabel('误码率');
legend('估计信道误码率曲线','理想信道误码率曲线');
====================================================================== ===========================
%4x4天线,理想信道vs估计信道,ZF检测%
clear all;
close;
Eb_N0=-10:1:10;
tx=4;%发送天线数目%
rx=4;%接收天线数目%
num=256;
loop=1000;%循环次数(100/BER=1000)%
SNR_num=length(Eb_N0);%number of SNR
BER=zeros(2,SNR_num);
for p=1:SNR_num
tic
for w=1:loop
Sig=randint(1,num);%随机产生二进制序列
modSig=modBaseBandQPSK(Sig);%QPSK调制
%估计信道发送矩阵初始化%
transmit_array_estimated=zeros(tx,num/tx/2+tx);
transmit_array_estimated(:,1:tx)=eye(tx,tx);
transmit_array_estimated(:,tx+1:num/tx/2+tx)=series2array(modSig,tx)./sqrt(tx);%将序列转换为数组,用于送给不同天线,有功率分配%
%理想信道发送矩阵初始化%
transmit_array_ideal=series2array(modSig,tx)./sqrt(tx);
%4x4MIMO信道%
Channel=zeros(tx,rx,num);
for n=1:tx
for m=1:rx
Channel(n,m,:)=wgn(1,1,0,'complex');
end
end
H=Channel;
h=(1/sqrt(2))*H(:,:,num)/(sqrt(tx));%对信道进行归一化处理%
%通过MIMO理想信道%
for n=1:num/tx/2
recSig_ideal(:,n)=H(:,:,n)*transmit_array_ideal(:,n);
end
for n=1:tx
recSig_ideal(n,:)=awgn(recSig_ideal(n,:),Eb_N0(p));
end
%通过MIMO估计信道%
for n=1:num/tx/2+tx
recSig_estimated(:,n)=H(:,:,n)*transmit_array_estimated(:,n);
%信号通过4x4MIMO信道
end
%加awgn噪声%
for n=1:tx
recSig_estimated(n,:)=awgn(recSig_estimated(n,:),Eb_N0(p));
end
%估计信道
H_estimated=recSig_estimated(:,1:tx);%信道估计%
receive=recSig_estimated(:,tx+1:num/tx/2+tx);%有用信息(去除信道估计用的信息后)%
%迫零检测%
%估计信道%
y_estimated=pinv(h)*receive;
x_estimated=conj(y_estimated(:)');
demodSig_estimated_ZF=demodQPSK(x_estimated);%QPSK解调%
%理想信道%
y_ideal=pinv(h)*recSig_ideal;
x_ideal=conj(y_ideal(:)');
demodSig_ideal_ZF=demodQPSK(x_ideal);%QPSK解调%
%错误点数%
BER(1,p)=BER(1,p)+length(find((demodSig_estimated_ZF-Sig)~=0));%估计信道%
BER(2,p)=BER(2,p)+length(find((demodSig_ideal_ZF-Sig)~=0));%理想信道%
end
BER(:,p)=BER(:,p)/loop/num%误码率%
toc
end
%画误码率曲线
semilogy(Eb_N0,BER(1,:),'r*-',Eb_N0,BER(2,:),'b*-');
grid on;
title('4×4天线,ZF检测,通过理想信道和估计信道的性能比较(11组)');
xlabel('E_b/N_0(dB)');
ylabel('误码率');
legend('估计信道误码率曲线','理想信道误码率曲线');
====================================================================== =========================
%估计信道,MLD检测的1x1,2x2,4x4天线的MIMO系统误码率曲线比较分析%
clear all;
close;
tx1=1;%发送天线数目为1%
rx1=1;%接收天线数目为1%
tx2=2;%发送天线数目为2%
rx2=2;%接收天线数目为2%
tx3=4;%发送天线数目为4%
rx3=4;%接收天线数目为4%
Eb_N0=-10:1:10;
num=256;
loop=1000;%循环次数%100/BER=1000
SNR_num=length(Eb_N0);
BER=zeros(3,SNR_num);
for p=1:SNR_num
tic
for w=1:loop
Sig=randint(1,num);%随机产生二进制序列%
modSig=modBaseBandQPSK(Sig);%QPSK调制%
%发送信号矩阵初始化%
transmit_array1=zeros(tx1,num/tx1/2+tx1);
transmit_array1(:,1:tx1)=eye(tx1,tx1);
transmit_array2=zeros(tx2,num/tx2/2+tx2);
transmit_array2(:,1:tx2)=eye(tx2,tx2);
transmit_array3=zeros(tx3,num/tx3/2+tx3);
transmit_array3(:,1:tx3)=eye(tx3,tx3);
%发送序列转换为数组,用于送给不同天线,有功率分配%
transmit_array1(:,tx1+1:num/tx1/2+tx1)=series2array(modSig,tx1)./sqrt(tx1);
transmit_array2(:,tx2+1:num/tx2/2+tx2)=series2array(modSig,tx2)./sqrt(tx2);
transmit_array3(:,tx3+1:num/tx3/2+tx3)=series2array(modSig,tx3)./sqrt(tx3);
%1x1MIMO信道%
Channel=zeros(tx1,rx1,num);
for n1=1:tx1
for m1=1:rx1
Channel(n1,m1,:)=wgn(1,1,0,'complex');
end
end
H1=Channel;
%2x2MIMO信道%
Channel2=zeros(tx2,rx2,num);
for n2=1:tx2
for m2=1:rx2
Channel2(n2,m2,:)=wgn(1,1,0,'complex');
end
end
H2=Channel2;
%4x4MIMO信道%
Channel3=zeros(tx3,rx3,num);
for n3=1:tx3
for m3=1:rx3
Channel3(n3,m3,:)=wgn(1,1,0,'complex');
end
end
H3=Channel3;
%信号通过MIMO信道%
for n=1:num/tx1/2+tx1
recSig1(:,n)=H1(:,:,n)*transmit_array1(:,n);%信号通过1x1MIMO信道
end
for n=1:num/tx2/2+tx2
recSig2(:,n)=H2(:,:,n)*transmit_array2(:,n);%信号通过2x2MIMO信道
end
for n=1:num/tx3/2+tx3
recSig3(:,n)=H3(:,:,n)*transmit_array3(:,n);
end
%加awgn噪声%
for n=1:tx1%1x1
recSig1(n,:)=awgn(recSig1(n,:),Eb_N0(p));
end
for n=1:tx2%2x2
recSig2(n,:)=awgn(recSig2(n,:),Eb_N0(p));
end
for n=1:tx3
recSig3(n,:)=awgn(recSig3(n,:),Eb_N0(p));
end
%信道估计%
H_estimated1=recSig1(:,1:tx1);%1x1
H_estimated2=recSig2(:,1:tx2);%2x2
H_estimated3=recSig3(:,1:tx3);%4x4
%有用信息(去除信道估计用的信息后)%
receive1=recSig1(:,tx1+1:num/tx1/2+tx1);
receive2=recSig2(:,tx2+1:num/tx2/2+tx2);
receive3=recSig3(:,tx3+1:num/tx3/2+tx3);
%最大似然检测%
S1=MLD1(receive1,H_estimated1);%1x1
S2=MLD1(receive2,H_estimated2);%2x2
S3=MLD1(receive3,H_estimated3);%4x4
%将数组转换为序列%
x1=conj(S1(:)');
x2=conj(S2(:)');
x3=conj(S3(:)');
%QPSK解调%
demodSig1=demodQPSK(x1);
demodSig2=demodQPSK(x2);
demodSig3=demodQPSK(x3);
BER(1,p)=BER(1,p)+length(find((demodSig1-Sig)~=0));%1x1错误点数
BER(2,p)=BER(2,p)+length(find((demodSig2-Sig)~=0));%2x2错误点数
BER(3,p)=BER(3,p)+length(find((demodSig3-Sig)~=0));%4x4错误点数
end
BER(:,p)=BER(:,p)/loop/num%误码率%
toc
end
%画误码率曲线%
semilogy(Eb_N0,BER(1,:),'r*-',Eb_N0,BER(2,:),'g*-',Eb_N0,BER(3,:),'b*-');
grid on;
title('导频估计信道,MLD检测,MIMO系统1x1,2x2,4x4天线性能比较(11组)');
xlabel('E_b/N_0(dB)');
ylabel('误码率');
legend('1x1天线误码率曲线','2x2天线误码率曲线','4x4天线误码率曲线');
====================================================================== ============================
%估计信道,MLD和ZF检测下的4x4天线MIMO系统误码率曲线比较分析%
clear all;
close;
tx=4;%发送天线数目为4%
rx=4;%接收天线数目为4%
Eb_N0=-10:1:10;
num=256;
loop=1000;%循环次数%100/BER=1000
SNR_num=length(Eb_N0);
BER=zeros(2,SNR_num);
for p=1:SNR_num
tic
for w=1:loop
Sig=randint(1,num);%随机产生二进制序列%
modSig=modBaseBandQPSK(Sig);%QPSK调制%
transmit_array=zeros(tx,num/tx/2+tx);
transmit_array(:,1:tx)=eye(tx,tx);%4x4天线导频信号%
%将序列转换为数组,用于送给不同天线,有功率分配%
transmit_array(:,tx+1:num/tx/2+tx)=series2array(modSig,tx)./sqrt(tx);
%4x4MIMO信道%
Channel=zeros(tx,rx,num);
for n=1:tx
for m=1:rx
Channel(n,m,:)=wgn(1,1,0,'complex');
end
end
H=Channel;
%信号通过MIMO信道%
for n=1:num/tx/2+tx
recSig(:,n)=H(:,:,n)*transmit_array(:,n);
end
%加awgn噪声%
for n=1:tx
recSig(n,:)=awgn(recSig(n,:),Eb_N0(p));
end
%信道估计%
H_estimated=recSig(:,1:tx);%4x4
receive=recSig(:,tx+1:num/tx/2+tx);%有用信息(去除信道估计用的信息后)%
%最大似然检测%
S=MLD1(receive,H_estimated);%4x4
x_MLD=conj(S(:)');%将数组转换为序列%
demodSig_MLD=demodQPSK(x_MLD);%QPSK解调%
BER(1,p)=BER(1,p)+length(find((demodSig_MLD-Sig)~=0));%错误点数
%迫零检测%
h=(1/sqrt(2))*H(:,:,num)/(sqrt(tx));%对信道进行归一化处理%
y=pinv(h)*receive;
x_ZF=conj(y(:)');
demodSig_ZF=demodQPSK(x_ZF);
BER(2,p)=BER(2,p)+length(find((demodSig_ZF-Sig)~=0));%错误点数
end
BER(:,p)=BER(:,p)/loop/num%误码率%
toc
end
%画误码率曲线%
semilogy(Eb_N0,BER(1,:),'r*-',Eb_N0,BER(2,:),'g*-');
grid on;
title('估计信道,MLD和ZF检测下的4x4天线MIMO系统误码率曲线比较分析(11组)'); xlabel('E_b/N_0(dB)');
ylabel('误码率');
legend('MLD检测天线误码率曲线','ZF检测天线误码率曲线');
====================================================================== ================
%导频序列估计信道,ZF检测下,MIMO系统1x1,2x2,4x4天线性能比较%
clear all;
close;
tx1=1;%发送天线数目为1%
rx1=1;%接收天线数目为1%
tx2=2;%发送天线数目为2%
rx2=2;%接收天线数目为2%
tx3=4;%发送天线数目为4%
rx3=4;%接收天线数目为4%
Eb_N0=-10:1:10;
num=256;
loop=1000;%循环次数%100/BER=1000
SNR_num=length(Eb_N0);
BER=zeros(3,SNR_num);
for p=1:SNR_num
tic
for w=1:loop
Sig=randint(1,num);%随机产生二进制序列%
modSig=modBaseBandQPSK(Sig);%QPSK调制%
transmit_array1=zeros(tx1,num/tx1/2+tx1);
transmit_array1(:,1:tx1)=eye(tx1,tx1);%1x1天线导频信号%
transmit_array2=zeros(tx2,num/tx2/2+tx2);
transmit_array2(:,1:tx2)=eye(tx2,tx2);%2x2天线导频信号%
transmit_array3=zeros(tx3,num/tx3/2+tx3);
transmit_array3(:,1:tx3)=eye(tx3,tx3);%4x4天线导频信号%
%将序列转换为数组,用于送给不同天线,有功率分配%
transmit_array1(:,tx1+1:num/tx1/2+tx1)=series2array(modSig,tx1)./sqrt(tx1);
transmit_array2(:,tx2+1:num/tx2/2+tx2)=series2array(modSig,tx2)./sqrt(tx2);
transmit_array3(:,tx3+1:num/tx3/2+tx3)=series2array(modSig,tx3)./sqrt(tx3);
%1x1MIMO信道%
Channel=zeros(tx1,rx1,num);
for n1=1:tx1
for m1=1:rx1
Channel(n1,m1,:)=wgn(1,1,0,'complex');
end
end
H1=Channel;
%2x2MIMO信道%
Channel2=zeros(tx2,rx2,num);
for n2=1:tx2
for m2=1:rx2
Channel2(n2,m2,:)=wgn(1,1,0,'complex');
end
end
H2=Channel2;
%4x4MIMO信道%
Channel3=zeros(tx3,rx3,num);
for n3=1:tx3
for m3=1:rx3
Channel3(n3,m3,:)=wgn(1,1,0,'complex');
end
end
H3=Channel3;
%信号通过MIMO信道%
for n=1:num/tx1/2+tx1
recSig1(:,n)=H1(:,:,n)*transmit_array1(:,n);%信号通过1x1MIMO信道
end
for n=1:num/tx2/2+tx2
recSig2(:,n)=H2(:,:,n)*transmit_array2(:,n);%信号通过2x2MIMO信道
end
for n=1:num/tx3/2+tx3
recSig3(:,n)=H3(:,:,n)*transmit_array3(:,n);%信号通过4x4MIMO信道
end
%加awgn噪声%
for n=1:tx1%1x1
recSig1(n,:)=awgn(recSig1(n,:),Eb_N0(p));
end
for n=1:tx2%2x2
recSig2(n,:)=awgn(recSig2(n,:),Eb_N0(p));
end
for n=1:tx3%4x4
recSig3(n,:)=awgn(recSig3(n,:),Eb_N0(p));
end
%信道估计%
H_estimated1=recSig1(:,1:tx1);%1x1
H_estimated2=recSig2(:,1:tx2);%2x2
H_estimated3=recSig3(:,1:tx3);%4x4
%有用信息(去除信道估计用的信息后)%
receive1=recSig1(:,tx1+1:num/tx1/2+tx1);
receive2=recSig2(:,tx2+1:num/tx2/2+tx2);
receive3=recSig3(:,tx3+1:num/tx3/2+tx3);