MIMO检测之ZF,MMSE,ML算法matlab代码

ZF和MMSE算法:

clc;
clear;
close all;

N=1000;
frame=10;
EbN0=(0:1:40);

N0=zeros(1,length(EbN0));

H=zeros(4,4,N);
W_ZF=zeros(4,4,N);
W_MMSE=zeros(4,4,N);
xzf_hat=zeros(4,1,N);
xmmse_hat=zeros(4,1,N);

y=zeros(4,1,N);

x1zf_hat=zeros(N,1);
x2zf_hat=zeros(N,1);
x3zf_hat=zeros(N,1);
x4zf_hat=zeros(N,1);

x1zfhat=zeros(N,1);
x2zfhat=zeros(N,1);
x3zfhat=zeros(N,1);
x4zfhat=zeros(N,1);

x1mmse_hat=zeros(N,1);
x2mmse_hat=zeros(N,1);
x3mmse_hat=zeros(N,1);
x4mmse_hat=zeros(N,1);

x1mmsehat=zeros(N,1);
x2mmsehat=zeros(N,1);
x3mmsehat=zeros(N,1);
x4mmsehat=zeros(N,1);

num1ZF(41)=0;
num2ZF(41)=0;
BER_ZF(41)=0;
num1MMSE(41)=0;
num2MMSE(41)=0;
BER_MMSE(41)=0;

h11=(randn(1,N)+1j*randn(1,N))/sqrt(2);
h12=(randn(1,N)+1j*randn(1,N))/sqrt(2);
h13=(randn(1,N)+1j*randn(1,N))/sqrt(2);
h14=(randn(1,N)+1j*randn(1,N))/sqrt(2);
h21=(randn(1,N)+1j*randn(1,N))/sqrt(2);
h22=(randn(1,N)+1j*randn(1,N))/sqrt(2);
h23=(randn(1,N)+1j*randn(1,N))/sqrt(2);
h24=(randn(1,N)+1j*randn(1,N))/sqrt(2);
h31=(randn(1,N)+1j*randn(1,N))/sqrt(2);
h32=(randn(1,N)+1j*randn(1,N))/sqrt(2);
h33=(randn(1,N)+1j*randn(1,N))/sqrt(2);
h34=(randn(1,N)+1j*randn(1,N))/sqrt(2);
h41=(randn(1,N)+1j*randn(1,N))/sqrt(2);
h42=(randn(1,N)+1j*randn(1,N))/sqrt(2);
h43=(randn(1,N)+1j*randn(1,N))/sqrt(2);
h44=(randn(1,N)+1j*randn(1,N))/sqrt(2);

x1=round(rand(N,1));
x2=round(rand(N,1));
x3=round(rand(N,1));
x4=round(rand(N,1));

u1=2*x1-1;
u2=2*x2-1;
u3=2*x3-1;
u4=2*x4-1;

for t=1:N
    H(:,:,t)=[h11(t),h12(t),h13(t),h14(t);h21(t),h22(t),h23(t),h24(t);h31(t),h32(t),h33(t),h34(t);h41(t),h42(t),h43(t),h44(t)];
end

for i=1:length(EbN0)
    berZF=0;
    berMMSE=0;
    berML=0;
    N0(i)=1/(10^((EbN0(i))/10));
    for m=1:frame
        z1=sqrt(N0(i)/(2))*(randn(size(u1))+1j*randn(size(u1)));
        z2=sqrt(N0(i)/(2))*(randn(size(u2))+1j*randn(size(u2)));
        z3=sqrt(N0(i)/(2))*(randn(size(u3))+1j*randn(size(u3)));
        z4=sqrt(N0(i)/(2))*(randn(size(u4))+1j*randn(size(u4)));
        
        y1 = u1.*(h11).'+u2.*(h12).'+u3.*(h13).'+u4.*(h14).'+z1.';
        y2 = u1.*(h21).'+u2.*(h22).'+u3.*(h23).'+u4.*(h24).'+z2.';
        y3 = u1.*(h31).'+u2.*(h32).'+u3.*(h33).'+u4.*(h34).'+z3.';
        y4 = u1.*(h41).'+u2.*(h42).'+u3.*(h43).'+u4.*(h44).'+z4.';
        
        for q=1:N
            y(:,:,q)=[y1(q);y2(q);y3(q);y4(q)];
        end
        %ZF================================================================
        for n=1:N
            W_ZF(:,:,n)= inv(conj(H(:,:,n).')*H(:,:,n))*(conj(H(:,:,n).'));
        end
        
        for p=1:N
            xzf_hat(:,:,p)=W_ZF(:,:,p)*y(:,:,p);
        end
        
        for o=1:N
            x1zf_hat(o)=xzf_hat(1,1,o);
            x2zf_hat(o)=xzf_hat(2,1,o);
            x3zf_hat(o)=xzf_hat(3,1,o);
            x4zf_hat(o)=xzf_hat(4,1,o);
        end
        
        for k=1:N
            if x1zf_hat(k) < 0
                x1zfhat(k) = 0;
            else
                x1zfhat(k) = 1;
            end
            
            if x2zf_hat(k) < 0
                x2zfhat(k) = 0;
            else
                x2zfhat(k) = 1;
            end
            
            if x3zf_hat(k) < 0
                x3zfhat(k) = 0;
            else
                x3zfhat(k) = 1;
            end
            
            if x4zf_hat(k) < 0
                x4zfhat(k) = 0;
            else
                x4zfhat(k) = 1;
            end
        end
        
        [num1ZF, rat1ZF] = biterr(x1zfhat, x1);
        [num2ZF, rat2ZF] = biterr(x2zfhat, x2);
        [num3ZF, rat3ZF] = biterr(x3zfhat, x3);
        [num4ZF, rat4ZF] = biterr(x4zfhat, x4);
        berZF=berZF+(rat1ZF+rat2ZF+rat3ZF+rat4ZF)/4;
        
        %MMSE==============================================================
        for n=1:N
            W_MMSE(:,:,n)= inv(conj(H(:,:,n).')*H(:,:,n)+N0(i)*eye(4))*(conj(H(:,:,n).'));
        end
        
        for p=1:N
            xmmse_hat(:,:,p)=W_MMSE(:,:,p)*y(:,:,p);
        end
        
        for o=1:N
            x1mmse_hat(o)=xmmse_hat(1,1,o);
            x2mmse_hat(o)=xmmse_hat(2,1,o);
            x3mmse_hat(o)=xmmse_hat(3,1,o);
            x4mmse_hat(o)=xmmse_hat(4,1,o);
        end
        
        for k=1:N
            if x1mmse_hat(k) < 0
                x1mmsehat(k) = 0;
            else
                x1mmsehat(k) = 1;
            end
            if x2mmse_hat(k) < 0
                x2mmsehat(k) = 0;
            else
                x2mmsehat(k) = 1;
            end
            if x3mmse_hat(k) < 0
                x3mmsehat(k) = 0;
            else
                x3mmsehat(k) = 1;
            end
            if x4mmse_hat(k) < 0
                x4mmsehat(k) = 0;
            else
                x4mmsehat(k) = 1;
            end
        end
        [num1MMSE, rat1MMSE] = biterr(x1mmsehat, x1);
        [num2MMSE, rat2MMSE] = biterr(x2mmsehat, x2);
        [num3MMSE, rat3MMSE] = biterr(x3mmsehat, x3);
        [num4MMSE, rat4MMSE] = biterr(x4mmsehat, x4);
        berMMSE=berMMSE+(rat1MMSE+rat2MMSE+rat3MMSE+rat4MMSE)/4;
        
    end
    BER_ZF(i)=berZF/m;
    BER_MMSE(i)=berMMSE/m;
end

figure
semilogy(EbN0,BER_ZF,'o-b',EbN0,BER_MMSE,'*-r');
title('误码率');
xlabel('EbN0(dB)');
ylabel('BER');
legend('ZF','MMSE');
grid on;

ML算法:

close all;
clear;
clc;
Nt = 2;
Nr = 2;
Len = 10000;
M= 4;
bitsPerSymbol = log2(M) ;
bitsTotal = bitsPerSymbol * Nt * Len ;
ALP = [-1+1i  ;-1-1* 1i ;1+1i ;1-1i] * sqrt(3/(2*(M-1)))  ; % QPSK符号
SNRVect = 0:2:20 ;
SER = zeros( 1 ,length(SNRVect) )  ;
for snrLoop =  1: length (SNRVect)
    fprintf(' snrLoop = %d \n',snrLoop) ;
    % 计算信噪比
    SNRdB = SNRVect(snrLoop) ;
    SNR  = 10^(SNRdB/10) ;
    % 此处我们假设每根天线发送的信号能量为1   
    % N0 表示噪声的能量
    N0 = Nt * 1 / SNR ;   
    % 产生随机比特流
    send = round(rand(1,bitsTotal)) ;
    sendReshape = reshape(send , Nt * bitsPerSymbol , Len ) ;
    symbols = zeros(Nt, Len) ;
    symbolsModulation = zeros(Nt ,Len) ;
    % 发送端QPSK调制
    fprintf('\n正在调制并发送 \n') ;
    for sendLoop = 1 :Len
        for antennaLoop = 1: Nt
            twoBits = sendReshape ( 2* antennaLoop-1 :2* antennaLoop, sendLoop);
            symbols(antennaLoop ,sendLoop) = 2 * twoBits(1) + 1 * twoBits(2) +1;
            symbolsModulation(antennaLoop ,sendLoop) = ALP(symbols(antennaLoop ,sendLoop));
        end
    end
    % 经过信道
    H = (randn(Nr, Nt) + sqrt(-1) * randn(Nr , Nt))/ sqrt(2)  ;            % 除以sqrt(2) 保证信道的能量为1
    n = (randn(Nr , Len) + sqrt(-1)*randn(Nr, Len )) * sqrt(N0) /sqrt(2) ; % 保证噪声 n ~N(0,N0)
    y = H* symbolsModulation + n ;
    % 接收端
    fprintf('\n正在译码 \n');
    symbolsDetect = zeros(2 , Len);
    for sendLoop = 1 :Len
         fprintf('%d %d \n',snrLoop ,sendLoop);
        % 得到M*M种组合
        dml = zeros(M ,M ,Len);
        for i1 = 1:M
            for i2 = 1:M
                dml(i1, i2, sendLoop) = (norm(y(:,sendLoop) - H*[ALP(i1);ALP(i2)])).^2; % 共16种组合
            end
        end
        dml_min = min(reshape(dml(:,:,sendLoop).',1,M*M));
        % 找到最合适的然后译码
        for j1 = 1:M 
            for j2 = 1:M
                if dml(j1 , j2, sendLoop) == dml_min 
                    symbolsDetect(1, sendLoop) = j1;
                    symbolsDetect(2, sendLoop) = j2;
                end
            end
        end

    end
    % 一个信噪比结束  统计SER
    SER(snrLoop) = sum(reshape(symbolsDetect,1,Len*Nt) ~= reshape(symbols,1,Len*Nt))/(Len*Nt);
end
figure
semilogy(0:2:20,SER);

  • 6
    点赞
  • 78
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是使用Matlab实现高斯白噪声下MIMO检测算法的研究仿真,对比线性检测算法ZF算法MMSE检测算法以及非线性检测算法中的ML检测算法和OSIC算法的步骤: 1. 首先,导入所需的Matlab库和函数。 2. 设置仿真参数,包括发送天线数(Nt)、接收天线数(Nr)、发送符号数(M)、信噪比(SNR)等。 3. 生成发送符号矩阵X,其中每个元素表示发送符号的星座点。 4. 生成信道矩阵H,其中每个元素表示信道增益。 5. 生成高斯白噪声矩阵W,其中每个元素表示噪声样本。 6. 根据信道矩阵H、发送符号矩阵X和噪声矩阵W计算接收信号矩阵Y。 7. 使用ZF算法进行线性检测: - 计算ZF检测矩阵G,其中G = inv(H' * H) * H'。 - 计算ZF检测后的符号估计矩阵X_hat = G * Y。 8. 使用MMSE算法进行线性检测: - 计算MMSE检测矩阵G,其中G = inv(H' * H + (1/SNR) * eye(Nt)) * H'。 - 计算MMSE检测后的符号估计矩阵X_hat = G * Y。 9. 使用ML算法进行非线性检测: - 对于每个可能的发送符号组合,计算接收信号与假设的发送信号之间的欧氏距离。 - 选择距离最小的发送符号组合作为ML检测后的符号估计矩阵X_hat。 10. 使用OSIC算法进行非线性检测: - 对于每个发送符号,依次进行串行干扰抵消(SIC): - 对于每个待解符号,根据已解出的符号进行干扰消除。 - 使用ZFMMSE准则对待解符号进行线性变换。 - 根据接收信号和已解出的符号进行检测与估计。 - 得到OSIC检测后的符号估计矩阵X_hat。 11. 计算ZFMMSE、ML和OSIC算法的误码率(BER)。 12. 绘制误码率曲线图,比较不同算法的性能。 13. 分析仿真结果,得出结论。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值