No BSD License  

Highlights from
BPSK Simulator for Low Rate Transmisions

image thumbnail
from BPSK Simulator for Low Rate Transmisions by César Delgado González
BPSK Simulator for didactical purposes. Systemic coding style.

demoduladorBPSK (bandaFI, frec, Orden, ...
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 at files@mathworks.com