⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 genera_constel.m

📁 Method to generate a any constellation used in any communication system. QPSK QAM etc
💻 M
字号:
function [M,tabla_constel,E_const] = genera_constel(constel,flag_norm,tasa)
% GENERA_CONSTEL.M  Genera una constelacion
%
% [M,tabla_constel,E_const] = genera_constel(constel,flag_norm,tasa_ind)
% Entrada:
% - constel: cadena que contiene el nombre de la constelacion.
%   Constelaciones programadas actualmente (son indistintas mayusculas o
%   minusculas):
%   qpsk, 8-psk, 16-qam, v.29, 32-qam, 64-qam, 128-qam, 256-qam, 512-qam
% - flag_norm: 
%       FLAG_NORM = 1, para una constelacion normalizada en energia, 
%       FLAG_NORM = 0, en otro caso.
% - tasa_ind:
%       tasa de codigo para constelaciones 16APSK y 32APSK, segun DVB-S2:
%       16APSK: tasa_ind entre 1 y 6 ( 2/3, 3/4, 4/5, 5/6, 8/9, 9/10 )
%       32APSK: tasa_ind entre 1 y 5 ( 3/4, 4/5, 5/6, 8/9, 9/10 )
% Salida:
% - M: tama駉 de la constelacion
% - tabla_constel: vector que contiene los puntos de la constelacion
% - E_const: Energia de la constelacion (permite normalizar la constelacion
%   a posteriori).

if flag_norm ~= 0 && flag_norm ~= 1
    error('FLAG_NORM debe valer 0 o 1')
end
switch lower(deblank(constel))
    case 'qpsk'
        M = 4;
        [tabla_i,tabla_q] = qaskenco(M);
        tabla_constel = complex(tabla_i,tabla_q);
        E_const = energia_constel(tabla_constel);
        % E_const = 2
    case '8-psk'
        M = 8;
        tabla_constel = exp(j*2*pi*(0:M-1)/M).';
        E_const = energia_constel(tabla_constel);
    case '16-qam'
        M = 16;
        [tabla_i,tabla_q] = qaskenco(M);
        tabla_constel = complex(tabla_i,tabla_q);
        E_const = energia_constel(tabla_constel);
        % E_const = 10;
    case '32-qam'
        M = 32;
        [tabla_i,tabla_q] = qaskenco(M);
        tabla_constel = complex(tabla_i,tabla_q);
        E_const = energia_constel(tabla_constel);
    case '64-qam'
        M = 64;
        [tabla_i,tabla_q] = qaskenco(M);
        tabla_constel = complex(tabla_i,tabla_q);
        E_const = energia_constel(tabla_constel);
    case '128-qam'
        M = 128;
        [tabla_i,tabla_q] = qaskenco(M);
        tabla_constel = complex(tabla_i,tabla_q);
        E_const = energia_constel(tabla_constel);
    case '256-qam'
        M = 256;
        [tabla_i,tabla_q] = qaskenco(M);
        tabla_constel = complex(tabla_i,tabla_q);
        E_const = energia_constel(tabla_constel);
    case '512-qam'
        M = 512;
        [tabla_i,tabla_q] = qaskenco(M);
        tabla_constel = complex(tabla_i,tabla_q);
        E_const = energia_constel(tabla_constel);
    case 'v.29'
        M = 16;
        tabla_constel = [...
                1+j -1+j -1-j 1-j, ...
                3 3+3j 3j -3+3j -3 -3-3j -3j 3-3j, ...
                5 5j -5 -5j...
            ];
        E_const = energia_constel(tabla_constel);
    case '16-apsk'
        if(nargin<3)
            error(['Para 16APSK se necesita la tasa de codigo, de 1 a 6: 2/3, 3/4, 4/5, 5/6, 8/9, 9/10'])
        else
            M = 16;
            G = [3.15 2.85 2.75 2.7 2.6 2.57];
            g = G(tasa);
            tabla_constel = [ exp(i*(pi/4 + (0:3)*pi/2)) g*exp(i*(pi/12 + (0:11)*pi/6)) ];
            E_const = energia_constel(tabla_constel);
        end
    case '32-apsk'
        if(nargin<3)
            error(['Para 32APSK se necesita la tasa de codigo, de 1 a 5: 3/4, 4/5, 5/6, 8/9, 9/10'])
        else
            M = 32;
            G1 = [2.84 2.72 2.64 2.54 2.53];
            G2 = [5.27 4.87 4.64 4.33 4.30];
            g1 = G1(tasa);
            g2 = G2(tasa);
            tabla_constel = [ exp(i*(pi/4 + (0:3)*pi/2)) g1*exp(i*(pi/12 + (0:11)*pi/6)) g2*exp(i*(0:15)*pi/8) ];
            E_const = energia_constel(tabla_constel);
        end
        
    otherwise
        error(['Constelaci髇 ' constel ' no programada'])
end
tabla_constel = tabla_constel(:);
if flag_norm
    tabla_constel = tabla_constel / sqrt(E_const);
    E_const = 1;
end

%-------------------------------------------
function E = energia_constel(tabla_constel)
E = sum(abs(tabla_constel).^2) / length(tabla_constel);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -