Временная синхронизация

ЦОС, обработка видео и изображений в MATLAB\Simulink

Модератор: Admin

Sniper53
Пользователь
Сообщения: 53
Зарегистрирован: Пн ноя 09, 2015 7:30 pm

Временная синхронизация

Сообщение Sniper53 » Пт июл 13, 2018 10:37 am

Всем добрый день! Пытаюсь реализовать алгоритм временной синхронизации, но что-то совсем в тупик зашел. Прочитал, что схема Гарднера не чувствительна к расстройке несущей (то что мне нужно). Интуитивно понимаю как работает алгоритм, но не могу понять как его реализовать... Получается имеются отсчеты сигнала, я выбираю два отчета на символ. Затем по отсчету предыдущего символа и этих двух произвожу оценку временной ошибки. Трудности возникают с тем, что делать с этой ошибкой...

Я так понимаю в цикле необходимо еще раз интерполировать сигнал по этим двум отчетам и из полученного набора выбрать отчет с наименьшей ошибкой. Или возможно лишний раз не децимировать/интерполировать сигнал, а работать уже с имеющимися отчетами?

Код: Выделить всё

close all
clear all

load('s.mat')
%s = randi([0 1],1,1000)*-2+1;

T = length(s);

fd = 100;
td = 1/fd;
N = T*fd;

signal = upsample(s,fd);
signal = filter(ones(1,fd),1,signal);
signal = complex(signal,0);


t = 0:td:length(signal)*td-td;



signalf = signal.*exp(1i.*2.*pi*0.*t + 0*pi/4);



rxsig = filter(ones(1,fd),1,[zeros(1,10) signalf]); %задержка
plot(real(rxsig))

sig = rxsig(100:50:length(rxsig));

Kp = 0.0888;
Ki = 3.77e-3;
%Kd = 1;
%Ko = 1;
loop(1:2) = 0;
error(1:2) = 0;

for i = 3:1:length(sig)
   
    e(i) = (sig(i)-sig(i-2))*sig(i-1);
       
    loop(i) = Kp * e(i) + (Ki-Kp)*e(i-1) + loop(i-1);
   
    %loop(i) = Kp * e(i) +  loop(i-1);
   
end


Пока я пытаюсь компенсировать задержку в канале, но что-то пока совсем мысль потерял. Не могу понять, как замкнуть петлю обратной связи...
С наилучшими пожеланиями, Федоров Д.А.

sandy
Эксперт
Сообщения: 5456
Зарегистрирован: Ср сен 22, 2004 4:49 pm

Re: Временная синхронизация

Сообщение sandy » Пт июл 13, 2018 12:14 pm

Трудности возникают с тем, что делать с этой ошибкой...

Сигнал ошибки (после прохождения черезх петлевой фильтр) управляет интерполятором, то есть меняет временной сдвиг для последующих отсчетов сигнала.
Я так понимаю в цикле необходимо еще раз интерполировать сигнал по этим двум отчетам и из полученного набора выбрать отчет с наименьшей ошибкой.

Это больше похоже на описание разомкнутой системы. Так о каком варианте синхронизации все-таки идет речь - feedback или feedforward? В MATLAB, честно говоря, не очень удобно писать замкнутые системы - векторизацию при этом не удастся использовать. Возможно, Simulink здесь будет нагляднее и удобнее.
С уважением

Александр Сергиенко

Sniper53
Пользователь
Сообщения: 53
Зарегистрирован: Пн ноя 09, 2015 7:30 pm

Re: Временная синхронизация

Сообщение Sniper53 » Пт июл 13, 2018 1:02 pm

sandy писал(а):Сигнал ошибки (после прохождения черезх петлевой фильтр) управляет интерполятором, то есть меняет временной сдвиг для последующих отсчетов сигнала.

Это понятно, во всяком случае интуитивно. Однако у меня ведь сигнал ошибки получается двухполярным, хотя в моем случае сигнал только запаздывает. Так и должно быть?
После СФ имеется N отчетов на символ, по двум отчетам я провожу оценку временной ошибки, а интерполятор (с управляемой задержкой) должен стоять после СФ, т.е. у меня сигал будет состоять из N*коэф. интерп отчетов?

sandy писал(а):Это больше похоже на описание разомкнутой системы. Так о каком варианте синхронизации все-таки идет речь - feedback или feedforward?

Пытаюсь реализовать feedback. Не совсем удачно выразился, я имел ввиду именно скорректировать временной сдвиг, чтобы на момент стробирования выпадал максимальный отчет.

sandy писал(а): В MATLAB, честно говоря, не очень удобно писать замкнутые системы - векторизацию при этом не удастся использовать. Возможно, Simulink здесь будет нагляднее и удобнее.

Это понятно, приходится циклами обходиться. В Simulinke гораздо удобнее, к сожалению задача стоит написать демодулятор именно в матлабе...
С наилучшими пожеланиями, Федоров Д.А.

sandy
Эксперт
Сообщения: 5456
Зарегистрирован: Ср сен 22, 2004 4:49 pm

Re: Временная синхронизация

Сообщение sandy » Пт июл 13, 2018 2:56 pm

Однако у меня ведь сигнал ошибки получается двухполярным, хотя в моем случае сигнал только запаздывает. Так и должно быть?

1. Сигнал ошибки только В СРЕДНЕМ должен иметь нужную полярность (т.е. приобретать ее после сглаживающего фильтра). Сам по себе он вполне имеет право быть двуполярным.
2. У вас в коде ошибка - в цикле по i шаг должен быть равен 2, так как эти расчеты выполняются один раз на символ, а не на полсимвола.
т.е. у меня сигал будет состоять из N*коэф. интерп отчетов?

Эту фразу я не понял. Для работы данной системы нужно иметь два отсчета на символ.
Пытаюсь реализовать feedback.

У меня под рукой нет готового кода, который я мог бы дать в качестве примера, поэтому на словах попробую. Я делал такие вещи примерно так.
1. Делается функция интерполяции, которая будет возвращать отсчет сигнала после СФ с произвольным ДРОБНЫМ номером. Внутри функции можете использовать любой желаемый метод интерполяции.
2. Создается переменная для хранения текущего времени стробирования, ей присваивается какое-то начальное значение.
3. В цикле по символам делается следующее:
3.1. Формируется сигнал ошибки
3.2. Он запихивается в петлевой фильтр, на выходе фильтра получается текущая оценка смещения времени стробирования.
3.3. К текущему времени стробирования прибавляется номинальное смещение (половина длительности символа) и дополнительное смещение с выхода петлевого фильтра. Получается текущее время стробирования
3.4. С использоанием интерполирующей функции извлекается отсчет сигнала для полученного момента времени
3.5. Так как здесь нужно два отсчета на символ, время стробирования увеличивается на полсимвола, интерполирующая функция дает отсчет сигнала для этого момента времени. Таким образом, получились два новых отсчета для вектора sig.
С уважением



Александр Сергиенко

Sniper53
Пользователь
Сообщения: 53
Зарегистрирован: Пн ноя 09, 2015 7:30 pm

Re: Временная синхронизация

Сообщение Sniper53 » Пт июл 13, 2018 4:03 pm

sandy писал(а):Эту фразу я не понял. Для работы данной системы нужно иметь два отсчета на символ.

Да, тут я уже разобрался. Я думал интерполировать исходный сигнал.

sandy писал(а):У меня под рукой нет готового кода, который я мог бы дать в качестве примера, поэтому на словах попробую. Я делал такие вещи примерно так.
1. Делается функция интерполяции, которая будет возвращать отсчет сигнала после СФ с произвольным ДРОБНЫМ номером. Внутри функции можете использовать любой желаемый метод интерполяции.
2. Создается переменная для хранения текущего времени стробирования, ей присваивается какое-то начальное значение.
3. В цикле по символам делается следующее:
3.1. Формируется сигнал ошибки
3.2. Он запихивается в петлевой фильтр, на выходе фильтра получается текущая оценка смещения времени стробирования.
3.3. К текущему времени стробирования прибавляется номинальное смещение (половина длительности символа) и дополнительное смещение с выхода петлевого фильтра. Получается текущее время стробирования
3.4.С использоанием интерполирующей функции извлекается отсчет сигнала для полученного момента времени
3.5. Так как здесь нужно два отсчета на символ, время стробирования увеличивается на полсимвола, интерполирующая функция дает отсчет сигнала для этого момента времени. Таким образом, получились два новых отсчета для вектора sig.


Спасибо большое, сейчас как-раз пишу функцию интерполяции. Думаю в понедельник что-то должно получится!
Данная петля же может быть применена перед ФАПЧ?
С наилучшими пожеланиями, Федоров Д.А.

sandy
Эксперт
Сообщения: 5456
Зарегистрирован: Ср сен 22, 2004 4:49 pm

Re: Временная синхронизация

Сообщение sandy » Пт июл 13, 2018 4:41 pm

Данная петля же может быть применена перед ФАПЧ?

Данный алгоритм нечувствителен к фазе (если код исправить, а то у вас там расчет сигнала ошибки для вещественного сигнала написан, в комплексной версии должно быть real((sig(i)-sig(i-2))*conj(sig(i-1)))) и способен перенести некоторый частотный сдвиг, так что да.
С уважением



Александр Сергиенко

Sniper53
Пользователь
Сообщения: 53
Зарегистрирован: Пн ноя 09, 2015 7:30 pm

Re: Временная синхронизация

Сообщение Sniper53 » Пт июл 13, 2018 6:33 pm

sandy писал(а):
Данная петля же может быть применена перед ФАПЧ?

Данный алгоритм нечувствителен к фазе (если код исправить, а то у вас там расчет сигнала ошибки для вещественного сигнала написан, в комплексной версии должно быть real((sig(i)-sig(i-2))*conj(sig(i-1)))) и способен перенести некоторый частотный сдвиг, так что да.


Спасибо большое! Если возникнут трудности, напишу!
С наилучшими пожеланиями, Федоров Д.А.