1.算法描述
MIMO检测是简单假设检验中的经典问题[1]。 最大似然(ML)检测器涉及穷举搜索,并且在最小误差联合误差的意义上是最佳检测器,用于同时检测所有符号。 不幸的是,它具有指数级的运行时复杂性,这使其在大型实时系统中不切实际。
为了克服最大似然解码器的计算成本,人们对实现次优检测算法非常感兴趣,该算法提供了更好,更灵活的精度与复杂度的权衡。在高精度条件下,球面解码算法[2] [3],[4]贝提出,基于晶格搜索,并提供了更好的计算复杂度,相对于完整搜索而言,其准确性会降低。 在另一种情况下,最常见的次优检测器是线性接收器,即匹配滤波器(MF),解相关器或迫零检测器(ZF)和最小均方误差(MMSE)检测器。 更高级的检测器基于决策反馈均衡(DFE),近似消息传递(AMP)[5]和半确定松弛(SDR)[6],[7]。当前,在许多实际情况下,AMP和SDR均可提供接近最佳的精度。AMP在实践中实现起来简单且便宜,但是它是一种迭代方法,可能会在挑战性环境中产生差异。SDR更加健壮,具有多项式复杂性,但是它所解决的设置受到限制,并且在实践中要慢得多。
在BLAST检测中,目前采用的ZF(迫零) 算法,MMSE(最小均方误差) 算法, OSIC(排序连续干扰抵消) 或ML (最大似然)准则来进行译码。前三种算法,实现起来较简单,但是误码率性能较差;而使用ML检测能得到更好的性能,但是其复杂度较高,不易于实现。基于ML检测的SD(球形译码)算法是一种性能优化,复杂度适中的检测算法。已经证明,采用穷尽搜索的ML 检测算法的复杂度随天线数呈指数增长,而SD算法的复杂度在很大信噪比范围内与天线数呈多项式关系。故SD算法可以用较少的计算量来获得最大似然译码性能。
球形译码的基本思想是在以一个矢量x 为中心的半径为d的多维球内搜索格点,通过限制或者减少搜索半径从而减少搜索的点数,进而使得计算时间减少。球形译码算法带来的优点在于它不需要象传统的最大似然译码算法那样需要在整个格内对所有的格点进行搜索,而只需要在一个事先设定的有限球形区域进行搜索,如果该区域所包含的点数相对于整个格内的总点数是相当小的,搜索时间就会大大减少。
影响球形译码的关键问题有:(1) 怎样选择搜索半径d。如果d太大,则球内会包含太多的点,复杂度就会接近或者达到最大似然译码的指数级复杂度。如果d 太小,则球内可能一个格点都不包含,那么球形译码算法将得不到合理的解。(2) 怎样才能判断一个点是否在球内。如果这种判断需要借助每一个格点和矢量之间的距离来判断的话,那么这种方法就不太理想,因为我们需要考察所有的点,所产生的计算量也是指数级的。
球形译码解决了第2个问题,此处均考虑信号为实数,因为复数可以通过增加一倍的维数,将实部和虚部分开,要判断一个点是否在半径为d的m维球内比较困难。若将m变为1,则从球退化为一个间距,这个点就相当于某根天线发送信号的实部或虚部,这样操作就简单很多,可以知道这个点是否在这个距离内。多根发送天线上的信号的实部和虚部分成很多维,每一维上有可能取值。球形译码算法相当于构建了一棵树,树的第k层节点对应的是落在半径为d,维数为k的球内的格点。
汉明码是一种性能良好的码,它是在纠错编码的实践中较早发现的一类具有纠单个错误能力的纠错码,在通信和计算机工程中都有应用。例如:在“计算机组成原理”课程中,我们知道当计算机存储或移动数据时,可能会产生数据位错误,这时可以利用汉明码来检测并纠错。简单的说,汉明码是一个错误校验码码集,由Bell实验室的R.W.Hamming发明,因此定名为汉明码。如果对汉明码作进一步推广,就得出了能纠正多个错误的纠错码,其中最典型的是BCH码,而且汉明码是只纠1bit错误的BCH码,可将它们都归纳到循环码中。
二进制n 维向量v ,这里n >k 。此n 维向量v 就叫做消息u 的码字(codeword )或码向量(code vector )。 因此,对应于2k 种不同的消息,也有2k 种码字。这2k 个码字的集合就叫一个分组码(block code )。若一个分组码可用,2k 个码字必须各不相同。因此,消息u 和码字v 存在一一对应关系。由于n 符号输出码字只取决于对应的k 比特输入消息,即每个消息是独立编码的,从而编码器是无记忆的,且可用组合逻辑电路来实现。
定义:一个长度为n ,有2k 个码字的分组码,当且仅当其2k 个码字构成域GF(2)上所有n 维向量组成的向量空间的一个K 维子空间时被称为线性(linear )(n, k)码。汉明码(n ,k ,d )就是线性分组(n, k)码的一种。其编码算法即为使用生成矩阵G :v = u ·G 。
2.仿真效果预览
matlab2022a仿真结果如下:
3.MATLAB核心程序
clc; clear; close all; warning off; addpath(genpath(pwd)); %% Demonstration of Soft-Hamming-Decoding based on Sphere-Decoding Kc=5; %Number of Parity bits Nframes=3; %Number of Frames M=3; %maximium bit error number M (Size of Sphere) ExtHammCode=1; % 1 for extended Hamming-Code %K_loop for more runs at higher SNR SNRdB=0:1:7; K_loop=round((SNRdB-min(SNRdB)+3).^4.8); %% G: Generator Matrix, H: Paritycheck Matrix G=bem_hammgen(Kc); % Change Generator Matrix to extended Hamming Code if ExtHammCode==1 G=extHammG(G); end kc=size(G,1); % Number of information bits nc=size(G,2); Kc=nc-kc; % Code word length Rc=(kc)/(nc); % Code rate Rc EbN0=SNRdB-10*log10(Rc); % Eb/N0 H = gen2par(G); % generate H from G HT=H.'; % Transpose %% Permutation of 1,2 and 3 bit errors [e1, e2, e3]=permute_e(nc,M); e=[e1;e2;e3]; %% syndrom calculation syn=NaN(size(e,1),Kc); for k=1:size(e,1) syn(k,:)=mod(e(k,:)*HT,2); end %% sort rows of syndroms associated error pattern e [s_sort,s_idx] = sortrows(syn); % sort syn to s_sort e_sort=e(s_idx,:); % sort e to e_sort in the same way as syn e_sort=e_sort(sum(s_sort,2)>0,:); % delete zero rows s_sort=s_sort(sum(s_sort,2)>0,:); % delete zero rows % s_de=bi2de(s_sort,[],'left-msb'); % Communication Toolbox function s_de=bem_bi2de(s_sort); % calculate decimal values from s_sort s_pdf=hist(s_de,1:2^Kc-1); % calculate which value occurs how often %s_pdf(s_pdf==0)=[]; %% Loops for BER calculation tic sigma = sqrt(10.^(-SNRdB./10)); % standard diviation of noise BER_dec_mean=zeros(1,length(SNRdB)); % mean of BER for coded system BER_mean=zeros(1,length(SNRdB)); % mean of BER for uncoded system for zzz=1:length(SNRdB) %disp(num2str(zzz)) for kkk=1:K_loop(zzz) %% random bits x_msg=round(rand(Nframes,kc)); %% channel coding x_code=mod(x_msg*G,2); %% Modulation and Noise x_mod = -(x_code-0.5)*2+1i*1E-99; noi=1/sqrt(2)*(randn(Nframes,nc)+1i*randn(Nframes,nc))*sigma(zzz); x_r=x_mod+noi; %% Demodulation x_llr = real(x_r)*4/sigma(zzz).^2; % Calculate Log-Likelihood Ratios x_code_r=(sign(-x_llr)+1)/2; % Received bit stream %% BER uncoded bit_err=abs(x_code-x_code_r); BER=sum(bit_err(:))/(Nframes*nc); BER_mean(zzz)=BER_mean(zzz)+BER; %% Decoding [x_decode,x_llr_new] = hamm_soft_out(HT,e_sort,s_pdf,x_llr); %[x_decode] = hamm_soft_really_fast(HT,e_sort,s_sort,x_llr,Kc); %% BER coded dec_err=abs(x_code-x_decode); BER_dec=sum(dec_err(:))/(Nframes*nc); BER_dec_mean(zzz)=BER_dec_mean(zzz)+BER_dec; end BER_mean(zzz)=BER_mean(zzz)/K_loop(zzz); BER_dec_mean(zzz)=BER_dec_mean(zzz)/K_loop(zzz); disp(['Eb/N0=' num2str(EbN0(zzz)) ... '; BER_uncoded=' num2str(BER_mean(zzz)) ... '; BER_coded=' num2str(BER_dec_mean(zzz))]); end toc DN='displayname'; Co='Color'; Ma='Marker'; if length(SNRdB)>1 figure(1);hold off semilogy(SNRdB,BER_mean,Co,[0 0 0],Ma,'o',DN,'uncoded'); hold on; grid on; semilogy(EbN0,BER_dec_mean,Co,[0 0 0],Ma,'.',... DN,[num2str(nc) ',' num2str(kc) '-Hamming code, ' 'M=' num2str(M)]); xlabel('E_b/N_0 in dB') ylabel('BER') legend show end A_101
标签:误码率,sort,zzz,%%,译码,汉明,BER,mean From: https://www.cnblogs.com/51matlab/p/17114942.html