Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Реализация LMS для QAM-4
Форум разработчиков электроники ELECTRONIX.ru > Цифровая обработка сигналов - ЦОС (DSP) > Алгоритмы ЦОС (DSP)
Wanderer.I
Добрый день! Мне нужно реализовать модель приёмника с LMS эквалайзером при КАМ модуляции. Проблема состоит в следующем, мне не совсем понятно как быть в данном случае с квадратурной и синфазной составляющей, должно ли в данном случае присутствовать два эквалайзера один для квадратурной, а другой для синфазной составляющей ( т.е. для каждой составляющей импульсная характеристика будет линейной) или же данный алгоритм должен работать в комплексном виде( импульсная характеристика комплексная)? Дело в том, что все найденные мной описания оперирует с действительными числами.
petrov
В комплексном виде должно работать, на форуме модели в симулинке выкладывались.
Serg76
Цитата(Wanderer.I @ May 18 2011, 13:56) *
Добрый день! Мне нужно реализовать модель приёмника с LMS эквалайзером при КАМ модуляции. Проблема состоит в следующем, мне не совсем понятно как быть в данном случае с квадратурной и синфазной составляющей, должно ли в данном случае присутствовать два эквалайзера один для квадратурной, а другой для синфазной составляющей ( т.е. для каждой составляющей импульсная характеристика будет линейной) или же данный алгоритм должен работать в комплексном виде( импульсная характеристика комплексная)? Дело в том, что все найденные мной описания оперирует с действительными числами.

Делайте для каждого канала свой эквалайзер, в этом случае можно избежать проблемы разбаланса между квадратурами, но больше вычислительных затрат
Wanderer.I
Дело в том, что я уже почти реализовал это в виде двух эквалайзеров, один для действительной части, другой для мнимой, но сейчас сомнения появились в том правильно это или нет.
Цитата
Делайте для каждого канала свой эквалайзер, в этом случае можно избежать проблемы разбаланса между квадратурами, но больше вычислительных затрат

Т.е. если я сделаю скажем для каждой компоненты I и Q свой эквалайзер всё должно работать?
Цитата
В комплексном виде должно работать, на форуме модели в симулинке выкладывались.

Мне нужно это реализовать на C( а конвертация из симулинка в C не годится). Первоначально планирую в Matlab написать в виде m файла. А где можно прочесть про реализацию в комплексном виде?
petrov
Цитата(Wanderer.I @ May 18 2011, 15:47) *
Мне нужно это реализовать на C( а конвертация из симулинка в C не годится). Первоначально планирую в Matlab написать в виде m файла. А где можно прочесть про реализацию в комплексном виде?


Ну а мне на VHDL, модели симуликовские они для понимания исключительно, почитать можно у Прокиса.
Serg76
Цитата(Wanderer.I @ May 18 2011, 14:47) *
Т.е. если я сделаю скажем для каждой компоненты I и Q свой эквалайзер всё должно работать?

Естественно, если, конечно,все правильно реализовать
petrov
Цитата(Serg76 @ May 18 2011, 16:00) *
Естественно, если, конечно,все правильно реализовать


Можно поподробнее, не понятно о какой схеме речь, что за разбаланс и т. п.?
Wanderer.I
Цитата
Ну а мне на VHDL, модели симуликовские они для понимания исключительно

В чём их наглядность интересно? Если это чёрный ящик по сути?
petrov
Цитата(Wanderer.I @ May 18 2011, 16:25) *
Если это чёрный ящик по сути?


С чего вы взяли?
Serg76
Цитата(petrov @ May 18 2011, 15:07) *
Можно поподробнее, не понятно о какой схеме речь, что за разбаланс и т. п.?

Схема квадратурной дискретизации, когда в аналоговом виде осуществляется гетеродинирование и НЧ фильтрация в каждом из подканалов и затем уже независимая оцифровка каждой из компонент. Разбаланс возникает из-за неидеальности характеристик двух плеч. Но, правда, такая схема уже не находит применения, сейчас сигнал дискретизируется непосредственно уже по ПЧ, с последующей обработкой в цифре.
Wanderer.I
Цитата(petrov @ May 18 2011, 15:30) *
С чего вы взяли?

Каким образом можно посмотреть каким образом работает данный блок более детально? Ведь максимум можно увидеть пару кирпичиков, достаточно много функциональных
petrov
Цитата(Serg76 @ May 18 2011, 16:37) *
Схема квадратурной дискретизации, когда в аналоговом виде осуществляется гетеродинирование и НЧ фильтрация в каждом из подканалов и затем уже независимая оцифровка каждой из компонент. Разбаланс возникает из-за неидеальности характеристик двух плеч. Но, правда, такая схема уже не находит применения, сейчас сигнал дискретизируется непосредственно уже по ПЧ, с последующей обработкой в цифре.

У автора топика не об этом вопрос был.

Цитата(Wanderer.I @ May 18 2011, 16:47) *
Каким образом можно посмотреть каким образом работает данный блок более детально? Ведь максимум можно увидеть пару кирпичиков, достаточно много функциональных

Вы слишком предвзято относитесь, на C вы можете пользоваться дллками скрытыми, можете руками делать, и в симулинке так же.
Serg76
Цитата(petrov @ May 18 2011, 15:57) *
У автора топика не об этом вопрос был.

Понятно, что не об этом. Это Вы меня об этом спрашиваете. Просто я ему посоветовал делать двухканальный эквалайзер, в этом случае, у меня, пок крайней мере, в демодуляторе наблюдался незначительный, но все-таки выигрыш, поэтому я оставил этот вариант.
Wanderer.I
Цитата
Дело в том, что я уже почти реализовал это в виде двух эквалайзеров, один для действительной части, другой для мнимой, но сейчас сомнения появились в том правильно это или нет.
Цитата
Делайте для каждого канала свой эквалайзер, в этом случае можно избежать проблемы разбаланса между квадратурами, но больше вычислительных затрат

Т.е. если я сделаю скажем для каждой компоненты I и Q свой эквалайзер всё должно работать?
Цитата
В комплексном виде должно работать, на форуме модели в симулинке выкладывались.

Мне нужно это реализовать на C( а конвертация из симулинка в C не годится). Первоначально планирую в Matlab написать в виде m файла. А где можно прочесть про реализацию в комплексном виде?

Я видимо немного не так понял тебя, я думал речь идёт о готовых блоках. Теперь всё ясно. Сейчас поиском займусь тогда, спасибо!

Просто всё это дело надо ещё в фикспоинт уложить, поэтому вариант с двумя каналами будет проще.
Serg76
Цитата(Wanderer.I @ May 18 2011, 16:10) *
поэтому вариант с двумя каналами будет проще.

Так проще как раз вариант с комплексным корректором, с точки зрения реализации
Wanderer.I
Вычисления все сложнее становятся, так как C в отличие от Matlab комплексные переменные не поддерживает.
Serg76
Цитата(Wanderer.I @ May 18 2011, 14:47) *
Мне нужно это реализовать на C( а конвертация из симулинка в C не годится). Первоначально планирую в Matlab написать в виде m файла. А где можно прочесть про реализацию в комплексном виде?

Если нужна скорость обработки, то попробуйте использовать примитивы от Intel + Си компилятор от того же Intel, все это вместе даст СУЩЕСТВЕННЫЙ прирост производительности
alex_os
To Serg76.

Корректор с двумя раздельными каналами для re, im.
И в каждом из каналов коэффициенты корректора вещественные ??
Serg76
Цитата(alex_os @ May 18 2011, 18:56) *
To Serg76.

Корректор с двумя раздельными каналами для re, im.
И в каждом из каналов коэффициенты корректора вещественные ??

да
petrov
Цитата(Serg76 @ May 18 2011, 20:01) *
да


Может чего-то не понимаю, но ИМХО неправильно это, поэтому и вопрос был по конкретной схеме эквалайзера.
alex_os
Цитата(petrov @ May 18 2011, 20:07) *
Может чего-то не понимаю, но ИМХО неправильно это, поэтому и вопрос был по конкретной схеме эквалайзера.

Присоединяюсь!
Например, ИХ канала h = [1, 0+0.5i] как можно вещественными коэффициентами это скорректировать ?!
Serg76
Цитата(petrov @ May 18 2011, 19:07) *
Может чего-то не понимаю, но ИМХО неправильно это, поэтому и вопрос был по конкретной схеме эквалайзера.

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

Цитата(alex_os @ May 18 2011, 19:17) *
Присоединяюсь!
Например, ИХ канала h = [1, 0+0.5i] как можно вещественными коэффициентами это скорректировать ?!

Отдельно корректировать мнимую и вещественную часть h
petrov
Цитата(Serg76 @ May 18 2011, 20:21) *
Почему неправильно? При подстройке к-ов корректора для каждого из каналов участвует только одна, соответствующая данному квадратурному каналу, проекция вектора ошибки, а если использовать в корректоре для обоих каналов одну и ту же импульсную характеристику (ИХ), то тогда при расчете к-ов ИХ необходимо учитывать общий вклад проекций ошибок обоих каналов. Вроде так где-то, у меня работали оба варианта


Пусть нам даже известна обратная комплексная ИХ канала, соответственно сворачиваем с ней входной сигнал, не существует таких действительных коэффициентов чтобы при умножении отдельно мнимой и действительной части входного сигнала получить аналогичный результат.
Serg76
Цитата(petrov @ May 18 2011, 19:38) *
Пусть нам даже известна обратная комплексная ИХ канала, соответственно сворачиваем с ней входной сигнал, не существует таких действительных коэффициентов чтобы при умножении отдельно мнимой и действительной части входного сигнала получить аналогичный результат.

Может не так объясняю, попробую еще раз. Демодулятор построен по квадратурной схеме, в котором для коррекции МСИ используются 2 корректора, один для коррекции в синфазном канале, другой в квадратурном. Подстройка ИХ каждого из каналов осуществляется независимо, по соответствующим проекциям вектора ошибки. Обе эти ИХ в итоге и будут давать общую комплексную ИХ канала. Или я в чем-то неправ?
petrov
Цитата(Serg76 @ May 18 2011, 20:55) *
Может не так объясняю, попробую еще раз. Демодулятор построен по квадратурной схеме, в котором для коррекции МСИ используются 2 корректора, один для коррекции в синфазном канале, другой в квадратурном. Подстройка ИХ каждого из каналов осуществляется независимо, по соответствующим проекциям вектора ошибки. Обе эти ИХ в итоге и будут давать общую комплексную ИХ канала. Или я в чем-то неправ?


Сигнал комплексный, ИХ эквалайхера комплексная, умножаем (a+bi)*(c+di)=(ac-bd)+(bc+ad)i, очевидно что в действительную часть выходного сигнала входит как действительная так и мнимая часть входного, так и в мнимую часть выходного входит как действительная так и мнимая часть входного сигнала, если у вас так значит у вас комплексный эквалайзер.
Serg76
Цитата(petrov @ May 18 2011, 20:41) *
Сигнал комплексный, ИХ эквалайхера комплексная, умножаем (a+bi)*(c+di)=(ac-bd)+(bc+ad)i, очевидно что в действительную часть выходного сигнала входит как действительная так и мнимая часть входного, так и в мнимую часть выходного входит как действительная так и мнимая часть входного сигнала, если у вас так значит у вас комплексный эквалайзер.

нет, у меня реализовано как описывает автор топика
Wanderer.I
Вот у меня тоже возникли подозрения, что обработка по отдельности квадратур - это неправильно. Так как банальная операция умножения двух комплексных чисел( которая используется в LMS) не равна произведению мнимой и действительной части в отдельности.
Serg76
Вот работа демодулятора без корректора (слева) и с "неправильным" корректором (справа) laughing.gif



А вот вариант, когда подстройка осуществляется отдельно по синфазному (слева) и квадратурному каналам (справа)

Wanderer.I
При реализации алгоритма согласно "Adaptive Filter Theory. Simon Naykin":

Данные формулы получены из комплексного представления сигнала.
При реализации в Matlab получается, что всё расходится:
Код
b = [ 0.00001   0.0004    0.0002   -0.0010    0.0010        0.0039      -0.0120 ...
     -0.0300    -0.1800  -0.1000   -0.0300    0.0020        0.0200       0.0500 ...
      0.0950    -0.0200  -0.3500   -0.3000   -0.1000        0.3970       0.3500 ...
     -0.0300    -0.1800  -0.0223   -0.0100    0.0000205     -0.00000039 -0.000000017...
      0.000001   0.00000008];

x = randint(10000,1,4);
y = modmap(x,1,1,'qask',4);

TXI = y(:,1);
TXQ = y(:,2);

I = conv(TXI, b);
Q = conv(TXQ, b);

%scatterplot(TXI(15:end)+j*TXQ(15:end));

%I = awgn(I,10,'measured');
%Q = awgn(Q,10,'measured');

%scatterplot(I(15:end)+j*Q(15:end));

WI=zeros(55,1);
WQ=zeros(55,1);

mu=0.01;

RX_EQ_I=zeros(1,1);
RX_EQ_Q=zeros(1,1);

RXI = vertcat( zeros(55,1), I(1:end));
RXQ = vertcat( zeros(55,1), Q(1:end));

%компенсация задержки в канале
TXI_D = vertcat( zeros(45,1), TXI );
TXQ_D = vertcat( zeros(45,1), TXQ );

for n=1:5000
    YI=WI'*RXI(n:n+55-1)-WQ'*RXQ(n:n+55-1);
    YQ=WI'*RXQ(n:n+55-1)+WQ'*RXI(n:n+55-1);
    
    
    EI=TXI_D(n)-YI;
    EQ=TXQ_D(n)-YQ;
    
    WI=WI+mu*( EI*RXI(n:n+55-1)-EQ*RXQ(n:n+55-1));
    WQ=WQ+mu*( EI*RXQ(n:n+55-1)+EQ*RXI(n:n+55-1));
    
    RX_EQ_I=[RX_EQ_I YI];
    RX_EQ_Q=[RX_EQ_Q YQ];
    
end

scatterplot(RX_EQ_I(4000:end)+j*RX_EQ_Q(4000:end));


Может я чего-то не так понял?
Serg76
У меня работают две следующие схемы подстройки коэффициентов и дают практически одинаковый результат

des00
Цитата(Wanderer.I @ May 22 2011, 04:37) *
При реализации алгоритма согласно "Adaptive Filter Theory. Simon Naykin":
При реализации в Matlab получается, что всё расходится:

у кого как, у меня все работает wink.gif

ЗЫ. на этом форуме выкладывал разные модельки именно эквалайзеров в симулинке
petrov
Цитата(des00 @ May 22 2011, 17:34) *
у кого как, у меня все работает ;)

ЗЫ. на этом форуме выкладывал разные модельки именно эквалайзеров в симулинке


Ну не нужно человеку рабочее, наглядное, по десятому разу перетёртое :)

Wanderer.I

Всё же нужно, ответил в личку.
alex_os
Цитата(Serg76 @ May 22 2011, 16:51) *
У меня работают две следующие схемы подстройки коэффициентов и дают практически одинаковый результат


Это Вам повезло с каналом sm.gif.
Serg76
Цитата(alex_os @ May 23 2011, 07:45) *
Это Вам повезло с каналом sm.gif.

Это работает в плохих каналах АБГШ, а также в каналах для проводных модемов с плотными сигнальными созвездиями (v.32bis) laughing.gif
des00
Цитата(Serg76 @ May 22 2011, 23:44) *
Это работает в плохих каналах АБГШ, а также в каналах для проводных модемов с плотными сигнальными созвездиями (v.32bis) laughing.gif

два, три луча поставьте или спектральный ноль децибел в 20 wink.gif
alex_os
Цитата(Serg76 @ May 23 2011, 09:44) *
Это работает в плохих каналах АБГШ, а также в каналах для проводных модемов с плотными сигнальными созвездиями (v.32bis) laughing.gif

Я бы сказал, что это хорошо работает для каналов, AЧХ которых симметрична относительно несущей и
как-то работает для всех остальных каналов.
Например:
x - последовательность комплексных символов на выходе передатчика;
y - вход корректора;
h = [1, 0.1i] - ИХ канала.
Тогда
y_re(i) = x_re(i) - 0.1 * x_im(i-1)

т.е. для приведенной ИХ, если рассматривать квадратуры не зависимо друг от друга,
межсимвольная интерференция выглядит как помеха от квадратурного канала и
ни какими силами ее не возможно отфильтровать .





Serg76
Цитата(des00 @ May 23 2011, 09:02) *
два, три луча поставьте или спектральный ноль децибел в 20 wink.gif

На многолучевке не проверял, поэтому ничего сказать не могу, но вскоре такой шанс представится
Wanderer.I
Цитата(alex_os @ May 23 2011, 10:10) *
Я бы сказал, что это хорошо работает для каналов, AЧХ которых симметрична относительно несущей и
как-то работает для всех остальных каналов.
Например:
x - последовательность комплексных символов на выходе передатчика;
y - вход корректора;
h = [1, 0.1i] - ИХ канала.
Тогда
y_re(i) = x_re(i) - 0.1 * x_im(i-1)

т.е. для приведенной ИХ, если рассматривать квадратуры не зависимо друг от друга,
межсимвольная интерференция выглядит как помеха от квадратурного канала и
ни какими силами ее не возможно отфильтровать .

Т.е. к примеру качестве модели канала, лучше использовать фильтр с комплексной импульсной характеристикой и чтобы комплексная часть и мнимые не совпадали?
petrov
Цитата(Wanderer.I @ May 23 2011, 11:51) *
Т.е. к примеру качестве модели канала, лучше использовать фильтр с комплексной импульсной характеристикой и чтобы комплексная часть и мнимые не совпадали?


Разумеется в реальной жизни лучи имеют произвольный сдвиг фаз друг относительно друга.
alex_os
Цитата(Wanderer.I @ May 23 2011, 11:51) *
Т.е. к примеру качестве модели канала, лучше использовать фильтр с комплексной импульсной характеристикой и чтобы комплексная часть и мнимые не совпадали?

Конечно!
Wanderer.I
Вот только после изучения всего добра, всё равно не заработало ничего, всё расходится. sad.gif Шаг я так понимаю 0.01 вполне нормальный.А вот неправильный вариант успешно работает. То ли дело в том что импульсная характеристика канала для мнимой и действительной части у меня одинаковая. Буду дальше экспериментировать с несимметричной.
thermit
Цитата
Wanderer.I:
Вот только после изучения всего добра, всё равно не заработало ничего, всё расходится. sad.gif Шаг я так понимаю 0.01 вполне нормальный.


Конечно, правильным является использование комплексного алгоритма.
Не надо забывать, что либо e, либо u должны быть комплексно сопряженные в формуле пересчета коэффициентов.
Что касается шага - он вообще говоря, зависит от длины фильтра. Советую использовать nlms, где в качестве шага используется величина = 1/(сумма квадратов значений линии задержки).
Wanderer.I
Цитата(thermit @ May 23 2011, 14:25) *
Конечно, правильным является использование комплексного алгоритма.
Не надо забывать, что либо e, либо u должны быть комплексно сопряженные в формуле пересчета коэффициентов.
Что касается шага - он вообще говоря, зависит от длины фильтра. Советую использовать nlms, где в качестве шага используется величина = 1/(сумма квадратов значений линии задержки).

Конечно NLMS лучше, но мне нужен конкретно LMS просто. Вот что у меня получилось для BPSK:

Однако стоит только помять сигнал на КАМ-4,всё сразу ломается(импульсная характеристика расходится). Смотрел я примеры, но в чём разница не пойму. Может ли проблема быть в модели канала? Что ещё может быть я не знаю. wacko.gif
Нажмите для просмотра прикрепленного файла
alex_os
To Wanderer.I
Нужно сделать примерно так
1. Включить режим QAM4, h = [1, 0], w- все нули в середине единица.
2 Добиться работы в этих условиях. На начальном этапе адаптацию можно выключить
и убедится что e получается равной нулю. Потом включить адаптацию и убедится
что не разваливается.
3. Поставить h = [1, 0.2j] и убедится что корректор работает.
thermit
Что-то вроде этого должно быть:

Код
clear all;
c4=[1+j -1+j 1-j -1-j];
HI = [ 0.00001   0.0004    0.0002   -0.0010    0.0010        0.0039      -0.0120 ...
      -0.0300    -0.1800  -0.1000   -0.0300    0.0020        0.0200       0.0500 ...
       0.0950    -0.0200  -0.3500   -0.3000   -0.1000        0.3970       0.3500 ...
      -0.0300    -0.1800  -0.0223   -0.0100    0.0000205     -0.00000039 -0.000000017...
       0.000001   0.00000008];
  
HR = [ 0.00001   0.0008    0.0002   -0.0010    0.0010        0.0039      -0.0120 ...
      -0.0300    -0.1900   0.1000   -0.0300    0.0020        0.0200       0.0500 ...
       0.0950    -0.0200  -0.3500   -0.3400   -0.1000        0.470       0.3500 ...
      -0.0300    -0.1800  -0.0223   -0.0100    0.000205      0.00000039  -0.000000117...
       0.000001   0.00000008];

EL=60;
NP=4;
tx=c4(randint(1,10000,NP)+1);

h=complex(HR,HI);


rx=filter(h,1,tx);

u=0.5/(EL*std(rx)^2);
y=lms([zeros(1,(length(h)/2)+EL/2) tx],rx,EL,u);

plot(y(5000:end),'.');




lms.m
Код
function cs = lms(r,t,N,mu)

mem=zeros(1,N);
coeff=zeros(N,1);
cs=[];
for i=1:length(t)
    mem=[t(i) mem(1:end-1)];
    ms=mem*coeff;
    e=r(i)-ms;
    cs=[cs ms];
    coeff=coeff+mem'*mu*e;
end;

return;
Wanderer.I
Спасибо большое! Всё заработало. biggrin.gif Я понял в чём ошибка, при выполнение свёртки я брал импульсную характеристику,транспонировал затем брал комплексно-сопряжённую( эрмитово преобразование), а нужно только транспонировать было.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.