MIMO 시스템 기반 구 디코딩 알고리즘의 Matlab 성능 시뮬레이션

목차

1. 이론적 근거

2. 핵심 프로그램

3. 시뮬레이션 결론


1. 이론적 근거

       BLAST 검출에서는 현재 사용되는 ZF(zero-forcing) 알고리즘, MMSE(minimum mean square error) 알고리즘, OSIC(ordered continuous interference cancelation) 또는 ML(maximumlikelihood) 기준을 디코딩에 사용한다. 앞의 세 가지 알고리즘은 구현이 비교적 간단하지만 비트 오류율 성능이 좋지 않은 반면 ML 감지를 사용하면 성능이 향상될 수 있지만 복잡도가 높고 구현하기 쉽지 않습니다. ML 검출 기반의 SD(Sphere Decoding) 알고리즘은 최적화된 성능과 적당한 복잡도를 가진 검출 알고리즘입니다. Exhaustive search를 사용하는 ML 검출 알고리즘의 복잡도는 안테나 개수에 따라 기하급수적으로 증가하는 반면, SD 알고리즘의 복잡도는 넓은 SNR 범위에서 안테나 개수와 다항식 관계를 갖는다는 것이 증명되었다. 따라서 SD 알고리즘은 더 적은 계산으로 최대 우도 디코딩 성능을 얻을 수 있습니다.

       구형 디코딩의 기본 아이디어는 벡터 x를 중심으로 반지름이 d인 다차원 구에서 격자점을 검색하고, 검색 반경을 제한하거나 줄임으로써 검색 포인트의 수를 줄여 계산을 줄이는 것입니다. 시간. 구형 복호화 알고리즘의 장점은 기존의 최대우도 복호화 알고리즘과 같이 전체 격자의 모든 격자점을 탐색할 필요가 없고 미리 설정된 제한된 구형 영역에서만 탐색하면 된다는 점이다. 전체 그리드의 총 포인트 수에 비해 영역이 상대적으로 작으면 검색 시간이 크게 줄어듭니다.

       구형 디코딩에 영향을 미치는 주요 문제는 다음과 같습니다. (1) 검색 반경을 선택하는 방법 d. d가 너무 크면 공에 너무 많은 포인트가 있고 복잡성은 최대 우도 디코딩의 지수 복잡성에 접근하거나 도달합니다. d가 너무 작으면 구에 그리드 포인트가 없을 수 있으며 구 디코딩 알고리즘은 합리적인 솔루션을 얻지 못할 것입니다. (2) 점이 구 내부에 있는지 여부를 판단하는 방법. 이러한 종류의 판단을 각 그리드 점과 벡터 사이의 거리로 판단해야 하는 경우 모든 점을 검사해야 하고 생성되는 계산량도 지수 함수적이므로 이 방법은 이상적이지 않습니다.

       구형 디코딩은 두 번째 문제를 해결합니다. 여기서 복소수는 차원을 두 배로 늘려 실수부와 허수부를 분리할 수 있기 때문에 신호를 실수로 간주합니다. 반지름 d 내부가 더 어렵습니다. m을 1로 바꾸면 공은 거리로 변질되는데, 이 점은 안테나가 보내는 신호의 실수부 또는 허수부에 해당하므로 연산이 훨씬 간단하고 점이 이 이내인지 알 수 있다. 거리. 다중 송신 안테나 상의 신호의 실수부와 허수부는 많은 차원으로 나뉘며 각 차원은 값을 가질 수 있다. 구형 디코딩 알고리즘은 트리를 구성하는 것과 동일하며 트리의 k번째 레이어 노드는 반지름이 d이고 차원이 k인 구에 떨어지는 격자점에 해당합니다.

 

2. 핵심 프로그램

function y1 = spheredecodeinftoML(rev,C,H, codebook)
[m,n]=size(H);      %m为Nr,n为Nt
T = zeros(1,n);   

[Q,R] = qr(H);    %QR分解
R = R(1:n, :);    %R= R(1:Nt,:)
ro = Q'*rev;  %y'=Q1'y
for ii = 1:n  %R为上三角矩阵
    if R(ii,ii) == 0
        R(ii,ii) = 0.001;
    end
    for jj = ii+1:n
        R(ii,jj) = R(ii,jj)/R(ii,ii); %为后面的运算做铺垫
    end
    ro(ii) = ro(ii)/R(ii,ii);%相当于ym/Rmm,ym-1/Rm-1...
    R(ii,ii) = R(ii,ii)^2;
end
d = C;    %初始半径
T(n) = 0; %T相当于是dm,m-1,m-2...的值,每维的半径
S = ro;   %相当于ym/Rmm
cn = length(codebook); %码本长度,4qam的话,就为2
len = zeros(1,n);
Y = zeros(n, cn);
ind = zeros(1,n);
y1 = zeros(n,1);
yt = [];
while 1
    k = n;                          %表示从第n维开始计算可能取值
    while k >= 1
       U =sqrt(d/R(k,k))+S(k);%上限值
       ii=cn;
        while ii >= 1 && U < codebook(ii)-10^(-11)
            ii = ii - 1;
        end
       L =-sqrt(d/R(k,k))+S(k);%下限值
       jj=1;
        while jj <= cn && L > codebook(jj)+10^(-11)
            jj = jj + 1;
        end
       len(k) = ii-jj+1;    %第K维的可能值的个数
       Y(k,:) = zeros(1, cn);
       yt = [];
        for kk = 1:len(k)
            yt = [yt codebook(jj+kk-1)];
        end
        [yt1, idex] = sort(abs(yt - S(k)));%按行升序排序
        yt = yt(idex);                     %yt存储信号的可能取值    
        for kk = 1:len(k)
            Y(k,kk) = yt(kk);%从偏差最小的点开始存储,按序,存储信号的可能取值在Y里
        end
        ind(k)=0;%作为标记
        d1 = d+1;
        while d1 > d - 10^(-11)
            ind(k) = ind(k) + 1;
            while ind(k) > len(k)
                if k == n
                    if y1~=zeros(n,1)
                         return       %结束,返回y1    
                    else
                          C=2*C;
                          y1=spheredecodetoML(rev, C, H, codebook);
                          return  
                    end   
                end
                k = k+1;   %表示在第k维中没有找到值,则返回到k+1维中
                ind(k) = ind(k) + 1; %在第k+1维中从下一个点开始搜
            end
            if k > 1
              %  T(k-1) = T(k) - R(k,k)*(S(k)-Y(k,ind(k)))^2;%求dm-1的值,Y(k,ind(k))相当于第k维的取值   采用第二范数
               T(k-1)=max(T(k),R(k,k)*(S(k)-Y(k,ind(k)))^2);                                    % 采用无穷范数
                tmp = 0;
                for ii = k:n
                    tmp = tmp + R(k-1, ii)*Y(ii,ind(ii)) ;
                end
                S(k-1) = ro(k-1) - tmp;              %
                k = k - 1;                           %从第k维降到k-1维
                break;                               %跳出while循环              
            end
          %  d1 = T(n) - T(1) + R(1,1)*(S(1) - Y(1, ind(1)))^2;%k=1时的d1值
         d1 = max(T(1), R(1,1)*(S(1) - Y(1, ind(1)))^2); %k=1时的值    无穷范数
        end %while d1 > d
        if d1 < d-10^(-11)
            for ii=1:n
                y1(ii) = Y(ii, ind(ii));
            end
          d = d1;
        T(n)=0;
        break;
      end
    end %while k>=1
end %while 1 k=n
up212

3. 시뮬레이션 결론

  

추천

출처blog.csdn.net/ccsss22/article/details/130838751