function [memoria] = sincroMsj(linea, memoria)
%------------------------------------------------------------------------
%| function [memoria] = sincroMsj(linea, memoria)
%------------------------------------------------------------------------
%| Funcin que recupera el sincronismo del mensaje, fijndose en
%| la primera cabecera BOD que aparece. Elimina la ambiguedad entre
%| "0" y "1" que introduce toda modulacin PSK.
%|
%| Mtodo de Recuperacin de Sincronismo del Mensaje: detecta
%| la secuencia primera secuencia BOD.
%|
%| Parmetros de entrada:
%| 1.- LINEA = muestra de una seal de lnea de niveles TTL
%| 2.- MEMORIA = vector fila de longitud mnima 16 o nFlancos,
%| si ste supera los 16 flancos
%|
%| Parmetros 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 = recuperacin sincronismo; 1 = recepcin trama
valorUNO = 6; % Voltaje que se le asigna al "1" lgico
valorMUESTRA = 7; % Suma de los voltajes de las muestras en 1 smbolo
contCAB = 8; % N que especificael nmero 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 smbolo
%------------------------------------------------------------------
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 deteccin de fin de bit:
% a) Deteccin de flanco
% b) Contador de muestras
%
% Si (se detecta un flanco y estamos al final de 1 bit)
% o (llegamos a cubrir el nmero 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 nmero 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 recepcin de mensaje.
end;
memoria(muestraANT) = linea;