Simulación de rendimiento de Matlab del algoritmo de decodificación de esfera basado en el sistema MIMO

Tabla de contenido

1. Base teórica

2. Programa básico

3. Conclusión de la simulación


1. Base teórica

       En la detección BLAST, el algoritmo ZF (forzamiento cero), el algoritmo MMSE (error cuadrático medio mínimo), el algoritmo OSIC (cancelación de interferencia continua ordenada) o el criterio ML (verosimilitud máxima) se utilizan actualmente para la decodificación. Los primeros tres algoritmos son relativamente simples de implementar, pero el rendimiento de la tasa de error de bit es bajo; mientras que el uso de la detección ML puede obtener un mejor rendimiento, pero su complejidad es alta y no es fácil de implementar. El algoritmo SD (Sphere Decoding) basado en la detección de ML es un algoritmo de detección con un rendimiento optimizado y una complejidad moderada. Se ha demostrado que la complejidad del algoritmo de detección ML usando búsqueda exhaustiva crece exponencialmente con el número de antenas, mientras que la complejidad del algoritmo SD tiene una relación polinomial con el número de antenas en un amplio rango de SNR. Por lo tanto, el algoritmo SD puede obtener un rendimiento de decodificación de máxima probabilidad con menos cómputo.

       La idea básica de la decodificación esférica es buscar puntos de cuadrícula en una esfera multidimensional con un radio de d centrado en un vector x, y reducir la cantidad de puntos de búsqueda limitando o reduciendo el radio de búsqueda, reduciendo así el cálculo. tiempo. La ventaja del algoritmo de decodificación esférica es que no necesita buscar todos los puntos de la cuadrícula como el algoritmo tradicional de decodificación de máxima verosimilitud, sino que solo necesita buscar en un área esférica limitada establecida de antemano. en el área es relativamente pequeño en relación con el número total de puntos en toda la cuadrícula, el tiempo de búsqueda se reducirá considerablemente.

       Los temas clave que afectan la decodificación esférica son: (1) Cómo elegir el radio de búsqueda d. Si d es demasiado grande, habrá demasiados puntos en la bola y la complejidad se acercará o alcanzará la complejidad exponencial de la decodificación de máxima verosimilitud. Si d es demasiado pequeño, es posible que no haya un punto de cuadrícula en la esfera y el algoritmo de decodificación de la esfera no obtendrá una solución razonable. (2) Cómo juzgar si un punto está dentro de la esfera. Si este tipo de juicio necesita ser juzgado por la distancia entre cada punto de la cuadrícula y el vector, entonces este método no es ideal, porque necesitamos examinar todos los puntos, y la cantidad de cálculo generada también es exponencial.

       La decodificación esférica resuelve el segundo problema. Aquí, la señal se considera un número real, porque el número complejo puede separar la parte real y la parte imaginaria duplicando la dimensión. Para juzgar si un punto está en la bola m-dimensional con un radio de d Es más difícil por dentro. Si cambiamos m a 1, la bola degenera en una distancia, y este punto equivale a la parte real o imaginaria de la señal que envía una antena, por lo que la operación es mucho más sencilla, y se puede saber si el punto está dentro de este distancia. La parte real y la parte imaginaria de la señal en múltiples antenas transmisoras se dividen en muchas dimensiones y cada dimensión puede tener un valor. El algoritmo de decodificación esférica es equivalente a construir un árbol, y los nodos de la capa k-ésima del árbol corresponden a los puntos de la cuadrícula que caen en una esfera con un radio de d y una dimensión de k.

 

2. Programa básico

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. Conclusión de la simulación

  

Supongo que te gusta

Origin blog.csdn.net/ccsss22/article/details/130838751
Recomendado
Clasificación