www.pudn.com > demodula.rar > demoduladorBPSK.m, change:2006-02-02,size:7204b


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;