www.pudn.com > demodula.rar > sincroMsj.m
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;