|
|
  |
NCO в схеме восстановления символьной (детектирование по Гарднеру), Разбираюсь по Незами и моделям petrov и des00 |
|
|
|
Oct 21 2013, 10:11
|
Участник

Группа: Участник
Сообщений: 60
Регистрация: 5-12-11
Из: Киев
Пользователь №: 68 692

|
Здравствуйте! Понимаю, что уже в сотый не первый раз это обсуждается (поиском пользовался). Но не могу разобраться, как же этот 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, но смысл просто ускользает. Может быть, есть более подробные описания?
gardnertimingdetector.pdf ( 390.33 килобайт )
Кол-во скачиваний: 1817
Сообщение отредактировал vea - Oct 21 2013, 11:14
|
|
|
|
|
Oct 21 2013, 13:14
|
Участник

Группа: Участник
Сообщений: 60
Регистрация: 5-12-11
Из: Киев
Пользователь №: 68 692

|
Цитата(petrov @ Oct 21 2013, 14:49)  4 так как нам нужно для гарднера взять 2 отсчёта на символ из 8, в интеграторе NCO каждые 4 отсчёта будет переполнение и соответственно сформируется строб для выборки отсчёта и дробное значение фазы для управления интерполятором. Спасибо за мгновенный отклик  Я правильно понимаю, что NCO должен просто 1 раз в 4 отсчета сформировать тактовый сигнал и вместе с ним - передать текущее значение символьного сдвига? Тогда для случая 2 sps NCO должен просто пропускать строб без изменений? Сбивает то, что в модели des00 (для 2 sps) стоит делению по модулю 2. И почему не используется просто счетчик до 4? Дело в том, что в моей текущей модели (bpsk, 2 sps) переполнение интегратора происходит совсем не равномерно (не один раз в N тактов, а то N, то N+1). Это говорит об ошибке в реализации алгоритма? Хотя попробовал заменить на счетчик до 2 - результаты лучше не стали ----update---- Нашел в книге Менгали описание гибридного NCO (стр. 356) - используется деление по модулю 1. При этом период стробирования зависит от величины символьной ошибки. Работа, по всей видимости, ведется на тактовой. "Обычного" цифрового NCO пока не видно.
Сообщение отредактировал vea - Oct 21 2013, 13:46
|
|
|
|
|
Oct 21 2013, 15:01
|
Вечный ламер
     
Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453

|
Цитата(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 выдаёт один строб на символ. проще добавить логику маскирования ошибки в петле по тактовой  Ну и интерполятор лагранжа 3 го порядка не помешает усложнить
--------------------
|
|
|
|
|
Oct 22 2013, 14:36
|
Участник

Группа: Участник
Сообщений: 60
Регистрация: 5-12-11
Из: Киев
Пользователь №: 68 692

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

Группа: Участник
Сообщений: 60
Регистрация: 5-12-11
Из: Киев
Пользователь №: 68 692

|
Цитата(des00 @ Oct 22 2013, 20:11)  вы бы тогда хоть ссылку на модель дали, а то много тут чего было выложено  Вот из этого постаМодель petrov'а - отсюдаЯ правильно понимаю, что TED Гарднера работает непрерывно, но на Loop filter идет только каждый второй отсчет (причем дважды)? В модели petrov в NCO есть выбор только отрицательных значений. Как мне показалось, это вызвано тем, что выход TED Гарднера (если говорить приближенно) - это всего 3 значения +K, -K и 0. (На самом деле имеются не три значения, а три окрестности этих точек) То есть мы учитывает только отрицательные значения. Если это так, то почему в модели на 2sps нет такого сравнения? Спасибо за ответы
Сообщение отредактировал vea - Oct 23 2013, 07:33
|
|
|
|
|
Oct 23 2013, 09:08
|
Гуру
     
Группа: Свой
Сообщений: 2 220
Регистрация: 21-10-04
Из: Balakhna
Пользователь №: 937

|
Цитата(vea @ Oct 23 2013, 11:01)  Посмотрите более поздние модели, в этой модели не совсем правильно сделано, ошибка на NCO должна действовать один раз за символ, ещё диапазон mu не оптимальный. Цитата(vea @ Oct 23 2013, 11:01)  Я правильно понимаю, что TED Гарднера работает непрерывно, но на Loop filter идет только каждый второй отсчет (причем дважды)? Гарднер и петлевой фильтр на символьной частоте работают. Цитата(vea @ Oct 23 2013, 11:01)  В модели petrov в NCO есть выбор только отрицательных значений. Ну так переполнение считается, когда значение аккумулятора модуль превышает, можно десятком способов то же самае сделать, положительные-отрицательные не важно, важно что фазовый аккумулятор сделал оборот в 2pi.
|
|
|
|
|
Nov 4 2013, 13:16
|
Участник

Группа: Участник
Сообщений: 60
Регистрация: 5-12-11
Из: Киев
Пользователь №: 68 692

|
Продолжаю разбираться. Вот код, написанный "в лоб" для 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
y_02.zip ( 148.96 килобайт )
Кол-во скачиваний: 77Входной сигнал со сдвигом 0.7
y_07.zip ( 149.42 килобайт )
Кол-во скачиваний: 61Я правильно понимаю, что если добавить в приведенный код условия вида if overflow == 1 ... для включения TED, то схема должна заработать как ожидается, то есть автоматически подстраиваясь?
Сообщение отредактировал vea - Nov 4 2013, 13:34
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|