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


function [memoria] = sincroMsj(linea, memoria) 
 
%------------------------------------------------------------------------ 
%|   function [memoria] = sincroMsj(linea, memoria) 
%------------------------------------------------------------------------ 
%|      Función que recupera el sincronismo del mensaje, fijándose en 
%|  la primera cabecera BOD que aparece. Elimina la ambiguedad entre 
%|  "0" y "1" que introduce toda modulación PSK. 
%| 
%|       Método de Recuperación de Sincronismo del Mensaje: detecta 
%|   la secuencia primera secuencia BOD.  
%| 
%|  Parámetros de entrada: 
%|      1.- LINEA     = muestra de una señal de línea de niveles TTL 
%|      2.- MEMORIA   = vector fila de longitud mínima 16 o nFlancos,  
%|                      si éste supera los 16 flancos                        
%| 
%|   Parámetros de Salida: 
%|     1.- MEMORIA     = vector fila con las condiciones finales del reloj  
%------------------------------------------------------------------------- 
%|   Autor: Cesar Delgado 
%|   Fecha: 19-Abril-2.004 
%------------------------------------------------------------------------- 
 
%%%%%% Ctes. 
contMUESTRA  = 1;   % Contador de Muestras 
MUESTRAS_BIT = 3;   % Nº muestras/bit 
muestraANT   = 4;   % Muestra Anterior 
ESTADO       = 5;   % Banera: 0 = recuperación sincronismo; 1 = recepción trama 
valorUNO     = 6;   % Voltaje que se le asigna al "1" lógico 
valorMUESTRA = 7;   % Suma de los voltajes de las muestras en 1 símbolo 
contCAB      = 8;   % Nº que especificael número de bits de la cabecera BOF rx. 
posCAB       = 9;   % Donde comenzamos a guardar la 1º cabecera  BOF 
BOD          = [1 1 0 0 1 1 0 0]; 
 
 
%  1.- Suma acumulada de la amplitud de todas muestras de 1 símbolo       
%------------------------------------------------------------------ 
 memoria(valorMUESTRA) = memoria(valorMUESTRA) + linea; 
         
%  2.- Esperamos Recibir el Primer BOF 
%------------------------------------- 
% ---- 2.1.- Nº de coincidencias con la cabecera BOD que llevamos 
contadorCAB = memoria(contCAB);  
    
% ---- 2.2.- Si he llegado a la última muestra de un bit 
        %  Mecanismo de detección de fin de bit: 
        %      a) Detección de flanco 
        %      b) Contador de muestras 
        %     
        %    Si (se detecta un flanco y estamos al final de 1 bit)  
        %      o (llegamos a cubrir el número de muestras que tiene un bit) 
        %      reiniciamos cuenta de muestras.  
%condicion = ( ( (memoria(muestraANT)>linea) |  (memoria(muestraANT)>linea) ) & ... 
%               ( memoria(contMUESTRA) > (memoria(MUESTRAS_BIT)*0.9) ) ); 
 
condicion =  (memoria(contMUESTRA) >= memoria(MUESTRAS_BIT)); 
 
if condicion, 
    
      % 2.2.1.- Determino si es "0" o "1" 
   memoria(posCAB + contadorCAB) = ...                 
      (ceil(memoria(valorMUESTRA)/memoria(contMUESTRA))>2);  
    
      % 2.2.2.- Compruebo que el bit entrante y los anteriores coinciden 
      %         con fragmento de la cabecera BOD 
   comprueba = (memoria(posCAB:posCAB+contadorCAB) == BOD(1:contadorCAB+1)); 
   
     % 2.2.2.1.-   En caso de coincidencia, incremento el número de 
     %              bits coincidente y guardo en memoria el bit actual 
   if (comprueba==ones(1,length(comprueba))), 
      memoria(valorUNO) = 5;       % Coincidencia   
      contadorCAB   = contadorCAB+1; 
      memoria(contCAB)  =  contadorCAB;   
   elseif (comprueba==zeros(1,length(comprueba))), 
      memoria(valorUNO) = 0;       % Coincidencia, pero con signo contrario 
      contadorCAB   = contadorCAB+1; 
      memoria(contCAB)  =  contadorCAB; 
   else 
         % 2.2.2.2.- Si no coincide con BOD, actualizo valores de   
         %            contadores y memoria 
          
      % >>>>> Si los 2 últimos elementos de la memoria son 
      %        iguales (dos "0" ó dos "1"), los mantenemos en memoria. 
      if (contCAB>0) & ...  
            (memoria(posCAB+contadorCAB)==memoria(posCAB+contadorCAB-1)), 
         memoria(posCAB:posCAB+1) = memoria(posCAB+contadorCAB-1:posCAB+contadorCAB); 
         memoria(contCAB)=2; 
          
      % >>>>> Caso Contrario el primer útimo elemento pasa a ser el 1º 
      else 
         memoria(posCAB)= memoria(posCAB+contadorCAB); 
         memoria(contCAB)=1;       
      end;    
   end;    
    
   %------ 2.3.-Reinicio variables de manejo de cada bit 
   memoria(contMUESTRA) = 0; 
   memoria(valorMUESTRA)= 0; 
end; 
  
%  3.- Salgo del estado si he encontrado secuencia coincidente con BOD 
%---------------------------------------------------------------------  
if contadorCAB>7, % Nº flancos que tiene la cambecera SYNCRO entera. 
   memoria(ESTADO) = 4; % Pasamos a la recepción de mensaje.   
end;    
 
 memoria(muestraANT)   = linea;