📄 genera_constel.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 + -