No BSD License  

Highlights from
BPSK Simulator for Low Rate Transmisions

image thumbnail

BPSK Simulator for Low Rate Transmisions

by

 

01 Jun 2004 (Updated )

BPSK Simulator for didactical purposes. Systemic coding style.

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)
%------------------------------------------------------------------------
%|    Funcin que implementa un demodulador coherente BPSK    
%| mediante un bucle elevador al cuadrado
%|
%|    Entradas:
%|       1.- BANDA_FI = vector fila con la seal 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. Seal)     ]
%|                  Fila 9: [ C.I. Reloj                      ]
%|
%|       5.- N        = n alternancias "0" "1" requeridas para 
%|                      la recuperacin de reloj.
%|                      Restriccin: 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 parmetros
%|                        del PLL: [ Kv     ,  Wn         , Psi  ]
%|                    Por defecto: [50 kHz/V, 38.2 krad/sg, 0.707]
%|
%|     La matriz de parmetros est ideada para que el PLL conforme un bloque,
%|   del que el usuario solo debe conocer los parmetros tpicos del lazo del
%|   PLL (1 fila)
%|     El resto de parmetros los calcularn funciones particulares, de 
%|   esta forma es muy simple reemplazar el Lead-Lag empleado por otro
%|  filtro del lazo cualquiera o usar una transformacin Invariante al Impulso
%|  en lugar de una Bilineal.
%| 
%|       NO REALIZA VALIDACIN DE PARMETROS 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 observacin del receptor
%|              3.1.- CARRIER    : portadora recuperada 
%|              3.2.- OUT_PLL    : salida del PLL (al doble de la portadora)
%|              3.3.- ERROR_PLL  : seal de control de VCO
%|              3.4.- DESFASE_PLL: salida del comparador de fases del PLL
%|              3.5.- LINEA      : seal 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    : seal de referencia del PLL (2xFI)
%|              3.10.- IN_DIVISOR: seal de entrada al divisor
%|       4.- TAU    = retardo introducido en la demodulacion
%|
%|  NOTA: existe un fortsimo acoplamiento entre todas las funciones
%|        involucradas en la demodulacin, ya que son llamadas para
%|        ejecutar una determinada seccin de cdigo.
%-------------------------------------------------------------------------
%   Autor: Cesar Delgado
%   Fecha: 19-Abril-2.004
%-------------------------------------------------------------------------

trama   = [];
 
% 1.- Validacin de parmetros de entrada
%-----------------------------------------
if nargin < 2
   error ('ERROR: faltan parmetros en demoduladorBPSK');
elseif isempty(bandaFI) | isempty(frec)
   error ('ERROR: faltan parmetros 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.- Diseo 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.- Diseo 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.- Diseo 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.- Demodulacin BPSK
    %----------------------
    for k = 1:long        
        
       %%%%%% 6.1.- Recuperacin 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.- Conversin 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.- Recuperacin 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;

Contact us