www.pudn.com > demodula.rar > demoduladorBPSK.m
function [trama, memoria, sonda, tau] = demoduladorBPSK (bandaFI, frec, Orden, ...
memoria, N, Bw, primera, parametros)
%------------------------------------------------------------------------
%| function [trama, memoria, sonda, tau] = demoduladorBPSK(bandaFI, frec, orden, ...
%| memoria, N, Bw, primera, parametros)
%------------------------------------------------------------------------
%| Función que implementa un demodulador coherente BPSK
%| mediante un bucle elevador al cuadrado
%|
%| Entradas:
%| 1.- BANDA_FI = vector fila con la señal BPSK con
%| portadora entre [8 - 10] kHz
%| Restricciones: si es matriz, se tomará 1º columna
%| 2.- FREC = vector fila: [Rb, fi, fs]
%| 3.- ORDEN = vectos fila: [Orden Filtro FI, Orden Filtro BB];
%| 4.- MEMORIA = matriz 9x max(Orden) con las condiciones iniciales
%| Fila 1: [ C.I. Comparador de Fases ]
%| Fila 2: [ C.I. Filtro Lead Lag Activo ]
%| Fila 3: [ C.I. VCO ]
%| Fila 4: [ Salida VCO Rectificada ]
%| Fila 5: [ C.I. Divisor ]
%| Fila 6: [ C.I. Filtro DC ]
%| Fila 7: [ C.I. Filtro FI (rec. Portadora) ]
%| Fila 8: [ C.I. Filtro BB (rec. Señal) ]
%| Fila 9: [ C.I. Reloj ]
%|
%| 5.- N = nº alternancias "0" "1" requeridas para
%| la recuperación de reloj.
%| Restricción: N<50;
%| 6.- BW = vector fila con anchos de banda FI y BB,
%| [BW_BB, BW_FI].
%| 7.- PRIMERA = bandera que indica si estamos en la 1º iteracion
%| Es de vital importancia controlar este valor.
%| 8.- PARAMETROS = matriz que contiene todos lo parámetros
%| del PLL: [ Kv , Wn , Psi ]
%| Por defecto: [50 kHz/V, 38.2 krad/sg, 0.707]
%|
%| La matriz de parámetros está ideada para que el PLL conforme un bloque,
%| del que el usuario solo debe conocer los parámetros típicos del lazo del
%| PLL (1º fila)
%| El resto de parámetros los calcularán funciones particulares, de
%| esta forma es muy simple reemplazar el Lead-Lag empleado por otro
%| filtro del lazo cualquiera o usar una transformación Invariante al Impulso
%| en lugar de una Bilineal.
%|
%| ¡¡¡¡¡¡¡¡¡NO REALIZA VALIDACIÓN DE PARÁMETROS DE ENTRADA!!!!!!!!
%|
%| Salida:
%| 1.- TRAMA = Secuencia de "0" y "1" quitando la cabecera
%| de sincronismo (50 alternancias "0" "1");
%| 2.- MEMORIA = matriz 8x34 con las condiciones finales
%| 3.- SONDA = conjunto de variables con los ptos.
%| de observación del receptor
%| 3.1.- CARRIER : portadora recuperada
%| 3.2.- OUT_PLL : salida del PLL (al doble de la portadora)
%| 3.3.- ERROR_PLL : señal de control de VCO
%| 3.4.- DESFASE_PLL: salida del comparador de fases del PLL
%| 3.5.- LINEA : señal banda base recuperada
%| 3.6.- RECTIFICADA: salida del decisor
%| 3.7.- DIVISOR : salida del divisor de frecuencia
%| 3.8.- VCO : fase estimada por el VCO
%| 3.9.- REF_PLL : señal de referencia del PLL (2xFI)
%| 3.10.- IN_DIVISOR: señal de entrada al divisor
%| 4.- TAU = retardo introducido en la demodulacion
%|
%| NOTA: existe un fortísimo acoplamiento entre todas las funciones
%| involucradas en la demodulación, ya que son llamadas para
%| ejecutar una determinada sección de código.
%-------------------------------------------------------------------------
% Autor: Cesar Delgado
% Fecha: 19-Abril-2.004
%-------------------------------------------------------------------------
trama = [];
% 1.- Validación de parámetros de entrada
%-----------------------------------------
if nargin < 2
error ('ERROR: faltan parámetros en demoduladorBPSK');
elseif isempty(bandaFI) | isempty(frec)
error ('ERROR: faltan parámetros en demoduladorBPSK');
else
parametros = [parametros 0; 0 0 0 0; 0 0 0 0];
fs = frec(3);
% 2.- Inicializaciones
%----------------------
% >>>>> 2.1.- Ptos. de observacion dentro de matriz sonda
pCARRIER = 1; pLINEA = 2; pDECISOR = 3;
pOUT_PLL = 4; pERROR_PLL = 5; pDESFASE_PLL = 6;
pFASE_ESTIMADA = 7; pREF_PLL = 8; pIN_DIVISOR = 9;
pOUT_DIVISOR = 10;
% >>>>> 2.2.- Posiciones importantes en memoria
cFILTRO_BB = 8; % Condiciones Iniciales del Filtro Banda Base
RELOJ = 9; % Condiciones del Reloj
% >>>>> 2.3.- Varaibles de bucle
long = length(bandaFI);
sondaAux = zeros(10,1);
sonda = [];
% 3.- Diseño del filtro de FI
%-----------------------------
BwFI = [(frec(2) - Bw(2)/2), ...
(frec(2) + Bw(2)/2)]*(1/frec(3));
H_fi = fir1(Orden(2),2*BwFI);
gp = grpdelay(H_fi,1);
tau_fi = ceil(max(abs(gp)));
% 4.- Diseño del filtro de Banda Base
%-----------------------------------
BwBB = Bw(1)/frec(3);
H_bb = fir1(Orden(1),2*BwBB);
gp = grpdelay(H_bb,1);
retardo = ceil(max(abs(gp)))+tau_fi;
% 5.- Diseño del filtro de continua
%-----------------------------------
BwDC = 2*frec(2)/frec(3); % fi/fs
H_dc = fir1(max(Orden),2*BwDC,'high');
gp = grpdelay(H_dc,1);
retardo = ceil(max(abs(gp)))+retardo;
% 6.- Demodulación BPSK
%----------------------
for k = 1:long
%%%%%% 6.1.- Recuperación de portadora
[sondaAux, memoria(1:cFILTRO_BB-1,:), parametros] = ...
recuperaPortadora(bandaFI(k), memoria(1:cFILTRO_BB-1,:), ...
fs, k==1, H_fi, H_dc, parametros);
%%%%%% 6.2.- Conversión de FI a Banda Base.
bandaBase = 5*sondaAux(pCARRIER)*bandaFI(k);
%%%%%% 6.3.- Filtrado de la banda base
[sondaAux(pLINEA), aux] = filter(H_bb, 1, bandaBase, ...
memoria(cFILTRO_BB,(1:length(H_bb)-1)));
memoria(cFILTRO_BB,1:length(aux)) = aux';
sondaAux(pDECISOR) = ((sondaAux(pLINEA)>0)*5);
%%%%%% 6.4.- Recuperación de Reloj
[aux, memoria(RELOJ,:)] = recuperaReloj(sondaAux(pDECISOR), memoria(RELOJ,:), primera, N);
trama = [trama aux];
%%%%%% 6.5.- Inicializamos variables del bucle
sonda = [sonda, sondaAux'];
primera = 0; sondaAux = zeros(10,1);
end;
end;
tau = retardo;