1.算法描述
在BLAST检测中,目前采用的ZF(迫零) 算法,MMSE(最小均方误差) 算法, OSIC(排序连续干扰抵消) 或ML (最大似然)准则来进行译码。前三种算法,实现起来较简单,但是误码率性能较差;而使用ML检测能得到更好的性能,但是其复杂度较高,不易于实现。基于ML检测的SD(球形译码)算法是一种性能优化,复杂度适中的检测算法。已经证明,采用穷尽搜索的ML 检测算法的复杂度随天线数呈指数增长,而SD算法的复杂度在很大信噪比范围内与天线数呈多项式关系。故SD算法可以用较少的计算量来获得最大似然译码性能。
在TD-LTE系统中,MIMO技术能够在不增加系统带宽和发射功率的情况下,大幅度地提高数据传输速率和信号传输质量,并且能够成倍地提高频谱利用率。多输入多输出(MIMO)技术是TD-LTE系统中的关键技术之一,MIMO系统接收端检测性能的好坏对整个系统的性能有重要影响。因此,MIMO技术接收算法的研究显得尤其重要。1999年,Viterbo将球形译码应用到MIMO系统的信号检测中;2002年,Agrell等人通过利用Schnorr-Eu-
chne(SE)方法[2]改变了各层中候选符号的排序,从而提高了搜索成功的概率;同年,A.M.Chan和I.Lee对Viterbo提出的球形译码算法进行了改进,该算法通过减少对重复点的搜索,有效地提高了搜索效率[3]。以上都是基于硬判决的球形译码检测算法。基于硬判决的检测算法虽然有着较低的复杂度,但是其性能明显低于基于软判决的检测算法。在信道条件比较差的情况下,基于硬判决的检测算法显然不能满足系统的要求,而传统的基于软判决的球形译码检测算法,在实现上有很高的复杂度。因此,本文引入了一种通过减少叶节点的软检测球形译码搜索方法,在保证性能的前提下极大地降低了算法的复杂度。
球形译码的基本思想是在以一个矢量x 为中心的半径为d的多维球内搜索格点,通过限制或者减少搜索半径从而减少搜索的点数,进而使得计算时间减少。球形译码算法带来的优点在于它不需要象传统的最大似然译码算法那样需要在整个格内对所有的格点进行搜索,而只需要在一个事先设定的有限球形区域进行搜索,如果该区域所包含的点数相对于整个格内的总点数是相当小的,搜索时间就会大大减少。
影响球形译码的关键问题有:(1) 怎样选择搜索半径d。如果d太大,则球内会包含太多的点,复杂度就会接近或者达到最大似然译码的指数级复杂度。如果d 太小,则球内可能一个格点都不包含,那么球形译码算法将得不到合理的解。(2) 怎样才能判断一个点是否在球内。如果这种判断需要借助每一个格点和矢量之间的距离来判断的话,那么这种方法就不太理想,因为我们需要考察所有的点,所产生的计算量也是指数级的。
球形译码解决了第2个问题,此处均考虑信号为实数,因为复数可以通过增加一倍的维数,将实部和虚部分开,要判断一个点是否在半径为d的m维球内比较困难。若将m变为1,则从球退化为一个间距,这个点就相当于某根天线发送信号的实部或虚部,这样操作就简单很多,可以知道这个点是否在这个距离内。多根发送天线上的信号的实部和虚部分成很多维,每一维上有可能取值。球形译码算法相当于构建了一棵树,树的第k层节点对应的是落在半径为d,维数为k的球内的格点。
在MIMO-OFDM系统中,基于软判决的检测算法其性能要明显优于基于硬判决的检测算法。传统的基于软判决的检测算法由于其很高的复杂度,从而对实现提出了很大的挑战。鉴于此,通过对软输出球形译码检测算法的研究,引入了一种快速有效的单树搜索球形译码检测算法。该算法极大地降低了MIMO软检测的复杂度,已应用于TD-LTE无线综合测试仪表的开发中。
2.仿真效果预览
matlab2022a仿真如下:
4QAM
8PSK
16QAM
BPSK
QPSK
3.MATLAB核心程序
clear;
close all;
warning off;
addpath(genpath(pwd));
Nt=2;
co_time=2;
Nr=2;
Nit=10000;
M_psk=4;
x=pi/4;
%x=0.5;
m=exp(j*x);
n=sqrt(m);
snr_min=0;
snr_max=16;
graph_inf_bit=zeros(snr_max-snr_min+1,2);
graph_inf_sym=zeros(snr_max-snr_min+1,2);
num_X=4;
num_bit_per_sym=log2(M_psk);
co_x=zeros(num_X,1);
for SNR=snr_min:snr_max
clc
disp('Wait until SNR=');disp(snr_max);
SNR
n_err_bit=0;
graph_inf_bit(SNR-snr_min+1,1)=SNR;
for con_sym=1:Nit
bi_data=rand(num_X,num_bit_per_sym)>=0.5;
for i=1:4
if bi_data(i,:)==[0 0]
data(i,1)=0.5*(sqrt(2)+j*sqrt(2));
elseif bi_data(i,:)==[0 1]
data(i,1)=0.5*(-sqrt(2)+j*sqrt(2));
elseif bi_data(i,:)==[1 1]
data(i,1)=0.5*(-sqrt(2)-j*sqrt(2));
else data(i,1)=0.5*(sqrt(2)-j*sqrt(2));
end
end
H1=(randn(Nt,Nr)+j*randn(Nt,Nr))/sqrt(2);
X1=zeros(co_time,Nt);
% X1=[data(1,1)+data(2,1) data(3,1)-data(4,1)
% data(3,1)+data(4,1) data(1,1)-data(2,1)];
X1=[data(1,1)+m*data(2,1) n*(data(3,1)-m*data(4,1))
n*(data(3,1)+m*data(4,1)) data(1,1)-m*data(2,1)];
snr_de=10^(SNR/10);
sig=sqrt(Nt/snr_de);
Noise1=sig*(randn(co_time,Nr)+j*randn(co_time,Nr))/sqrt(2);
R1=H1*X1+Noise1;
Noise2=reshape(Noise1,4,1);
I=eye(2,2);
H2=kron(I,H1);
%M=[1 1 0 0
% 0 0 1 1
% 0 0 1 -1
% 1 -1 0 0];
M=[1 m 0 0
0 0 n m*n
0 0 n -m*n
1 -m 0 0];
C=[data(1,1);data(2,1);data(3,1);data(4,1)];
%C=[data(1,1);m*data(2,1);n*data(3,1);m*n*data(4,1)];
R2=H2*M*C+Noise2;
G=[real(H2*M) -imag(H2*M);imag(H2*M) real(H2*M)];
CC=[real(C);imag(C)];
Noise=[real(Noise2);imag(Noise2)];
RR=G*CC+Noise;
S=[real(data(1,1))
imag(data(1,1))
real(data(2,1))
imag(data(2,1))
real(data(3,1))
imag(data(3,1))
real(data(4,1))
imag(data(4,1))];
H=[G(:,1) G(:,5) G(:,2) G(:,6) G(:,3) G(:,7) G(:,4) G(:,8)];
R=H*S+Noise;
C1=(2*Nt)*(2/(10^(SNR/10)));
codebook=[-sqrt(2)/2 sqrt(2)/2];
y_2norm_temp = spheredecodetoML(R, C1, H, codebook);
rr=[y_2norm_temp(1)+j*y_2norm_temp(2)
y_2norm_temp(3)+j*y_2norm_temp(4)
y_2norm_temp(5)+j*y_2norm_temp(6)
y_2norm_temp(7)+j*y_2norm_temp(8)];
U=[0 0
0 1
1 1
1 0];
%U=[0;1];
X=0.5*[sqrt(2)+j*sqrt(2);-sqrt(2)+j*sqrt(2);-sqrt(2)-j*sqrt(2);sqrt(2)-j*sqrt(2)];
%X=0.5*[sqrt(2)+j*sqrt(2);-sqrt(2)-j*sqrt(2)];
Dis=zeros(4,4);
re_met_bit=zeros(4,2);
for a=1:4
for b=1:4
Dis(a,b)=abs(rr(a,1)-X(b,1))^2;
end
[Dis,index]=sort(Dis,2);
re_met_bit(a,:)=U(index(a,1),:);
end
for con_dec_ro=1:num_X
for con_dec_co=1:num_bit_per_sym
if re_met_bit(con_dec_ro,con_dec_co)~=bi_data(con_dec_ro,con_dec_co)
n_err_bit=n_err_bit+1;
end
end
end
end
Perr_bit=n_err_bit/(num_X*Nit*num_bit_per_sym);
graph_inf_bit(SNR-snr_min+1,2)=Perr_bit;
end
x_bit=graph_inf_bit(:,1);
y_bit=graph_inf_bit(:,2);
semilogy(x_bit,y_bit,'b-*');
xlabel('SNR, [dB]');
ylabel('Bit Error Probability');
grid on
A90