欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

基于Matlab的MIMO通信系统仿真

程序员文章站 2022-05-14 08:06:03
...

1. MIMO基本原理

    MIMO技术指在发射端和接收端分别使用多个发射天线和接收天线,使信号通过发射端与接收端的多个天线传送和接收,从而改善通信质量。它能充分利用空间资源,通过多个天线实现多发多收,在不增加频谱资源和天线发射功率的情况下,可以成倍的提高系统信道容量,显示出明显的优势、被视为下一代移动通信的核心技术。

2. 空时分组码

2.1 Alamouti 2发1收空时编码

(1)仿真代码

%仿真Alamouti 2发1收空时编码性能,调制方式为QPSK
clear all
datasize = 100000; %仿真的符号数
EbN0 = 0:2:10; %信噪比
M = 4; %QPSK调制
x = randsrc(2,datasize/2,[0:3]); %数据源符号
x1 = pskmod(x,M,pi/4);
h = randn(2,datasize/2) +j*randn(2,datasize/2); %Rayleigh衰落信道
h = h./sqrt(2); %能量归一化

for index=1:length(EbN0)
    sigma1 = sqrt(1/(4*10.^(EbN0(index)/10))); %SISO信道高斯白噪声标准差
    n = sigma1*(randn(2,datasize/2)+j*randn(2,datasize/2));
    y = x1 + n; %通过AWGN信道
    y1 = x1 + n./h; %通过SISO瑞利衰落信道后的判决变量
    x2 = pskdemod(y,M,pi/4); 
    x3 = pskdemod(y1,M,pi/4);
    
    sigma2 = sqrt(1/(2*10.^(EbN0(index)/10))); %Alamouti方案每个子信道高斯白噪声标准差
    n = sigma2*(randn(2,datasize/2)+j*randn(2,datasize/2));
    n1(1,:) = (conj(h(1,:)).*n(1,:)+h(2,:).*conj(n(2,:)))./(sum(abs(h).^2)); %Alamouti方案的判决变量
    n1(2,:) = (conj(h(2,:)).*n(1,:)-h(1,:).*conj(n(2,:)))./(sum(abs(h).^2)); 
    y3 = x1 + n1;
    x4 = pskdemod(y3,M,pi/4);
    [temp,ber1(index)] = biterr(x,x2,log2(M));
    [temp,ber2(index)] = biterr(x,x3,log2(M));
    [temp,ber3(index)] = biterr(x,x4,log2(M));
end

semilogy(EbN0,ber1,'-ko',EbN0,ber2,'-ro',EbN0,ber3,'-go')
grid on
legend('AWGN信道','SISO瑞利衰落信道', '2发1收Alamouti方案')
xlabel('信噪比Eb/N0')
ylabel('误比特率(BER)')
title('2发1收Alamouti方案在瑞利衰落信道下的性能')
    

(2)仿真结果

基于Matlab的MIMO通信系统仿真

2.2 Alamouti 2发2收空时编码

(1)仿真代码

%仿真Alamouti 2发2收空时编码性能,调制方式为QPSK
clear all
datasize = 100000; %仿真的符号数
EbN0 = 0:2:20; %信噪比
M = 4; %QPSK调制
x = randsrc(2,datasize/2,[0:3]); %数据源符号
x1 = pskmod(x,M,pi/4);
h = randn(4,datasize/2) +j*randn(4,datasize/2); %Rayleigh衰落信道
h = h./sqrt(2); %能量归一化

for index=1:length(EbN0)
    sigma1 = sqrt(1/(4*10.^(EbN0(index)/10))); %SISO信道高斯白噪声标准差
    n = sigma1*(randn(2,datasize/2)+j*randn(2,datasize/2));
    y = x1 + n; %通过AWGN信道
    y1 = x1 + n./h(1:2,:); %通过SISO瑞利衰落信道后的判决变量
    x2 = pskdemod(y,M,pi/4); 
    x3 = pskdemod(y1,M,pi/4);
    
    sigma2 = sqrt(1/(2*10.^(EbN0(index)/10))); %Alamouti方案每个子信道高斯白噪声标准差
    n = sigma2*(randn(4,datasize/2)+j*randn(4,datasize/2));
    n1(1,:) = (conj(h(1,:)).*n(1,:)+h(2,:).*conj(n(2,:)))./(sum(abs(h(1:2,:)).^2)); %2发1收Alamouti方案判决变量的噪声项
    n1(2,:) = (conj(h(2,:)).*n(1,:)-h(1,:).*conj(n(2,:)))./(sum(abs(h(1:2,:)).^2));   
    y = x1 + n1;
    x4 = pskdemod(y,M,pi/4);
    n2(1,:) = (conj(h(1,:)).*n(1,:)+h(2,:).*conj(n(2,:))+conj(h(3,:)).*n(3,:)+h(4,:).*conj(n(4,:)))./(sum(abs(h).^2)); %2发2收Alamouti方案判决变量的噪声项
    n2(2,:) = (conj(h(2,:)).*n(1,:)-h(1,:).*conj(n(2,:))+conj(h(4,:)).*n(3,:)-h(3,:).*conj(n(4,:)))./(sum(abs(h).^2));
    y1= x1 + n2;
    x5 = pskdemod(y1,M,pi/4);
    [temp,ber1(index)] = biterr(x,x2,log2(M));
    [temp,ber2(index)] = biterr(x,x3,log2(M));
    [temp,ber3(index)] = biterr(x,x4,log2(M));
    [temp,ber4(index)] = biterr(x,x5,log2(M));
end

semilogy(EbN0,ber1,'-ko',EbN0,ber2,'-ro',EbN0,ber3,'-go',EbN0,ber4,'-bo')
grid on
legend('AWGN信道','SISO瑞利衰落信道', '2发1收Alamouti方案', '2发2收Alamouti方案')
xlabel('信噪比Eb/N0')
ylabel('误比特率(BER)')
title('2发2收Alamouti方案在瑞利衰落信道下的性能')

(2)仿真结果

基于Matlab的MIMO通信系统仿真

3. 空分复用和BLAST 结构

3.1 V-BLAST 结构

基于Matlab的MIMO通信系统仿真

3.2 V-BLAST 结构的迫零(ZF)检测算法

(1)仿真代码

%仿真V-BLAST结构ZF检测算法性能,调制方式为QPSK
clear all
Nt = 4; %发射天线数
Nr = 4; %接收天线数
N = 10; %每帧的长度
L = 10000; %仿真的总帧数
EbN0 = 0:2:20;
M = 4; %QPSK调制
x = randi([0,1],N*L,Nt); %信源数据
s = pskmod(x,M,pi/4); %QPSK调制

for index=1:length(EbN0)
    s1 = [];
    s2 = [];
    s3 = [];
    for index1 = 1:L
        h = randn(Nt,Nr)+j*randn(Nt,Nr); %Rayleigh衰落信道
        h = h./sqrt(2); %信道系数归一化
        [q1,r1] = qr(h'); %信道QR分解
        r = r1(1:Nt,:)'; %矩阵R
        q = q1(:,1:Nt)'; %矩阵Q
        
        sigma1 = sqrt(1/(10.^(EbN0(index)/10))); %每根接收天线的高斯白噪声标准差
        n = sigma1*(randn(N,Nr)+j*randn(N,Nr)); %每根接收天线的高斯白噪声
        
        y = s((index1-1)*N+1:index1*N,:)*h*q'+n*q'; %信号通过信道
        
        y1 = y*inv(r); %无干扰消除时的ZF检测
        s1 = [s1;pskdemod(y1,M,pi/4)];
        
        %有干扰消除时的ZF检测
        y(:,Nt) = y(:,Nt)./(r(Nt,Nt)); %检测第Nt层
        y1(:,Nt) = pskdemod(y(:,Nt),M,pi/4); %解调第Nt层
        y(:,Nt) = pskmod(y1(:,Nt),M,pi/4); %对第Nt层解调结果重新进行调制
        y2 = y;
        y3 = y1;
        for jj=Nt-1:-1:1
            for kk=jj+1:Nt
                y(:,jj) = y(:,jj)-r(kk,jj).*y(:,kk); %非理想干扰消除
                y2(:,jj) = y2(:,jj)-r(kk,jj).*s((index1-1)*N+1:index1*N,kk); %理想干扰消除
            end
            y(:,jj) = y(:,jj)./r(jj,jj);
            y2(:,jj) = y2(:,jj)./r(jj,jj); %第jj层判决变量
            y1(:,jj) = pskdemod(y(:,jj),M,pi/4); %第jj层进行解调
            y3(:,jj) = pskdemod(y2(:,jj),M,pi/4);
            y(:,jj) = pskmod(y1(:,jj),M,pi/4); %第jj解调结果重新进行调制
            y2(:,jj) = pskmod(y3(:,jj),M,pi/4);
        end
        s2 = [s2;y1];
        s3 = [s3;y3];
    end
    
    [temp,ber1(index)] = biterr(x,s1,log2(M)); %无干扰消除时的系统误码
    [temp,ber2(index)] = biterr(x,s2,log2(M)); %非理想干扰消除时的系统误码
    [temp,ber3(index)] = biterr(x,s3,log2(M)); %理想干扰消除时的系统误码
    
    [temp,ber24(index)] = biterr(x(:,1),s2(:,1),log2(M)); %非理想干扰消除时第4层的系统误码
    [temp,ber23(index)] = biterr(x(:,2),s2(:,2),log2(M)); %非理想干扰消除时第3层的系统误码
    [temp,ber22(index)] = biterr(x(:,3),s2(:,3),log2(M)); %非理想干扰消除时第2层的系统误码
    [temp,ber21(index)] = biterr(x(:,4),s2(:,4),log2(M)); %非理想干扰消除时第1层的系统误码
    
    [temp,ber34(index)] = biterr(x(:,1),s3(:,1),log2(M)); %理想干扰消除时第4层的系统误码
    [temp,ber33(index)] = biterr(x(:,2),s3(:,2),log2(M)); %理想干扰消除时第3层的系统误码
    [temp,ber32(index)] = biterr(x(:,3),s3(:,3),log2(M)); %理想干扰消除时第2层的系统误码
    [temp,ber31(index)] = biterr(x(:,4),s3(:,4),log2(M)); %理想干扰消除时第1层的系统误码
    
end

semilogy(EbN0,ber1,'-ko',EbN0,ber2,'-ro',EbN0,ber3,'-go')
title('V-BLAST结构ZF检测算法性能')
legend('无干扰消除','非理想干扰消除', '理想干扰消除')
xlabel('信噪比Eb/N0')
ylabel('误比特率(BER)')

figure
semilogy(EbN0,ber34,'-ko',EbN0,ber33,'-ro',EbN0,ber32,'-go',EbN0,ber31,'-bo')
title('理想干扰消除ZF检测算法性能')
legend('第1层','第2层', '第3层', '第4层')
xlabel('信噪比Eb/N0')
ylabel('误比特率(BER)')

figure
semilogy(EbN0,ber24,'-ko',EbN0,ber23,'-ro',EbN0,ber22,'-go',EbN0,ber21,'-bo')
title('非理想干扰消除ZF检测算法性能')
legend('第1层','第2层', '第3层', '第4层')
xlabel('信噪比Eb/N0')
ylabel('误比特率(BER)')

            

(2)仿真结果

基于Matlab的MIMO通信系统仿真

基于Matlab的MIMO通信系统仿真

基于Matlab的MIMO通信系统仿真

 

3.3 V-BLAST 结构的最小均方误差(MMSE)检测算法

(1)仿真代码

%仿真V-BLAST结构MMSE检测算法性能,调制方式为QPSK
clear all
Nt = 4; %发射天线数
Nr = 4; %接收天线数
N = 10; %每帧的长度
L = 10000; %仿真的总帧数
EbN0 = 0:2:20;
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/(10.^(EbN0(index)/10))); %每根接收天线的高斯白噪声标准差
        n = sigma1*(randn(N,Nr)+j*randn(N,Nr)); %每根接收天线的高斯白噪声
        w = h'*inv(h*h'+2*sigma1.^2*diag(ones(1,Nt))); %w的最优解
        
        y = s((index1-1)*N+1:index1*N,:)*h+n; %信号通过信道
        
        yy = y;
        y1 =  y*w; %无干扰消除时的MMSE检测
        temp1 = pskdemod(y1,M,pi/4); %无干扰消除时的解调
        x1 = [x1;temp1]; %无干扰消除时的解调结果
        
        temp2(:,Nt) = temp1(:,Nt);
        y = y-pskmod(temp2(:,Nt),4,pi/4)*h(Nt,:); %非理想干扰消除时,接收信号矩阵的更新
        
        temp3(:,Nt) = temp1(:,Nt);
        yy = yy-s((index1-1)*N+1:index1*N,Nt)*h(Nt,:); %理想干扰消除时,接收信号矩阵的更新
        
        h = h(1:Nt-1,:)
        
        for ii=Nt-1:-1:1
            w = h'*inv(h*h'++2*sigma1.^2*diag(ones(1,ii))); %信道矩阵更新后的w
            
            y1 = y*w; %非理想干扰消除的检测与解调
            temp2(:,ii)=pskdemod(y1(:,ii),M,pi/4);
            y = y-pskmod(temp2(:,ii),4,pi/4)*h(ii,:);
            
            yy1 = yy*w; %理想干扰消除的检测与解调
            temp3(:,ii)=pskdemod(yy1(:,ii),M,pi/4);
            yy = yy-s((index1-1)*N+1:index1*N,ii)*h(ii,:);
            
            h = h(1:ii-1,:);
        end
        x2 = [x2;temp2]; %非理想干扰消除时的结果
        x3 = [x3;temp3]; %理想干扰消除时的结果   
    end
    
    [temp,ber1(index)] = biterr(x,x1,log2(M)); %无干扰消除时的系统误码
    [temp,ber2(index)] = biterr(x,x2,log2(M)); %非理想干扰消除时的系统误码
    [temp,ber3(index)] = biterr(x,x3,log2(M)); %理想干扰消除时的系统误码
    
    [temp,ber24(index)] = biterr(x(:,1),x2(:,1),log2(M)); %非理想干扰消除时第4层的系统误码
    [temp,ber23(index)] = biterr(x(:,2),x2(:,2),log2(M)); %非理想干扰消除时第3层的系统误码
    [temp,ber22(index)] = biterr(x(:,3),x2(:,3),log2(M)); %非理想干扰消除时第2层的系统误码
    [temp,ber21(index)] = biterr(x(:,4),x2(:,4),log2(M)); %非理想干扰消除时第1层的系统误码
    
    [temp,ber34(index)] = biterr(x(:,1),x3(:,1),log2(M)); %理想干扰消除时第4层的系统误码
    [temp,ber33(index)] = biterr(x(:,2),x3(:,2),log2(M)); %理想干扰消除时第3层的系统误码
    [temp,ber32(index)] = biterr(x(:,3),x3(:,3),log2(M)); %理想干扰消除时第2层的系统误码
    [temp,ber31(index)] = biterr(x(:,4),x3(:,4),log2(M)); %理想干扰消除时第1层的系统误码
    
end

semilogy(EbN0,ber1,'-ko',EbN0,ber2,'-ro',EbN0,ber3,'-go')
title('V-BLAST结构MMSE检测算法性能')
legend('无干扰消除','非理想干扰消除', '理想干扰消除')
xlabel('信噪比Eb/N0')
ylabel('误比特率(BER)')

figure
semilogy(EbN0,ber34,'-ko',EbN0,ber33,'-ro',EbN0,ber32,'-go',EbN0,ber31,'-bo')
title('理想干扰消除MMSE检测算法性能')
legend('第1层','第2层', '第3层', '第4层')
xlabel('信噪比Eb/N0')
ylabel('误比特率(BER)')

figure
semilogy(EbN0,ber24,'-ko',EbN0,ber23,'-ro',EbN0,ber22,'-go',EbN0,ber21,'-bo')
title('非理想干扰消除MMSE检测算法性能')
legend('第1层','第2层', '第3层', '第4层')
xlabel('信噪比Eb/N0')
ylabel('误比特率(BER)')

            

(2)仿真结果

基于Matlab的MIMO通信系统仿真

基于Matlab的MIMO通信系统仿真

基于Matlab的MIMO通信系统仿真

相关标签: 通信