MIMO检测之ZF,MMSE,ML算法matlab代码
生活随笔
收集整理的這篇文章主要介紹了
MIMO检测之ZF,MMSE,ML算法matlab代码
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
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:NH(:,:,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)]; endfor i=1:length(EbN0)berZF=0;berMMSE=0;berML=0;N0(i)=1/(10^((EbN0(i))/10));for m=1:framez1=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:Ny(:,:,q)=[y1(q);y2(q);y3(q);y4(q)];end%ZF================================================================for n=1:NW_ZF(:,:,n)= inv(conj(H(:,:,n).')*H(:,:,n))*(conj(H(:,:,n).'));endfor p=1:Nxzf_hat(:,:,p)=W_ZF(:,:,p)*y(:,:,p);endfor o=1:Nx1zf_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);endfor k=1:Nif x1zf_hat(k) < 0x1zfhat(k) = 0;elsex1zfhat(k) = 1;endif x2zf_hat(k) < 0x2zfhat(k) = 0;elsex2zfhat(k) = 1;endif x3zf_hat(k) < 0x3zfhat(k) = 0;elsex3zfhat(k) = 1;endif x4zf_hat(k) < 0x4zfhat(k) = 0;elsex4zfhat(k) = 1;endend[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:NW_MMSE(:,:,n)= inv(conj(H(:,:,n).')*H(:,:,n)+N0(i)*eye(4))*(conj(H(:,:,n).'));endfor p=1:Nxmmse_hat(:,:,p)=W_MMSE(:,:,p)*y(:,:,p);endfor o=1:Nx1mmse_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);endfor k=1:Nif x1mmse_hat(k) < 0x1mmsehat(k) = 0;elsex1mmsehat(k) = 1;endif x2mmse_hat(k) < 0x2mmsehat(k) = 0;elsex2mmsehat(k) = 1;endif x3mmse_hat(k) < 0x3mmsehat(k) = 0;elsex3mmsehat(k) = 1;endif x4mmse_hat(k) < 0x4mmsehat(k) = 0;elsex4mmsehat(k) = 1;endend[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;endBER_ZF(i)=berZF/m;BER_MMSE(i)=berMMSE/m; endfigure 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) ;% 此處我們假設(shè)每根天線發(fā)送的信號能量為1 % N0 表示噪聲的能量N0 = Nt * 1 / SNR ; % 產(chǎn)生隨機比特流send = round(rand(1,bitsTotal)) ;sendReshape = reshape(send , Nt * bitsPerSymbol , Len ) ;symbols = zeros(Nt, Len) ;symbolsModulation = zeros(Nt ,Len) ;% 發(fā)送端QPSK調(diào)制fprintf('\n正在調(diào)制并發(fā)送 \n') ;for sendLoop = 1 :Lenfor antennaLoop = 1: NttwoBits = sendReshape ( 2* antennaLoop-1 :2* antennaLoop, sendLoop);symbols(antennaLoop ,sendLoop) = 2 * twoBits(1) + 1 * twoBits(2) +1;symbolsModulation(antennaLoop ,sendLoop) = ALP(symbols(antennaLoop ,sendLoop));endend% 經(jīng)過信道H = (randn(Nr, Nt) + sqrt(-1) * randn(Nr , Nt))/ sqrt(2) ; % 除以sqrt(2) 保證信道的能量為1n = (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 :Lenfprintf('%d %d \n',snrLoop ,sendLoop);% 得到M*M種組合dml = zeros(M ,M ,Len);for i1 = 1:Mfor i2 = 1:Mdml(i1, i2, sendLoop) = (norm(y(:,sendLoop) - H*[ALP(i1);ALP(i2)])).^2; % 共16種組合endenddml_min = min(reshape(dml(:,:,sendLoop).',1,M*M));% 找到最合適的然后譯碼for j1 = 1:M for j2 = 1:Mif dml(j1 , j2, sendLoop) == dml_min symbolsDetect(1, sendLoop) = j1;symbolsDetect(2, sendLoop) = j2;endendendend% 一個信噪比結(jié)束 統(tǒng)計SERSER(snrLoop) = sum(reshape(symbolsDetect,1,Len*Nt) ~= reshape(symbols,1,Len*Nt))/(Len*Nt); end figure semilogy(0:2:20,SER);總結(jié)
以上是生活随笔為你收集整理的MIMO检测之ZF,MMSE,ML算法matlab代码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 高速数据采集卡的分类和使用方法
- 下一篇: matlab人脸追踪,求大神帮助我这个菜