MIMO大规模天线阵列原理与matlab仿真(含GUI)

一 设计实现流程

1.MIMO系统原理

传统的无线通信系统是采用一个发送天线和一个接收天线的通信系统,即单输入单输出(SISO)天线系统。但由于单天线系统的信道容量较低,不能满足4G、5G数据传输需求,由香农公式可知,提高信道容量有两种方式,一是增大带宽,二是提高信噪比(增大发射功率)。但由于频谱资源比较珍稀,多径效应等缘故,增大带宽方式并不实用;而增大带宽带来的增益十分有限,显得并不划算。鉴于以上原因,MIMO应运而生,在功率和带宽受限的情况下,通过增加天线数量来充分利用无线信道的空间资源,使单路传输变为多路传输,从而提高信道容量。一个MIMO信道可以转换成多个并行的相互独立的信道,可见MIMO并不违背香农公式,且通过增加天线充分利用无线信道提高了信道总容量。

MIMO大规模天线阵列原理与matlab仿真(含GUI)_第1张图片

图1 MIMO系统模型

MIMO系统就是多个信号流在空中的并行传输。在发射端输入的数据流变成几路并行的符号流,分别从Mt个天线同时发射出去;接收端从Mr个接收天线将信号接收下来,恢复原始信号。多个信号流可以是不同的数据流,也可以是同一个数据流的不同版本。不同的数据流就是不同的信息同时发射,意味着信息传送效率的提升,提高了无线通信的效率。(如空分复用)

同一个数据流的不同版本,就是同样的信息,不同的表达方式,并行发射出去,确保接受端收到信息的准确,提高信息传送的可靠性。(如空间分集)

为提高信息传送效率的工作模式,就是MIMO的复用模式;为提高信息传送可靠性的工作模式,就是MIMO的分集模式。

MIMO大规模天线阵列原理与matlab仿真(含GUI)_第2张图片

图2 MIMO系统优势

2.SISO实现

传统天线系统的结构框图是系统模型,主要用到信号与信道的调制,以及噪声的一个调制,接收端解调用到最大似然解调。

3.空时编码原理

空时编码主要应用于多发射天线中,信号同时在不同的天线上发射,或者被不同的天线接收,获得空间分集,信号在不同的时间在相同的子信道上进行传输,获得时间分集,时域上的分隔和地理位置上的分隔产生了空时特性,接收天线可以收到该发射信号的数个拷贝,并对接收到的多个数据进行合并检测,提高了传输可靠程度。因此空时编码不仅减少了误码率,还能提高频带利用率,于是系统容量随即提高。本实验主要介绍Alamouti方案。

在Alamouti方案中,对于在两个时隙连续发送的两个符号x1和x2,第一个发射天线和第二个发射天线在第一个时隙分别发送的是x1,x2,第一个发射天线和第二个发射天线在第二个时隙分别发送的是-x2*,x1*,下图为发射过程。

MIMO大规模天线阵列原理与matlab仿真(含GUI)_第3张图片

图4 Alamouti方案

该传输方案通常由矩阵表示,矩阵的每一列代表一个时隙,每一行代表一个天线随着时间的传输,所以天线的发射序列如下

Alamouti方案中最主要特征是两根发射天线上的发射序列是相互正交的。

MIMO大规模天线阵列原理与matlab仿真(含GUI)_第4张图片

图5 接收机流程图

接收信号矢量表示如下

MIMO大规模天线阵列原理与matlab仿真(含GUI)_第5张图片

Alamouti方案在发射天线为2接收天线为1的情况下能够获得最大的分集增益2。即使接收端没有多根天线,同样能够获得空间分集增益,从而使该方案很有价值。

4.空间调制原理

空间调制是一种多天线多维调制技术。其原理是输入比特流经发射端后分成两个部分:一个部分信息映射到调制发射天线序号;另外一个部分映射到调制发射天线符号,该系统将天线维度作为第三维,让天线的选择部分同时携带大量信息,充分利用空间资源。

MIMO大规模天线阵列原理与matlab仿真(含GUI)_第6张图片

图6 空间调制无线通信系统

每个时刻只有一根天线激活来发送数据输入比特信息中有log2Nt比特用于选择发送天线,剩余的用于传输符号映射,发射天线和调制阶数决定了系统的传输速率。下图为4天线的发射实例。

 MIMO大规模天线阵列原理与matlab仿真(含GUI)_第7张图片MIMO大规模天线阵列原理与matlab仿真(含GUI)_第8张图片

       图7 发射实例                      图8 发射天线三维图

空间调制的发射向量只有一个是非零元素,接收信号为

Y=Hx+n

接收天线和发送天线的信道增益H为

H=[h1 ... hj ... hNi]

式中,信道矩阵H中元素均值为0,方差为1,n表示N维噪声向量,对于发射信号的检测即为相应的发射天线及其传输的符号。

综上,空时编码设计简单巧妙,是一种有效的发射分集技术,虽然能够较好地提升系统的性能,但是数据的传输速率相对较低,是一种牺牲速率来提高性能的传输方案。

5.采用迫零算法(ZF)检测原理

迫零检测算法是最简单的一种空时信号处理接收技术,可以消除所有的乘性干扰和信号之间的干扰,其对信号的处理包含三个步骤:迫零、干扰抵消和信号补偿。迫零处理方法通过迫零向量来消除信道的乘性干扰,并消除没有被检测出的接收信号分量的干扰;干扰抵消就是在接收信号向量中消除已经被估计出的部分信号成分,从而消除该信号对未检测出来的信号成分的干扰;为确定信号的检查顺序,需要对其进行信号补偿。

迫零检测的主要目的是寻找一个加权矩阵,乘以接收端的信号,然后将所得结果经判决后可作为对X的估计。

可以得到ZF检验结果为:

迫零检测复杂度低,消除了不同天线之间的干扰,将不同的数据流进行分离,但是以增强噪声作为代价,造成了检测性能较差。

6.采用最小均方误差(MMSE)检测原理

相比于同为线性检测方法的迫零检测,MMSE检测可以综合考虑符号间干扰和噪声对算法性能的影响。其基本原理就是最小化检测器的输出估计和实际发送的符号之间的均方误差。通过加权矩阵

可以得到估计信号为:

由于考虑了噪声的影响,MMSE检验算法的性能要优于ZF检测,它综合考虑了天线之间的干扰和噪声造成的影响,实质上是对ZF检测进行修正,其修正值与噪声方差成正比,从而既能消除天线之间的干扰,又能克服噪声的增强。

7.采用最大似然(ML)检测原理

最大似然检测算法作为V-BLAST系统最优的检测算法其基本思想是:在接收端保存所有发射端可能发送的符号向量,在接收端计算接收到的发射信号与所保存的所有发射端向量在接收空间的映射之间的欧式距离,从而最小欧式距离对应的信号可作为对发射信号的估计。

    数学表达式为:

不难看出最大似然检测算法就是计算每一个Y与集合空间中的序列一一比较,找出对X的估计,这样它的复杂度随发射天线数目呈指数增加,运算量也会随之增大

8.排列串行干扰抵消(OSIC)检测原理

OSIC的基本思想为:在接收端按顺序检测每一个信号,每次检测出一个信号,然后将该信号从接收信号中消除。在实现干扰消除步骤时,前一步的检测性能会对后一步的检测性能造成直接影响。若前一步的检测结果正确,那么下一步检测性能的可靠性将得到改善;若前一步检测结果不正确,这样的错误造成的影响被传到下一步,从而造成下一步检测结果的准确率降低,这就是误差传播现象,因此进行检测时,要确定好检测顺序。

检测过程:

a.求出第k1层对应的加权向量wk1,则第k1层的判决量为rk1=wk1TY,对其判决,得到第k1层发射信号的估计值xk1

b.实现干扰消除,在接收信号Y中剪掉xk1的影响,可得到Y2=Y-xk1Hk1

c.求与k2层对应的加权向量wk2,则第k2层信号的判决量为rk2=wk2TY2,得到第k1层发射信号的估计值xk2

重复上述步骤便可得到每层的发射信号

部分代码展示

(一)SISO代码分析

MIMO大规模天线阵列原理与matlab仿真(含GUI)_第9张图片

对信号进行调制与归一化处理,重组发送信号。设计信道与高斯白噪声,使其归一化,信号过系统,得到接收信号y。

通过最大似然估计得到最小距离,然后分路恢复出发送信号。与原始信号对比,计算BER并绘制图像。

(二)MIMO空时编码分析

MIMO大规模天线阵列原理与matlab仿真(含GUI)_第10张图片

利用两个时隙组成一个发射信号矩阵X1,设计信道与噪声,得到R1,接收方两个天线都可以接收发射方两个天线的发射组合,最后利用接收信号矩阵与信道矩阵进行解耦合得到y11和y22。

(三)MIMO空间调制分析

MIMO大规模天线阵列原理与matlab仿真(含GUI)_第11张图片

仿真2发2收的空间调制系统,由于附带天线索引,一个信息段长度为1bit天线索引+2bit信息长度。

MIMO大规模天线阵列原理与matlab仿真(含GUI)_第12张图片

空间调制的具体实现,每个数据段第一个bit用来选择天线,0-第一根,1-第二根。后两位用来进行QPSK调制为复数信号,最后生成2行1列的发送output。

(四)ML检测代码分析

MIMO大规模天线阵列原理与matlab仿真(含GUI)_第13张图片

根据QPSK的星座图,得到00、01、10、11所在值并对其进行归一化处理。让接收信号y分别与这四个过h的星座点比较大小,将结果储存在V中,再求出最小距离y_d。

MIMO大规模天线阵列原理与matlab仿真(含GUI)_第14张图片

同理,16QAM的原理与QPSK大体相同。将16个星座点储存在J中,让接收信号y分别与这16个过h的星座点比较大小,将结果储存在V中,再求出最小距离y_d,不同之处还体现在归一化。

MIMO大规模天线阵列原理与matlab仿真(含GUI)_第15张图片

对于空间调制的检验,也是利用ML检验算法,由于为2发2收的系统,加上天线索引,所以需要8组数来比对。

MIMO大规模天线阵列原理与matlab仿真(含GUI)_第16张图片

 三 结果分析

(一)MIMO调制方式对比

MIMO大规模天线阵列原理与matlab仿真(含GUI)_第17张图片

图11 MIMO调制方式对比

2x2的MIMO系统,采用格雷映射,调制方式分别为BPSK和QPSK两种情况,BPSK和QPSK两种情况下的SNR-BER性能曲线。

分析:由理论分析及结果可知,在相同信号速率下,使用BPSK比QPSK的BER要低,由于仿真数量设置不当,导致在高信噪比时曲线不平滑,出现了阶跃点。

(二)SISO与MIMO对比

MIMO大规模天线阵列原理与matlab仿真(含GUI)_第18张图片

图12  MIMO的BPSK与SISO的QPSK对比

SISO系统采取单发单收,QPSK调制;MIMO系统采取2发2收,BPSK调制。接收端都采用最大似然接收。

分析:由理论分析及结果可知,MIMO的BPSK与SISO的QPSK对比,MIMO的BPSK比SISO的QPSK的抗干扰性能要好。

MIMO大规模天线阵列原理与matlab仿真(含GUI)_第19张图片

图13  MIMO的QPSK与SISO的16QAM对比

SISO系统采取单发单收,16QAM调制;MIMO系统采取2发2收,QPSK调制。接收端都采用最大似然接收。

分析:由理论分析及结果可知,MIMO的QPSK与SISO的16QAM对比,MIMO的QPSK比SISO的16QAM的抗干扰性能要好。

(三)不同接收方式的对比

MIMO大规模天线阵列原理与matlab仿真(含GUI)_第20张图片

图14  ZF算法与MMSE算法对比

MIMO系统采取2发2收,BPSK调制,接收端采用ZF检验与MMSE检验。

分析:对比线性检测算法的优劣,由于ML为非线性,性能会优于线性检测算法。通过图像对比,我们可以看出在信噪比相同的情况下使用MMSE检测的性能会比ZF检测性能要好并且不管是在高信噪比还是低信噪比MMSE算法性能都是更好的,这主要是由于MMSE算法综合考虑了天线之间的干扰和噪声造成的影响,实质上是对ZF检测进行修正,使其性能更好。

MATLAB代码展示

%%%%qpskb调制函数
function[a,b,c,d,e]=qpskmod(x)
datasize=x;
%生成10000个01/11/00/10的随机数列作为初始信号  
r=randi([0,1],1,datasize);
%分成两列,第一列代表实部,第二列代表虚部
s=reshape(r,datasize/2,2);
rs=s;
e=zeros(1,datasize);
for k=1:1:datasize
    if mod(k,2)==1
        e(k)=rs((k+1)/2,1);
    else if mod(k,2)==0
        e(k)=rs(k/2,2);
        end
    end
end
%按星座图对信号进行调制
for i=1:1:datasize/2
    if (s(i,1)==1 && s(i,2)==1)
        s(i,1)=-1;
        s(i,2)=-1;
    end
    if (s(i,1)==0 && s(i,2)==1)
        s(i,1)=-1;
%%%%%%%%%%%mimo空时编码与空间分集对比%%%%%%%%

%%%%%%空时编码%%%%%

%%%%% QPSK %%%%%%

clear all;

close all;

SNR=0:1:30;

snr=10.^(SNR/10);

sigma=sqrt(1./snr);%噪声与信号的幅度比值

K=3200;%未调制信号长度,信号越长,曲线越精确

%%%%%%%%%%%%%%%%%%%%设置参数%%%%%%%%%%%%%%%%%%%%%%%%

nt=2;%发射天线数

nr=2;%接收天线数

n=4; %调制方式QPSK

%%%%%%%%%%%%%%%%%%%%NPSK信号调制%%%%%%%%%%%%%%%%%%%%

[a,b,c,q,e]=qpskmod(K);

npskdata1=(1/sqrt(2))*(c+sqrt(-1)*q);

x=reshape(npskdata1,1,K/2);

%%%%%%%%%%%%%%%%%%%Alamouti%%%%%%%%%%%%%%%%%%%%%%%%

for k=1:length(SNR)

error_symbol=0;%对每一个信噪比下的误符号率清零

for i=1:length(npskdata1)/2

x11=x(2*i-1);

x12=x(2*i);

X1=[x11 -x12';x12 x11'];

%信道

H1=zeros(nr,nt);

R=eye(nr*nt);

X=randn(nr*nt,1)/sqrt(2)+1i*randn(nr*nt,1)/sqrt(2);

X1=reshape(X,nr,nt);

H1=reshape(R*X,nr,nt);

noise1=sigma(k).*H1;

R1=sqrt(1/2).*H1*X1+noise1;%接收信号矩阵

y11=0;y12=0;

for i=1:nr

y11=H1(i,1)'*R1(i,1)+H1(i,2)*R1(i,2)'+y11;

y12=H1(i,2)'*R1(i,1)-H1(i,1)*R1(i,2)'+y12;

end

%进行最大似然检测

DEC_X=judge(n,y11,y12);

%统计符号错误的总数

a=DEC_X(1);

b=a+a';

c=a-a'

if b>0

b=0;

else

b=1;

end

if c>0

c=0;

else

c=1;

end

j(1)=b;

j(2)=c;

a=DEC_X(2);

b=a+a';

c=a-a';

if b>0

b=0;

else

b=1;

end

if c>0

c=0;

else

c=1;

end

j1(1)=b;

j1(2)=c;

if j~=f;

error_symbol=error_symbol+1;

end

if j1~=f1;

error_symbol=error_symbol+1;

end

end

SER1(k)=error_symbol/length(npskdata1);

end

%%%%%%%空间分集%%%%%

%%mimo,QPSK

NT = 2; %发射天线数目

NR = 2; %接收天线数目

N=4;%%每次模拟发送的比特数,每次模拟的信道h认为是一致的

Eb_N0_dB=[0:1:30]; %设置信号能量,即信噪比

Eb_N0_dB1=10.^(Eb_N0_dB/10);

sigma2=sqrt(1./Eb_N0_dB1);%噪声与信号的幅度比值

Nerror_bpsk_mimo=zeros(1,length(Eb_N0_dB)); %储存误码率

m=800;

%上下两种方式符号数 上总符号数=下M*n

for k = 1:length(Eb_N0_dB)

for x=1:m %100蒙特卡洛模拟 求每次误码率的平均值

send_bit0=rand(1,N)>0.5; %%产生等概率的bit序列

p0=send_bit0(1:2:N);

q0=send_bit0(2:2:N);

p=p0*2-1;

q=q0*2-1;

signal_sent = p+sqrt(-1)*q; %QPSK信号生成

%%信道模拟

sMod = kron(signal_sent,ones(NR,1)); %构造成两行一样的数据流

sMod = reshape(sMod,[NR,NT,N/2/NT]); %产生NTxNRxN/NT矩阵

h = 1/sqrt(2)*[randn(NR,NT,N/2/NT) + i*randn(NR,NT,N/2/NT)]; %复高斯信道,信道归一化

n = 1/sqrt(2)*[randn(NR,N/2/NT) + i*randn(NR,N/2/NT)]; %产生高斯白噪声,噪声能量归一化

% n=A;

y = sqrt(0.5*10^(Eb_N0_dB(k)/10)).*squeeze(sum(h.*sMod,2)) +n;%*sigma2(k); %将产生的信号在信道上传输并加入高斯噪声

% ML检测

s1 = [-1-1i -1-1i]; %当QPSK调制后的四个符号为-1 -1 -1 -1时

s1 = repmat(s1,[1 ,N/2/2]);

s1Mod = kron(s1,ones(NR,1));

s1Mod = reshape(s1Mod,[NR,NT,N/2/NT]);

z1 = sqrt(0.5*10^(Eb_N0_dB(k)/10)).*squeeze(sum(h.*s1Mod,2)) ;%信道增益h与传输的信号相乘并求和

J1 = sum(abs(y - z1),1); %求出欧氏距离

s2 = [-1-1i -1+1i];

s2 = repmat(s2,[1 ,N/2/2]);

s2Mod = kron(s2,ones(NR,1));

s2Mod = reshape(s2Mod,[NR,NT,N/2/NT]);

z2 = sqrt(0.5*10^(Eb_N0_dB(k)/10)).*squeeze(sum(h.*s2Mod,2)) ;

J2 = sum(abs(y - z2),1);

s3 = [-1-1i 1-1i];

s3 = repmat(s3,[1 ,N/4]);

s3Mod = kron(s3,ones(NR,1));

s3Mod = reshape(s3Mod,[NR,NT,N/2/NT]);

z3 = sqrt(0.5*10^(Eb_N0_dB(k)/10)).*squeeze(sum(h.*s3Mod,2)) ;

J3 = sum(abs(y - z3),1);

s4 = [-1-1i 1+1i];

s4 = repmat(s4,[1 ,N/4]);

s4Mod = kron(s4,ones(NR,1));

s4Mod = reshape(s4Mod,[NR,NT,N/2/NT]);

z4 = sqrt(0.5*10^(Eb_N0_dB(k)/10)).*squeeze(sum(h.*s4Mod,2)) ;

J4 = sum(abs(y - z4),1);

s5 = [-1+1i -1-1i];

s5 = repmat(s5,[1 ,N/4]);

s5Mod = kron(s5,ones(NR,1));

s5Mod = reshape(s5Mod,[NR,NT,N/2/NT]);

z5 = sqrt(0.5*10^(Eb_N0_dB(k)/10)).*squeeze(sum(h.*s5Mod,2)) ;

J5 = sum(abs(y - z5),1);

s6 = [-1+1i -1+1i];

s6 = repmat(s6,[1 ,N/4]);

s6Mod = kron(s6,ones(NR,1));

s6Mod = reshape(s6Mod,[NR,NT,N/2/NT]);

z6 = sqrt(0.5*10^(Eb_N0_dB(k)/10)).*squeeze(sum(h.*s6Mod,2)) ;

J6 = sum(abs(y - z6),1);

s7 = [-1+1i 1-1i];

s7 = repmat(s7,[1 ,N/4]);

s7Mod = kron(s7,ones(NR,1));

s7Mod = reshape(s7Mod,[NR,NT,N/2/NT]);

z7 = sqrt(0.5*10^(Eb_N0_dB(k)/10)).*squeeze(sum(h.*s7Mod,2)) ;

J7 = sum(abs(y - z7),1);

s8 = [-1+1i 1+1i];

s8 = repmat(s8,[1 ,N/4]);

s8Mod = kron(s8,ones(NR,1));

s8Mod = reshape(s8Mod,[NR,NT,N/2/NT]);

z8 = sqrt(0.5*10^(Eb_N0_dB(k)/10)).*squeeze(sum(h.*s8Mod,2)) ;

J8 = sum(abs(y - z8),1);

s9 = [1-1i -1-1i];

s9 = repmat(s9,[1 ,N/4]);

s9Mod = kron(s9,ones(NR,1));

s9Mod = reshape(s9Mod,[NR,NT,N/2/NT]);

z9 = sqrt(0.5*10^(Eb_N0_dB(k)/10)).*squeeze(sum(h.*s9Mod,2)) ;

J9 = sum(abs(y - z9),1);

s10 = [1-1i -1+1i];

s10 = repmat(s10,[1 ,N/4]);

s10Mod = kron(s10,ones(NR,1));

s10Mod = reshape(s10Mod,[NR,NT,N/2/NT]);

z10 = sqrt(0.5*10^(Eb_N0_dB(k)/10)).*squeeze(sum(h.*s10Mod,2)) ;

J10 = sum(abs(y - z10),1);

s11 = [1-1i 1-1i];

s11 = repmat(s11,[1 ,N/4]);

s11Mod = kron(s11,ones(NR,1));

s11Mod = reshape(s11Mod,[NR,NT,N/2/NT]);

z11 = sqrt(0.5*10^(Eb_N0_dB(k)/10)).*squeeze(sum(h.*s11Mod,2)) ;

J11 = sum(abs(y - z11),1);

s12 = [1-1i 1+1i];

s12 = repmat(s12,[1 ,N/4]);

s12Mod = kron(s12,ones(NR,1));

s12Mod = reshape(s12Mod,[NR,NT,N/2/NT]);

z12 = sqrt(0.5*10^(Eb_N0_dB(k)/10)).*squeeze(sum(h.*s12Mod,2)) ;

J12 = sum(abs(y - z12),1);

s13 = [1+1i -1-1i];

s13 = repmat(s13,[1 ,N/4]);

s13Mod = kron(s13,ones(NR,1));

s13Mod = reshape(s13Mod,[NR,NT,N/2/NT]);

z13 = sqrt(0.5*10^(Eb_N0_dB(k)/10)).*squeeze(sum(h.*s13Mod,2)) ;

J13 = sum(abs(y - z13),1);

s14 = [1+1i -1+1i];

s14 = repmat(s14,[1 ,N/4]);

s14Mod = kron(s14,ones(NR,1));

s14Mod = reshape(s14Mod,[NR,NT,N/2/NT]);

z14 = sqrt(0.5*10^(Eb_N0_dB(k)/10)).*squeeze(sum(h.*s14Mod,2)) ;

J14 = sum(abs(y - z14),1);

s15 = [1+1i 1-1i];

s15 = repmat(s15,[1 ,N/4]);

s15Mod = kron(s15,ones(NR,1));

s15Mod = reshape(s15Mod,[NR,NT,N/2/NT]);

z15 = sqrt(0.5*10^(Eb_N0_dB(k)/10)).*squeeze(sum(h.*s15Mod,2)) ;

J15 = sum(abs(y - z15),1);

s16 = [1+1i 1+1i];

s16 = repmat(s16,[1 ,N/4]);

s16Mod = kron(s16,ones(NR,1));

s16Mod = reshape(s16Mod,[NR,NT,N/2/NT]);

z16 = sqrt(0.5*10^(Eb_N0_dB(k)/10)).*squeeze(sum(h.*s16Mod,2)) ;

J16= sum(abs(y - z16),1);

V = [J1;J2;J3;J4;J5;J6;J7;J8;J9;J10;J11;J12;J13;J14;J15;J16];%所有的欧氏距离度量

[j d] = min(V,[],1); %选择最小的欧氏距离度量,并记录编号

ref = [0,0,0,0; 0,0,0,1; 0,0,1,0; 0,0,1,1;

0,1,0,0; 0,1,0,1; 0,1,1,0; 0,1,1,1;

1,0,0,0; 1,0,0,1; 1,0,1,0; 1,0,1,1;

1,1,0,0; 1,1,0,1; 1,1,1,0; 1,1,1,1];

bit_ML=zeros(1,N);

bit_ML(1:4:end) = ref(d,1);

bit_ML(2:4:end) = ref(d,2);

bit_ML(3:4:end) = ref(d,3);

bit_ML(4:4:end) = ref(d,4);

a=bit_ML-send_bit0;

Nerror_bpsk_mimo(k)=Nerror_bpsk_mimo(k)+sum(sum(a~=0));%统计错误的比特数

end

Nerror_bpsk_mimo;

p_nerror=Nerror_bpsk_mimo/(m*N);

end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%空间复用%%%%%%

Nt = 2; %发射天线数

Nr = 2; %接收天线数

N = 8; %每帧的长度制方式为QPSK

L = 4000; %仿真的总帧数

EbN0 = 0:1:30;

M = 4; %QPSK调制

x = randi([0,1],N*L,Nt); %信源数据

s = pskmod(x,M,pi/4); %QPSK调制

for index=1:length(EbN0)

x1 = [];

x2 = [];

x3 = [];

for index1 = 1:L

h = randn(Nt,Nr)+j*randn(Nt,Nr); %Rayleigh衰落信道

h = h./sqrt(2); %信道系数归一化

sigma1 = sqrt(1/2)*sqrt(1/(10.^(EbN0(index)/10))); %每根接收天线的高斯白噪声标准差

n = sigma1*(randn(N,Nr)+1j*randn(N,Nr)); %每根接收天线的高斯白噪声

%******************** 信号通过信道 ****************%

y = s((index1-1)*N+1:index1*N,:)*h+n;

%******************* 接收端处理 **************%

%%%%%假设已经通过信道估计知道了h,均不考虑干扰消除

%%%% MMSE检测

yy = y;

wmmse = h'*inv(h*h'+2*sigma1.^2*diag(ones(1,Nt)));

y1 = y*wmmse; %MMSE检测

temp1 = pskdemod(y1,M,pi/4); %解调

x1 = [x1;temp1];

%%%% ZF检测

wzf = h'*inv(h*h');

y2 = y*wzf; %ZF检测

temp2 = pskdemod(y2,M,pi/4); %解调

x2 = [x2;temp2];

end

[temp3,ber1(index)] = biterr(x,x1,log2(M)); %MMSE检测时的系统误码

[temp4,ber2(index)] = biterr(x,x2,log2(M)); %ZF检测时的系统误码

end

%%%%%%瑞利衰信道下,QPSK理论误码率

% EbN0 = 3:1:10;

for i = 1:length(EbN0)

EbN0_l(1,i) = 10^(EbN0(1,i)/10);

ber3(1,i) = (1/2) *(1-sqrt(EbN0_l(1,i)./(EbN0_l(1,i)+1)));

end

figure(1)

semilogy(EbN0,ber1,'-ko',EbN0,ber2,'-ro',EbN0,ber3,'-go');

title('MIMO不同算法检测性能')

legend('MMSE算法','ZF算法', '理论值')

xlabel('比特信噪比Eb/N0')

ylabel('误比特率(BER)')

grid on

%%%%%%***************** 实验结论 ************************%%%

%%%%%% MMSE算法明显好于ZF

%%%%%绘图比较%%%%%

figure(2)

semilogy(SNR,SER1,'*-','LineWidth',1);

hold on;

semilogy(Eb_N0_dB,p_nerror,'+-','LineWidth',1);

hold on;

semilogy(Eb_N0_dB,ber1,'o-','LineWidth',1);

axis([0 25 -10^-5 0.2])

grid on

xlabel('信噪比(SNR)/dB');

ylabel('误码率');

title('mimo方式对比');

%---------SM系统仿真------------------

nTx=8;

nRx=8;

n_sm=1;

M=4;

SNR_dB=0:3:30;

L=log2(nTx)+log2(M); %一帧的长度

N=10000;%帧数

length_as=log2(nTx);

length_bit=log2(M);

BER=zeros(1,length(SNR_dB));

rho_r=0.4;

K=1;

err=0;

for i=1:length(SNR_dB)

SNR=SNR_dB(i)

rou=10^(SNR/10);%the average signal to noise ratio (SNR) at each receive antenna

N0=n_sm/rou;

err_num=0;

for k=1:N

%----------------SM调制---------------%

x=zeros(1,L);

x=rand(1,L)>0.5;

output=s_mod(x,length_bit,M,length_as,L);%sm调制函数

%-----------------信道------------------%

% H=(1/sqrt(2))*(randn(nRx,nTx) + 1i*randn(nRx,nTx));

% n=(sqrt(N0/2))*(randn(nRx,n_sm)+ 1i*randn(nRx,n_sm));

H=Generalized_Channel(nRx,nTx,rho_r,K,err);

n=1/sqrt(2)*(randn(nRx,n_sm) + 1i*randn(nRx,n_sm));% AWGN

%---------------过信道------------------%

% y= H *output'

y= H *output' + (sqrt(N0))*n ;

%----------------ML检测-----------------%

y_detect=ml_dectect(y,H,length_as,length_bit,M,L);

%---------------误比特-------------------%

err_bit=length(find(y_detect~=x));

err_num=err_num+err_bit;

end

BER(i)=err_num/L/N;

end

hold on;

semilogy(SNR_dB,BER,'g-*');%y轴对数形式作图

legend('空时编码','空间分集','空间复用','空间调制')

X1

R1

H1

H1(1,1)'

你可能感兴趣的:(MIMO,空间调制,matlab)