1.算法描述
移動(dòng)通信系統(tǒng)的性能在很大程度上決定于無線信道的特性。單發(fā)單收系統(tǒng)無線信道的特性已經(jīng)研究得很透徹,針對其各通信標(biāo)準(zhǔn)所采用的載頻、帶寬、環(huán)境等都有權(quán)威機(jī)構(gòu)給出實(shí)測的信道模型。對于多天線信道而言,許多單天線的概念都被繼承了下來,如路徑傳播損耗、陰影衰落、多徑衰落損耗、長期衰落、短期衰落、相干時(shí)間、相干帶寬、頻率選擇性衰落、平坦衰落等, 所采用的信道模型也基本都是單天線情況下的一些拓展。本實(shí)驗(yàn)采用獨(dú)立的慢衰落環(huán)境中的多輸入多輸出 MIMO 系統(tǒng),假設(shè)發(fā)送端的天線數(shù)目為Mt,接收端端的天線數(shù)目為 Mr。用hij表示從第 j 個(gè)發(fā)射天線到第 i 個(gè)接收天線的信道增益。接收天線i處的噪聲為ni,j=1,…, Mt ,i=1,…, Mr ;則第i個(gè)接收天線接收信號為:

系統(tǒng)工作流程如圖3-2下。首先V-BLAST系統(tǒng)在發(fā)射端通過串并轉(zhuǎn)換將數(shù)據(jù)流分解為Mt個(gè)子數(shù)據(jù)流,然后使用 QPSK 或 16QAM 對各路子信號流進(jìn)行調(diào)制, 將比特映射為符號;調(diào)制完成后,分別送到Mt個(gè)發(fā)射天線分別發(fā)射,在接收端用Mr個(gè)接收天線檢測信號。這里假設(shè)不論有多少個(gè)發(fā)送天線,系統(tǒng)的總發(fā)射功率是不變的,且總發(fā)射功率是平均分配到各個(gè)天線的。在接收端用Mr個(gè)接收天線檢測信號,并按照一定信號檢測與估計(jì)的方法進(jìn)行符號解調(diào),最后恢復(fù)出數(shù)據(jù)流(各個(gè)接收天線單獨(dú)進(jìn)行信號處理得到子數(shù)據(jù)流,最后需要并串轉(zhuǎn)換將子數(shù)據(jù)流合成為一個(gè)數(shù)據(jù)流)。假設(shè)發(fā)送天線之間、接收天線之間完全不相關(guān),且發(fā)送的數(shù)據(jù)也互相獨(dú)立。V-BLAST系統(tǒng)中接收天線的個(gè)數(shù)一般要大于或等于發(fā)送天線的個(gè)數(shù)。
關(guān)于接收機(jī)檢測與估計(jì)的方法,最直接的最大似然估計(jì)在MIMO信道中可直接采用線性檢測(按照ZF或MMSE準(zhǔn)則),也可采用非線性的干擾抵消檢測(如串行干擾抵消SIC)。
串行干擾抵消算法是一種非線性檢測算法。SIC的基本思想是在對多個(gè)符號進(jìn)行檢測與估計(jì)時(shí),如果能先對某個(gè)符號進(jìn)行檢測與估計(jì)解出這個(gè)符號,則在解另一個(gè)符號時(shí)可將已解出的符號對當(dāng)前待解符號的干擾消除,從而提高待解符號的SINR,提高檢測與估計(jì)的誤碼碼性能。對于Mt個(gè)發(fā)送符號,串行干擾抵消每次對一個(gè)符號進(jìn)行檢測與估計(jì),每次檢測時(shí),先消掉前面已經(jīng)解出的符號干擾,再對待解符號進(jìn)行檢測與估計(jì)(通常仍采用ZF或MMSE準(zhǔn)則對待解符號做線性變換),根據(jù)論文,我們此次實(shí)驗(yàn)采用ZF準(zhǔn)則做線性變換。因此對這Mt個(gè)發(fā)送符號在檢測與估計(jì)時(shí),共需要Mt步檢測判決,(且除掉第一步,其他每一步檢測之前都要利用已解出的符號做干擾抵消),這就存在對Mt個(gè)發(fā)送符號先對誰進(jìn)行檢測的排序問題。理論證明,當(dāng)Mt個(gè)發(fā)送符號使用相同星座圖時(shí),每一步都選擇接收SNR最大的符號,即對應(yīng)最優(yōu)的符號排序。
2.仿真效果預(yù)覽
matlab2022a仿真結(jié)果如下:





3.MATLAB核心程序
SNR ????= [0:5:30];
Nuser ??= 5;
len_dat = 1000;
num_T ??= 2;
num_R ??= 2;
Totalerr= 1e5;
Error ??=[];
for ij=1:length(SNR)
Num_err = 0; %蒙特卡洛模擬次數(shù)
Numbers = 0; %誤碼率累加器
while Num_err<=Totalerr/10
fprintf('SNR = %f\n', SNR(ij));
Num_err
%QPSK發(fā)射信號
signal ????????= randi([0,3],Nuser*num_T*len_dat,1);
signal_matrix ?= reshape(signal,num_T,Nuser,len_dat);
signal_matrix2 = zeros(num_T,Nuser,len_dat);
for k=1:len_dat
for k2=1:Nuser
signal_matrix2(:,k2,k) = pskmod(signal_matrix(:,k2,k),4);
end
end
%Rayleigh
H_ray ????= (randn(num_R,num_T,Nuser,len_dat) + sqrt(-1)*randn(num_R,num_T,Nuser,len_dat))/sqrt(2);
N_awg ????= (randn(num_R,Nuser,len_dat) ??????+ sqrt(-1)*randn(num_R,Nuser,len_dat))/sqrt(2);
%接收
Rec ??????= zeros(num_R,Nuser,len_dat);
for k=1:len_dat
for k2=1:Nuser
Rec(:,k2,k)=H_ray(:,:,k2,k)*signal_matrix2(:,k2,k)/sqrt(Nuser*num_T);
end
end
R_noised = Rec + sqrt(1/(10^(SNR(ij)/10)))*N_awg; %高斯白噪聲
x ???????= [];
for t=1:len_dat
for k=1:Nuser
Rect ?????= R_noised(:,k,t);
Ht_ray ???= H_ray(:,:,k,t);
Hmmsesic ?= inv(Ht_ray'*Ht_ray+(1/(10^(SNR(ij)/10)))*eye(num_T))*Ht_ray';
xbits ????= func_mmse_dmd(Rect,Hmmsesic,H_ray(:,:,k,t),Ht_ray,[1:num_T],num_T,Nuser,SNR(ij));
x(:,k,t) ?= xbits;
end
end
x1 = zeros(num_T,Nuser,len_dat);
for k=1:len_dat
for k2=1:Nuser
x1(:,k2,k) = pskdemod(x(:,k2,k),4);
end
end
Rec_bits ?????????= reshape(x1,Nuser*num_T*len_dat,1);
[errbit,temp_ber] = biterr(signal,Rec_bits,2);
Num_err ??????????= Num_err+errbit;
Numbers ??????????= Numbers+1;
end
Error(ij)=[Num_err/Numbers/length(signal)];
end