Доброго времени суток. Продолжаю изучение приема сигналов CPFSK. В данный момент пытаюсь реализовать частотную синхронизацию. Генерирую сигнал следующим образом:
Код: Выделить всё
clear all
close all
lenDataSym = 10000;%Число бит для модуляции
M = 4;%Порядок модуляции
Fs = 600000*4;%Частота дискретизации
symbRate = 600000;%Символьная скорость
samplePerSymb = Fs/symbRate;%Число отсчетов на символ
indexMod = 0.9;%Индекс модуляции
freqSep = indexMod*symbRate;%Расстояние между частотами модуляции
EbN0 = [30];%Отношение С/Ш на бит
data = randsrc(1,lenDataSym, [0 1; 0.5 0.5]);%Генерация битового потока
dataSymb = bi2de(reshape(data,log2(M),[])','left-msb');%Перевод битового потока в символы
modSignal = fskmod(dataSymb,M,freqSep,samplePerSymb,Fs,'cont','gray');%fsk модулятор
recvSignal = awgn(modSignal,EbN0 - 10*log10(samplePerSymb) + 10*log10(log2(M)),'measured');%Добавление шума
То есть, пока никакой частотной отстройки я не добавлял.
Для синхронизации решил использовать алгоритм, описанный в книге Umberto Mengali "Synchronization Techniques for Digital Receivers" на стр. 169.
Блок-схема алгоритма:

Оценка несущей частоты рассчитывается по следующей формуле:

Вот моя попытка реализовать это в матлабе:
Код: Выделить всё
freqOffset = Fs*(angle(sum(recvSignal(2:500).*conj(recvSignal(1:500-1)))))/(2*pi)
Я выбрал задержку D равную 1 (т.е. 0,25 от длительности символа), интервал анализа L0=500 отсчетов.
Вместо ожидаемых 0 Гц я получаю какую-то чушь (-3.2783e+05, например).
Поэтому прошу помощи, мб кто скажет, что я делаю не так и в чем ошибка?
Заранее спасибо.