Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: восстановление несущей ofdm модем
Форум разработчиков электроники ELECTRONIX.ru > Цифровая обработка сигналов - ЦОС (DSP) > Алгоритмы ЦОС (DSP)
infinity
Постановка задачи:
делается небольшенький пакетный ofdm модем на 64 поднесущих. Разнесение поднесущих от 11 до 180kHz переключаемое. Схема восстановления несущей по заголовку

Есть две непонятки, первая по расчету:

Вне зависимости от разнесения поднесущих, сигнал ошибки со схемы восстановления дает погрешность не лучше 4% от величины разнесения. При этом усреднение ошибки от пакета к пакету невозможно, т.е. подстройка осуществляется только на текущий пакет. Вопрос, можно ли получить лучшие результаты по погрешности, возможно есть какие-то нестандартные способы и как стреляется полученная мной величина, с тем, что должно быть.

второй по эквалайзированию:
Если нескомпенсированная величина ошибки по несущей небольшая, то по идее ее должен скорректировать эквалайзер. Здесь получается небольшой затык. Делаю в два этапа: сначала для каждой поднесущей по обучающей последовательности нахожу мгновенное значение ошибки и для всех символов убираю эту ошибку. Далее для каждого символа считаю ошибку по пилотным поднесущим, в итоге имею деградацию среднего значения фазы и амплитуды и собственно, корректирую. В результате, если есть нескомпенсированная ошибка по несущей, то в зависимости от длинны пакета, в какой-то момент будет происходить перескок фазы на 180deg.

буду признателен всем, кто направит советом, или дорогой к мануалу, в котором описано решение схожих задач.
svalery
Что мешает добавлять в начале пакета преамбулу достаточной длины для вычисления отстройки по частоте с заданой точностью?
DMax
Цитата(infinity @ Mar 16 2010, 08:38) *
второй по эквалайзированию:
Если нескомпенсированная величина ошибки по несущей небольшая, то по идее ее должен скорректировать эквалайзер. Здесь получается небольшой затык. Делаю в два этапа: сначала для каждой поднесущей по обучающей последовательности нахожу мгновенное значение ошибки и для всех символов убираю эту ошибку. Далее для каждого символа считаю ошибку по пилотным поднесущим, в итоге имею деградацию среднего значения фазы и амплитуды и собственно, корректирую. В результате, если есть нескомпенсированная ошибка по несущей, то в зависимости от длинны пакета, в какой-то момент будет происходить перескок фазы на 180deg.


Не совсем понятно, откуда у вас берутся эти 180 градусов. Пилотные поднесущие должны иметь заранее известную фазу. На приёмной стороне после эквалайзера, вы должны посчитать разность между принятой фазой и этой заранее известной фазой, а потом вычесть эту дельту из всех поднесущих символа. Если будете вычислять эту дельту из суммы нескольких пилотов (которая должна быть для всех пилотов одинакова), то точность определения угла поворота созвездия возрастёт. И никаких перескоков (разве только на 360 градусов) быть не должно.
infinity
Цитата(svalery @ Mar 17 2010, 10:15) *
Что мешает добавлять в начале пакета преамбулу достаточной длины для вычисления отстройки по частоте с заданой точностью?


В начале пакета имеется символ, по которому вычисляется отстройка по частоте. Точность, как и говорил, не лучше 4%. Не совсем понятно, что вы понимаете под преамбулой, если обозначенная мной штука, тогда что есть достаточная длинна? Выделить на синхронизацию частоты больше одного символа не позволяет жадность - во всю идёт война с избыточностью

Цитата(DMax @ Mar 17 2010, 14:47) *
Не совсем понятно, откуда у вас берутся эти 180 градусов. Пилотные поднесущие должны иметь заранее известную фазу. На приёмной стороне после эквалайзера, вы должны посчитать разность между принятой фазой и этой заранее известной фазой, а потом вычесть эту дельту из всех поднесущих символа. Если будете вычислять эту дельту из суммы нескольких пилотов (которая должна быть для всех пилотов одинакова), то точность определения угла поворота созвездия возрастёт. И никаких перескоков (разве только на 360 градусов) быть не должно.

Возможно я немного некорректно выразился. unsure.gif Ситуация выглядит следующим образом:

Используются все поднесущие, кроме нулевой и 32. На входе эквалайзера искаженные амплитуды и фазы. По заголовку для каждой поднесущей определяется ошибка по фазе. После чего делается коррекция - f0. Предполагаю, что в процессе работы фаза и амплитуда могут деградировать, поэтому для каждого символа, используя пилоты, определяю среднюю деградацию и во второй раз делаю коррекцию - f1. Картинка, когда ошибки по несущей нет, и все работает хорошо
Нажмите для просмотра прикрепленного файла

Совсем другое дело, когда есть ошибка по несущей:

Для примера выключил коррекцию ошибки несущей по заголовку, и добавил большую ошибку (дабы эффект происходящего был более нагляден). Видно, что в точке f0 средняя фаза деградирует - линейно 'плывёт' со скоростью, определяемой ошибкой частоты. В результате, в точке f0 имеются повороты фазы с шагом 90deg. Такой эффект получается, если часть пилотов на интервале одного символа в точке f0 содержит ошибку в 90deg, а часть- без нее. Ясно, что эквалайзер не должен уметь исправлять ошибки, когда фаза шустро меняется на интервале одного символа. Но когда ошибочка по несущей небольшая, рано или поздно случаются одиночные символы, на которых фаза 'прокручивается'.

Нажмите для просмотра прикрепленного файла

Возможно порядок работы эквалайзера должен быть не такой? crying.gif
svalery
Цитата(infinity @ Mar 18 2010, 10:19) *
тогда что есть достаточная длинна


Длина необходимая для получения нужной точности оценки при заданном уровне шума. При каком уровне шума у вас получается эта 4% ошибка, меняется она с увеличением шума? Если проверяется без шума, то сам по себе алгоритм ошибку давать не может, если только что то не загрублено с разрядностью.
petrov
Цитата(infinity @ Mar 18 2010, 10:19) *
Возможно порядок работы эквалайзера должен быть не такой?


Расскажите подробно как эквалайзер работает. Как по поднесущим и по символам усреднение сделано для исправления одной несущей.
DMax
Цитата(infinity @ Mar 18 2010, 10:19) *
Совсем другое дело, когда есть ошибка по несущей:

Для примера выключил коррекцию ошибки несущей по заголовку, и добавил большую ошибку (дабы эффект происходящего был более нагляден). Видно, что в точке f0 средняя фаза деградирует - линейно 'плывёт' со скоростью, определяемой ошибкой частоты. В результате, в точке f0 имеются повороты фазы с шагом 90deg. Такой эффект получается, если часть пилотов на интервале одного символа в точке f0 содержит ошибку в 90deg, а часть- без нее. Ясно, что эквалайзер не должен уметь исправлять ошибки, когда фаза шустро меняется на интервале одного символа. Но когда ошибочка по несущей небольшая, рано или поздно случаются одиночные символы, на которых фаза 'прокручивается'.


Секундочку. То, что вы тут говорите противоречит теории.

По порядку. Предположим, что вы передаёте OFDM-символы, в которых все поднесущие имеют одинаковую амплитуду и фазу. На приемной стороне вы принимаете сигнал, в котором:
0) Все параметры сигнала чуть-чуть искажены из-за шумов.
1) Фазы (и, обычно, в меньшей мере амлитуды) искажены из-за частотной отстройки.
2) Фазы искажены из-за погрешности синхронизации.
3) Фазы и амплитуды искажены из-за многолучевости.

Далее, нулевой пункт не убирается.

Первый пункт, убирается тем, что вы по преамбуле определяете величину частотной отстройки во временной области. И во временной же области вы компенсируете, домножая на комплексную синусоиду с обратной частотой. Однако, в присутствие погрешности вы никогда не сведете отстройку к 0, а только уменьшите её. Но остаток этой отстройки будет приводить к тому, что созвездие будет по чуть-чуть вращаться вокруг 0. Причём внутри символа (после FFT) этот остаток отстройки не будет играть роли (разве только нарушая ортогональность, но эффект минимален). Его можно увидеть только сравнив созвездия двух символов, и чем дальше эти символы будут друг от друга - тем сильнее будет виден поворот созвездия. Для того чтобы поворачивать созвездие обратно, используют пилоты.

Далее, второй пункт. В зависимости от используемого вами метода временной синхронизации, величина ошибки синхронизации может быть от длительности полусэмпла до длительности защитного интервала. Наличие этой ошибки (по теореме о задержке) обусловливает добавочную фазу к поднесущим, величина которой прямо пропорциональна номеру поднесущей. То есть предположим, что мы передавали поднесущие с одной и той же фазой и амплитудой, а все остальные искажения отсутствуют. Тогда на приемной стороне, мы получим поднесущие с одной амплитудой, но с фазами, образующими наклонную прямую на графике фаз. Или же, что то же самое, если отложить на комплексной плоскости полученные поднесущие и соединить их одной кривой, то мы получим идеальный кусок окружности с радиусом равным амплитуде поднесущих. Если частота дискретизации на приемной и передающей сторонах совпадают (с большой точностью), то величина ошибки одна и та же на всех символах одного пакета. А значит величина добавочной фазы для n-ой поднесущей тоже постоянна. То есть эту ошибку можно учесть в эквалайзере.

Третий пункт по определению исправляется эквалайзером.

Таким образом, если вы видите, что после эквализации у вас внутри символа линейно изменяется фаза по поднесущим, то
а) вы не правильно рассчитали эквалайзер
б) у вас проблема с частотой дискретизации.

Ну и в заключение... вы там со своей борьбой за избыточность надеюсь не забыли про защитные интервалы во временной и частотной областях?
infinity
Цитата(svalery @ Mar 18 2010, 11:52) *
Длина необходимая для получения нужной точности оценки при заданном уровне шума. При каком уровне шума у вас получается эта 4% ошибка, меняется она с увеличением шума? Если проверяется без шума, то сам по себе алгоритм ошибку давать не может, если только что то не загрублено с разрядностью.


сигнал/шум не менее 30дБ. Проверки проводились как в режиме цифрового шлейфа, так и через радиоканал. О многолучевости пока речи нет. Разрядность не загублена с вероятностью не менее 95%.

Для индексов модуляции меньше qam64 полученные 4% приемлимы. Начиная с qam64 мой эквалайзер не слишком хорошо справляется. Остюда и появлися такой вопрос.

Насколько я понимаю, любая схема восстановления несущей отработает с какой- то погрешностью. Вот только на сколько хорошо? Буду признателен, если кто- то делал модем на базе ofdm и поможет 'пристрелятся' к цифрам biggrin.gif
alex_os
Цитата(infinity @ Mar 18 2010, 15:52) *
..
Насколько я понимаю, любая схема восстановления несущей отработает с какой- то погрешностью. Вот только на сколько хорошо? Буду признателен, если кто- то делал модем на базе ofdm и поможет 'пристрелятся' к цифрам biggrin.gif


А как несущую меряете? Может ошибка в алгоритме?
infinity
Цитата(petrov @ Mar 18 2010, 12:15) *
Расскажите подробно как эквалайзер работает. Как по поднесущим и по символам усреднение сделано для исправления одной несущей.


Эквалайзер работает как корректор искажений. Два этапа:

1 по каждой поднесущей скорректировать долговременные искажения ачх и фчх

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

2 быстрые изменения ачх и фчх

В приемнике между бабочками ifft символы скалируются в полный размах разрядной сетки для уменьшения разрядности преобразования. В результате на входе эквалайзера все символы по амплитуде отличаются в пределах 1 разряда. Кроме того, символы с высокими индексами модуляции отличаются от символов с низкими индексами. Посчитав среднюю величину амплитуды пилота по каждому символу, можно все символы линейно проскалировать.

Основной вклад в быстрые фазовые изменения - это нескомпенсированная ошибка несущей частоты. Предполагалось по каждому символу по пилотам посчитать среднее отклонение фазы и линейно сдвинуть каждый символ. Оказалось, что такой способ не совсем хорош.

В итоге, сейчас видится, что нужно либо менять весь алгоритм, либо что-то немного допилить. Второй вариант более желателен, но пока не видится как это сделать crying.gif






Цитата(DMax @ Mar 18 2010, 13:14) *
По порядку. Предположим, что вы передаёте OFDM-символы, в которых все поднесущие имеют одинаковую амплитуду и фазу.

На приемной стороне вы принимаете сигнал, в котором:
0) Все параметры сигнала чуть-чуть искажены из-за шумов.
1) Фазы (и, обычно, в меньшей мере амлитуды) искажены из-за частотной отстройки.
2) Фазы искажены из-за погрешности синхронизации.
3) Фазы и амплитуды искажены из-за многолучевости.


Спасибо за обстоятельный ответ. smile.gif
С 0) и 2) все понятно. 3) при моделировании железяка работает- пока что считаю что и в реальности будет работать.
Сейчас бъюсь над 1).

Цитата(DMax @ Mar 18 2010, 13:14) *
Первый пункт, убирается тем, что вы по преамбуле определяете величину частотной отстройки во временной области. И во временной же области вы компенсируете, домножая на комплексную синусоиду с обратной частотой. Однако, в присутствие погрешности вы никогда не сведете отстройку к 0, а только уменьшите её. Но остаток этой отстройки будет приводить к тому, что созвездие будет по чуть-чуть вращаться вокруг 0.


Насчет сведения к нулю, понятно, что будет погрешность. Смущает, что у меня она получилась не маленькая.

Цитата(DMax @ Mar 18 2010, 13:14) *
Причём внутри символа (после FFT) этот остаток отстройки не будет играть роли (разве только нарушая ортогональность, но эффект минимален). Его можно увидеть только сравнив созвездия двух символов, и чем дальше эти символы будут друг от друга - тем сильнее будет виден поворот созвездия. Для того чтобы поворачивать созвездие обратно, используют пилоты.

Таким образом, если вы видите, что после эквализации у вас внутри символа линейно изменяется фаза по поднесущим, то
а) вы не правильно рассчитали эквалайзер
б) у вас проблема с частотой дискретизации.


Такой поворот созвездия я и наблюдаю. Вот только качественно довернуть не совсем получается.

С частотой дискретизации все прозрачно. Одна и та же частота используется для передатчика и приемника, генератор стабильный.

Чуть выше описал, как работает эквалайзер в моем исполнении. Ошибка днк не видится sad.gif

Цитата(DMax @ Mar 18 2010, 13:14) *
Ну и в заключение... вы там со своей борьбой за избыточность надеюсь не забыли про защитные интервалы во временной и частотной областях?


biggrin.gif Во временной области интервалы имеются. А что имеется ввиду под защитными интервалами в частотной области, не совсем понятно. Может я упустил ужасно важную штуку?
petrov
Цитата(infinity @ Mar 18 2010, 17:42) *
Эквалайзер работает как корректор искажений. Два этапа:

1 по каждой поднесущей скорректировать долговременные искажения ачх и фчх

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

2 быстрые изменения ачх и фчх

В приемнике между бабочками ifft символы скалируются в полный размах разрядной сетки для уменьшения разрядности преобразования. В результате на входе эквалайзера все символы по амплитуде отличаются в пределах 1 разряда. Кроме того, символы с высокими индексами модуляции отличаются от символов с низкими индексами. Посчитав среднюю величину амплитуды пилота по каждому символу, можно все символы линейно проскалировать.

Основной вклад в быстрые фазовые изменения - это нескомпенсированная ошибка несущей частоты. Предполагалось по каждому символу по пилотам посчитать среднее отклонение фазы и линейно сдвинуть каждый символ. Оказалось, что такой способ не совсем хорош.

В итоге, сейчас видится, что нужно либо менять весь алгоритм, либо что-то немного допилить. Второй вариант более желателен, но пока не видится как это сделать crying.gif


Ничего непонятно. Опустим первоначальную настройку. Засинхронизировались вы как то, из-за небольшого сдвига по частоте имеете вращение созвездия в каждой поднесущей. Как у вас распределены пилот-тоны по поднесущим и по символам? Как вы осуществляете усреднение пилот-тонов по поднесущим и по сиволам? Скажем 16-я поднесущая в 20-ом символе, какие пилот-символы участвуют в усреднении для получения оценки канала для этой поднесущей, как интерполяция осуществляется и т. п.?
svalery
Цитата(infinity @ Mar 18 2010, 17:42) *
А что имеется ввиду под защитными интервалами в частотной области, не совсем понятно. Может я упустил ужасно важную штуку?


Если используются все 64 поднесущих то как планируется делать апсемплинг в дальнейшем? При этом переходная полоса получается - 0, ессно интерполирующие фильтры будут не реализуемыми.
infinity
Цитата(svalery @ Mar 18 2010, 19:37) *
Если используются все 64 поднесущих то как планируется делать апсемплинг в дальнейшем? При этом переходная полоса получается - 0, ессно интерполирующие фильтры будут не реализуемыми.

Можно использовать в передатчике фурье на 128 точек, с полезной нагрузкой в 64 поднесущих и с интерполяцией будет все в норме. А по приему это не важно и ставим преобразование на 64 точки, так? wink.gif

Цитата(petrov @ Mar 18 2010, 18:24) *
Ничего непонятно. Опустим первоначальную настройку. Засинхронизировались вы как то, из-за небольшого сдвига по частоте имеете вращение созвездия в каждой поднесущей. Как у вас распределены пилот-тоны по поднесущим и по символам? Как вы осуществляете усреднение пилот-тонов по поднесущим и по сиволам? Скажем 16-я поднесущая в 20-ом символе, какие пилот-символы участвуют в усреднении для получения оценки канала для этой поднесущей, как интерполяция осуществляется и т. п.?


Прошу прощения, если мое изложение излишне сумбурное. Попробую описать по порядку:

Во временной области каждый пакет состоит из:
- преамбулы, ко которой осуществляется грубая коррекция ошибки несущей частоти и временная синхронизация.
- обучающей последовательности эквалайзера.
- символов данных
Каждый символ пакета - 64 поднесущих, 8 из которых - пилотные. В настоящий момент, для простоты, пилоты находятся в каждом символе на одних и тех же местах.
Устреднение пилотов осуществляется только на интервале одного символа.
Считаю, что по заголовку эквалайзер гарантированно выходит на режим, и в символах данных пилоты использую лишь чтобы немного доворачивать картинку.
svalery
Цитата(infinity @ Mar 19 2010, 08:23) *
Можно использовать в передатчике фурье на 128 точек, с полезной нагрузкой в 64 поднесущих и с интерполяцией будет все в норме. А по приему это не важно и ставим преобразование на 64 точки, так? wink.gif


Можно и так, просто иногда накладно Фурье в 2раза больше делать. Расскажите как планируется делать подстройку частоты если она больше ширины поднесущей ?
petrov
Цитата(infinity @ Mar 19 2010, 08:23) *
Во временной области каждый пакет состоит из:
- преамбулы, ко которой осуществляется грубая коррекция ошибки несущей частоти и временная синхронизация.
- обучающей последовательности эквалайзера.
- символов данных
Каждый символ пакета - 64 поднесущих, 8 из которых - пилотные. В настоящий момент, для простоты, пилоты находятся в каждом символе на одних и тех же местах.
Устреднение пилотов осуществляется только на интервале одного символа.
Считаю, что по заголовку эквалайзер гарантированно выходит на режим, и в символах данных пилоты использую лишь чтобы немного доворачивать картинку.


Т. е. канал у вас меняется настолько медленно что оцениваете вы его только по обучающей последовательности?

Пилот-тоны используете только лишь для подстройки частоты?

Усреднения по 8-ми пилот-тонам мало для реального отношения сигнал/шум, тем более что некоторые пилоты могут быть задавлены каналом.
infinity
Цитата(svalery @ Mar 19 2010, 08:50) *
Можно и так, просто иногда накладно Фурье в 2раза больше делать. Расскажите как планируется делать подстройку частоты если она больше ширины поднесущей ?

Бывают случаи, когда сделать интерполяцию в 2 раза на фурье проще, чем использовать фнч, или cic. А подстройка не больше разноса поднесущих. Не понимаю, почему вы догадались, что это так.
svalery
Цитата(infinity @ Mar 19 2010, 14:09) *
А подстройка не больше разноса поднесущих. Не понимаю, почему вы догадались, что это так.


Тут мне самому интересно какие есть способы (которые реально работают в железке) подстройки на целое кол-во поднесуших. Один мне известный как раз и основан на использовании защитных полос и шаблонов сдвинутых пилот тонов(на моделе работает, хотя как это будет в железке хз, попробовать не пришлось).
infinity
Цитата(svalery @ Mar 19 2010, 14:38) *
Тут мне самому интересно какие есть способы (которые реально работают в железке) подстройки на целое кол-во поднесуших. Один мне известный как раз и основан на использовании защитных полос и шаблонов сдвинутых пилот тонов(на моделе работает, хотя как это будет в железке хз, попробовать не пришлось).

Тема интересная. Сам не раз задумывался, как делать, когда время подоспеет. В том что читал, хороших идей не встречал, или же не по глазам было. Если дадите ссылочку на патент, или на упоминание, как поступают продвинутые люди, буду признателен. Если идея здравая - можно попробовать и на железе - благо все под рукой, о результатах расскажу.


Цитата(petrov @ Mar 19 2010, 09:50) *
Т. е. канал у вас меняется настолько медленно что оцениваете вы его только по обучающей последовательности?

Пилот-тоны используете только лишь для подстройки частоты?

Усреднения по 8-ми пилот-тонам мало для реального отношения сигнал/шум, тем более что некоторые пилоты могут быть задавлены каналом.



Тут вот какое дело. Естественно, что делать так в рабочую железяку - преступление.
Но для того, чтобы можно было двигатся в этом направлении, т.е. задействовать хитрый алгоритм изменения положения пилотов от символа к символу, сначала нужно добится стабильной работы примитива. Что пока не совсем хорошо получается.

Если посмотреть объективно, у меня не большой опыт работ с эквалайзерами. Модем пакетный, в априори от пакету к пакету меняется все - ачх, фчх, усиление, ошибка по несущей. В таких условиях тяжело накапливать информацию об ошибках. И я не представляю, как можно развить идеи dfe, хотя буржуйские статейки на эту тему когда-то давно встречал. Поэтому-то и делаю эквалайзер как простой корректор, хотя вы- гуру по эквалайзерам, возможно и скажете, что так не делают.

Понимаю, что разбиратся в чужих описаниях, иногда дурацких ошибок- труд неблагодарный. И все же, если вы делали нечто похожее, буду признателен, за любые рассуждения на тему, чего же я делаю не правильно. smile.gif
petrov
Проблема в том что непонятно как у вас там всё сделано.
infinity
Цитата(petrov @ Mar 20 2010, 11:08) *
Проблема в том что непонятно как у вас там всё сделано.


Немного подумав, все-таки удалось найти причину всех бед. Оказалось, что до начала исправления эквалайзером символов по информации полученной из обучающей последовательности, следовало привести начальную фазу всех символов к одному значению. Если задуматься, то так и должно быть, иначе работать и не будет.

Таким образом, в каждом символе из значения фазы каждой поднесущей вычитаю фазу нулевой поднесущей и вуа-ля- дальше можно делать любую коррекцию. Все отлично заработало... до сигнал/шум 10-12 дБ. При этом значении фаза нулевой поднесущей начинает давать слишком большую ошибку и резко увеличивает ber. Конечно, увеличить чувствительность на несколько дБ позволит кодирование. С другой стороны, хочется добиться лучших результатов. Но как использовать не только нулевую поднесущию, но и все пилотные, а может быть и поднесущие данных, для приведения начальной фазы всех символов к одному значению? smile.gif
petrov
Для оценки канала в какой-то поднесущей нужно усреднять много(несколько десятков) пилот-тонов в окрестности этой поднесущей как по частоте так и по времени.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.