Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: NCO в схеме восстановления символьной (детектирование по Гарднеру)
Форум разработчиков электроники ELECTRONIX.ru > Цифровая обработка сигналов - ЦОС (DSP) > Алгоритмы ЦОС (DSP)
vea
Здравствуйте!
Понимаю, что уже в сотый не первый раз это обсуждается (поиском пользовался).
Но не могу разобраться, как же этот NCO работает.
Сравнивал модели для BPSK petrov'a (8sps), des00 (2sps) и схему 4-13 (QPSK) в книге Незами.
Ставят в тупик сравнения по модулю (с 4 и 2, соответственно) в вышеуказанных моделях,
а у Незами - указания на 3(?) разных частоты работы - 4/T, 1/T, 1/2T.
В статье (прикреплена к сообщению)
"PERFROMANCE ANALYSIS OF THE GARDNER TIMING DETECTOR OVER π/4-DQPSK MODULATION"
есть формула для NCO, но смысл просто ускользает.



Может быть, есть более подробные описания?

Нажмите для просмотра прикрепленного файла
petrov
Цитата(vea @ Oct 21 2013, 14:11) *
Ставят в тупик сравнения по модулю (с 4 и 2, соответственно) в вышеуказанных моделях


4 так как нам нужно для гарднера взять 2 отсчёта на символ из 8, в интеграторе NCO каждые 4 отсчёта будет переполнение и соответственно сформируется строб для выборки отсчёта и дробное значение фазы для управления интерполятором.


vea
Цитата(petrov @ Oct 21 2013, 14:49) *
4 так как нам нужно для гарднера взять 2 отсчёта на символ из 8, в интеграторе NCO каждые 4 отсчёта будет переполнение и соответственно сформируется строб для выборки отсчёта и дробное значение фазы для управления интерполятором.

Спасибо за мгновенный отклик sm.gif
Я правильно понимаю, что NCO должен просто 1 раз в 4 отсчета сформировать тактовый сигнал и вместе с ним - передать текущее значение символьного сдвига?
Тогда для случая 2 sps NCO должен просто пропускать строб без изменений?
Сбивает то, что в модели des00 (для 2 sps) стоит делению по модулю 2.

И почему не используется просто счетчик до 4?

Дело в том, что в моей текущей модели (bpsk, 2 sps) переполнение интегратора происходит совсем не равномерно (не один раз в N тактов, а то N, то N+1). Это говорит об ошибке в реализации алгоритма?
Хотя попробовал заменить на счетчик до 2 - результаты лучше не стали
----update----
Нашел в книге Менгали описание гибридного NCO (стр. 356) - используется деление по модулю 1.
При этом период стробирования зависит от величины символьной ошибки.
Работа, по всей видимости, ведется на тактовой.
"Обычного" цифрового NCO пока не видно.
petrov
Разумеется позиция строба скачет плюс-минус, за счёт этого подстройка и осуществляется.
Случай с частотой дискретизации 2 отсчёта на символ особый для гарднера, если частота опорного генератора передатчика чуть выше приёмника, то частоты дискретизации приёмника недостаточно для работы на 2-х отсчётах на символ частоты передатчика. Ну очевидно можно сделать ещё один параллельный интерполятор работающий со сдвигом, а NCO выдаёт один строб на символ.
des00
Цитата(vea @ Oct 21 2013, 08:14) *
Сбивает то, что в модели des00 (для 2 sps) стоит делению по модулю 2.

Все просто, у petrov на 8sps NCO считает 2 и 1sps для работы схемы гарднера/взятия отсчета, а в случае 2sps NCO считает только 1sps, 2sps там рождаются нативно. В этом случае нужна модификация схемы гарднера, для случая "несуществующего" отсчета

Цитата(petrov @ Oct 21 2013, 09:20) *
Ну очевидно можно сделать ещё один параллельный интерполятор работающий со сдвигом, а NCO выдаёт один строб на символ.

проще добавить логику маскирования ошибки в петле по тактовой sm.gif Ну и интерполятор лагранжа 3 го порядка не помешает усложнить wink.gif
vea
Цитата(des00 @ Oct 21 2013, 18:01) *
нужна модификация схемы гарднера, для случая "несуществующего" отсчета

проще добавить логику маскирования ошибки в петле по тактовой sm.gif Ну и интерполятор лагранжа 3 го порядка не помешает усложнить wink.gif


Даже не подумал о такой проблеме, спасибо.
Но пока - вопрос с NCO.
Сейчас я отлаживаю m-скрипт, ориентируясь на модель des00. Поскольку много неясного, то отладка поэтапная и постепенная.
Результаты детектора Гарднера - идентичны (на одинаковом входном векторе).
После петлевого фильтра - расхождение порядка 10^-4, постепенно затухающее (неясно, буду разбираться).
А вот с NCO сразу проблемы. Уважаемый des00, почему такая неожиданная инициализация регистра в интеграторе NCO?
des00
Цитата(vea @ Oct 22 2013, 08:36) *
А вот с NCO сразу проблемы. Уважаемый des00, почему такая неожиданная инициализация регистра в интеграторе NCO?

вы бы тогда хоть ссылку на модель дали, а то много тут чего было выложено sm.gif
vea
Цитата(des00 @ Oct 22 2013, 20:11) *
вы бы тогда хоть ссылку на модель дали, а то много тут чего было выложено sm.gif

Вот из этого поста
Модель petrov'а - отсюда

Я правильно понимаю, что TED Гарднера работает непрерывно, но на Loop filter идет только каждый второй отсчет (причем дважды)?

В модели petrov в NCO есть выбор только отрицательных значений.
Как мне показалось, это вызвано тем, что выход TED Гарднера (если говорить приближенно) - это всего 3 значения +K, -K и 0.
(На самом деле имеются не три значения, а три окрестности этих точек)
То есть мы учитывает только отрицательные значения.
Если это так, то почему в модели на 2sps нет такого сравнения?

Спасибо за ответы sm.gif

petrov
Цитата(vea @ Oct 23 2013, 11:01) *
Модель petrov'а - отсюда


Посмотрите более поздние модели, в этой модели не совсем правильно сделано, ошибка на NCO должна действовать один раз за символ, ещё диапазон mu не оптимальный.

Цитата(vea @ Oct 23 2013, 11:01) *
Я правильно понимаю, что TED Гарднера работает непрерывно, но на Loop filter идет только каждый второй отсчет (причем дважды)?


Гарднер и петлевой фильтр на символьной частоте работают.

Цитата(vea @ Oct 23 2013, 11:01) *
В модели petrov в NCO есть выбор только отрицательных значений.


Ну так переполнение считается, когда значение аккумулятора модуль превышает, можно десятком способов то же самае сделать, положительные-отрицательные не важно, важно что фазовый аккумулятор сделал оборот в 2pi.
vea
Продолжаю разбираться.
Вот код, написанный "в лоб" для QPSK по схеме 4-13 Незами, без учета разных тактовых.
(Несмотря на подпись под схемой, она расположена в разделе QPSK)
Код
Kp = 20e-4; % from des00 model
Ki = 50e-7;
% initialization
BUF_TED     = [0 0]; % shift register for TED
BUF_LF      = [0 0 0]; % shift register for Loop filter
mu = zeros(size(y));
for k=3:length(y)-2
    y_out(k)    = farrow(mu(k-1),y(k-2),y(k-1),y(k),y(k+1)); %interpolator
    error       = sign(real(BUF_TED(1)))*[real(y_out(k)) - real(BUF_TED(2))]+sign(imag(BUF_TED(1)))*[imag(y_out(k)) - imag(BUF_TED(2))]; %TED
% loop filter start
    mu(k)       = BUF_LF(2) + BUF_LF(3);
    BUF_LF(3)   = mu(k);
    BUF_LF(2)   = Kp*error + [Ki*error + BUF_LF(1)];
    BUF_LF(1)   = BUF_LF(1) + Ki*error;
% loop filter end
    BUF_TED     = [ y_out(k) BUF_TED(1:end-1) ];
end
subplot(311);plot(mu,'.');grid;shg
subplot(312);plot(y_out(1:2:end),'.');grid;shg
subplot(313);plot(y_out(2:2:end),'.');grid;shg

Схема в том виде, как на рисунке в книге (снова повторюсь, не понял наличия трех разных частот или что это там), не заработала. Начала работать после изменения loop-фильтра на тот, что предложен на рис. 3.7
Ну, то есть работать - это сильно сказано. Если сюда подать y (входной сигнал на 2-х тактовых, сдвинутый на delta), то получится:
при delta<0.5 - надо брать y_out(1:2:end)
при delta>0.5 - надо брать y_out(2:2:end)
То есть схема NCO, включающая и выключающая TED, должна как раз и делать этот выбор, правильно?


Входной сигнал со сдвигом 0.2 Нажмите для просмотра прикрепленного файлаВходной сигнал со сдвигом 0.7 Нажмите для просмотра прикрепленного файла
Я правильно понимаю, что если добавить в приведенный код условия вида if overflow == 1 ... для включения TED, то схема должна заработать как ожидается, то есть автоматически подстраиваясь?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.