Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: демодулятор BPSK
Форум разработчиков электроники ELECTRONIX.ru > Цифровая обработка сигналов - ЦОС (DSP) > Алгоритмы ЦОС (DSP)
kaf
Есть фазомодулированный сигнал 18kHz. Как програмно демодулировать?
Andy Mozzhevilov
Цитата(kaf @ Jul 12 2006, 09:26) *
Есть фазомодулированный сигнал 18kHz. Как програмно демодулировать?

Нужно уточнить, как модулирован сигнал. Сколько значений фаз на символ используется.
Наиболее просто демодулируется DBPSK - где 0/1 передается изменением фазы. В этом случае достаточно сравнивать фазу сейчас и на 1 бит назад и использовать некогерентный демодулятор:
Домножить входной сигнал на I и Q компоненты локальной несущей.
В скользящем окне усреднить результат на длине бита.
Перемножить усредненные значения с их задержанной на 1 бит версией.
Сложить полученные I и Q и по знаку принять решение о значении бита.
Полученный цифровой сигнал пропустить еще раз через ФНЧ.

Упрощенно принцип показан в пристегнутом файле.
Нажмите для просмотра прикрепленного файла
kaf
Цитата(Andy Mozzhevilov @ Jul 12 2006, 10:20) *
Наиболее просто демодулируется DBPSK - где 0/1 передается изменением фазы. В этом случае достаточно сравнивать фазу сейчас и на 1 бит назад и использовать некогерентный демодулятор:
Домножить входной сигнал на I и Q компоненты локальной несущей.
В скользящем окне усреднить результат на длине бита.
Перемножить усредненные значения с их задержанной на 1 бит версией.
Сложить полученные I и Q и по знаку принять решение о значении бита.
Полученный цифровой сигнал пропустить еще раз через ФНЧ.

Спасибо за ответ, но проблема в том, что я немогу точно задержать сигнал на один период (гуляет частота, дрожат фронты). Как быть в этом случае
Andy Mozzhevilov
Цитата(kaf @ Jul 12 2006, 13:01) *
Спасибо за ответ, но проблема в том, что я немогу точно задержать сигнал на один период (гуляет частота, дрожат фронты). Как быть в этом случае

Поясните, какая частота гуляет, на сколько гуляет? Какие фронты дрожжат и откуда фронты в аналоговом сигнале?
Какая все-таки модуляция, какая несущая, какая символьная скорость? Обрисуйте задачу более конкретно.
kaf
Цитата(Andy Mozzhevilov @ Jul 12 2006, 13:06) *
Поясните, какая частота гуляет, на сколько гуляет? Какие фронты дрожжат и откуда фронты в аналоговом сигнале?
Какая все-таки модуляция, какая несущая, какая символьная скорость? Обрисуйте задачу более конкретно.

Демодулятор нужно сделать на AVR. Входной сигнал компарируется и при переходе фаз начинается настояций бардак.
Входной сигнал 18 +/- 0.5 kHz. Есть две фазы 0 и 180. Минимальный период между изменениями 16 периодов несущей частоты.

PS Уже сделан апаратный демодулятор, но передомной лежит коробочка, котороя , кроме демодуляции делает еще кучу дел (а в приведенном алгоритме синусы(пусть табличные) и вагон умножений).
Andy Mozzhevilov
Цитата(kaf @ Jul 12 2006, 13:28) *
Цитата(Andy Mozzhevilov @ Jul 12 2006, 13:06) *

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

Демодулятор нужно сделать на AVR. Входной сигнал компарируется и при переходе фаз начинается настояций бардак.
Входной сигнал 18 +/- 0.5 kHz. Есть две фазы 0 и 180. Минимальный период между изменениями 16 периодов несущей частоты.

PS Уже сделан апаратный демодулятор, но передомной лежит коробочка, котороя , кроме демодуляции делает еще кучу дел (а в приведенном алгоритме синусы(пусть табличные) и вагон умножений).


Приведенный алгоритм показывает принцип демодуляции. Дальше оптимизируйте под свою задачу.
Сделайте синусы однобитными, тогда ужмножения заменятся на "исключающие или", соответственно на AVR можно будет множить сразу 8 выборок. Далее сдвигами делаете скользящеее окно на количество выборок на битовом интервале, по таблице определяете количество полученных единичных бит. Можно попробовать делать скользящее окно не на длине бита, а на 1-2 периодах несущей, тогда длина линий задержки будет меньше.
Но вам нужно брать частоту дискретизации входного миниму в 5 раз больше, чем несущая, то есть под 100 кГц где-то. Не знаю, как тут AVR справится, давно не работал с ними.
=GM=
Цитата(Andy Mozzhevilov @ Jul 12 2006, 06:50) *
Можно попробовать делать скользящее окно не на длине бита, а на 1-2 периодах несущей, тогда длина линий задержки будет меньше.
Но вам нужно брать частоту дискретизации входного миниму в 5 раз больше, чем несущая, то есть под 100 кГц где-то. Не знаю, как тут AVR справится, давно не работал с ними.

Лучше взять 8 выборок на период (частота выборок 144 кГц, т.е. прерывание каждые 6,9 мкс), тогда будет легко работать с байтовыми эталонами (просто делать два XOR каждые 8 прерываний, если по таблице, то можно прямо в прерывании). Ну а поскольку решение о принятом бите надо принять за 880 мкс (для авр это вагон времени), то еще останется время на выработку тактовой частоты и другие задачи.
kaf
Цитата(=GM= @ Jul 12 2006, 20:28) *
Лучше взять 8 выборок на период (частота выборок 144 кГц, т.е. прерывание каждые 6,9 мкс), тогда будет легко работать с байтовыми эталонами (просто делать два XOR каждые 8 прерываний, если по таблице, то можно прямо в прерывании). Ну а поскольку решение о принятом бите надо принять за 880 мкс (для авр это вагон времени), то еще останется время на выработку тактовой частоты и другие задачи.

Еще раз повторюсь есть несколько алгоритмов демодуляции BPSK, но в моем случае ключевую роль играет то, что я не могу выставить точную (кратную) частоту прерываний в контроллере по отношению к частоте несущей (а частота фазовых манипуляций привязана к частоте несущей). При кратных частотах выборки частоте несущей у меня с демодуляцией проблем нет, но только она начинает гулять (а плюс еще дребезг фронта при скачке фазы) у меня получается полный бардак.
Andy Mozzhevilov
Цитата(kaf @ Jul 12 2006, 23:02) *
Цитата(=GM= @ Jul 12 2006, 20:28) *

Лучше взять 8 выборок на период (частота выборок 144 кГц, т.е. прерывание каждые 6,9 мкс), тогда будет легко работать с байтовыми эталонами (просто делать два XOR каждые 8 прерываний, если по таблице, то можно прямо в прерывании). Ну а поскольку решение о принятом бите надо принять за 880 мкс (для авр это вагон времени), то еще останется время на выработку тактовой частоты и другие задачи.

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


Это не обязательное требование.
Хуже то, что у вас несущая гуляет несколько +- ~3%. Но и это может не сказаться так фатально, нужно промоделировать. Сделайте алгоритм в матлабе и посмотрите, что получится. Я бы сам сделал (просто интересно, но времени сейчас нет, через неделю в отпуск и доделываю все дела).
Критичное место, которое может не дать нормально работать алгоритму при этих условиях - это то, что когда вы домножаете входной сигнал на несущую, в результате получатся суммарная и разностная частоты. Далее при усреднении на длине, кратной периоду локальной несущей получается следующее:
Если локальная частота и несущая сигнала равны, то в выходном сигнале будет присутствовать удвоенная частота, которая при усреднении будет фактически задавлена ФНЧ с АЧХ sin(x)/x.
Если частоты разные, но суммарная частота не будет попадать на минимум функции АЧХ, соответственно какая то ее часть пролезет на выход и будет там пакостить.
Если при существующих отклонения несущей это становится критично, то можно попробовать:
1. Использовать ФАПЧ на несущую, то есть перейти к когерентному детектированию. Для этого реализовать петлю Костаса, и там демодулированный сигнал можно будет снять прямо с выхода одного из плеч ФАПЧ.
2. Использовать фильтр после перемножителя с другой АЧХ, который не будет обладать недостатком усредняющего фильтра.

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


Какой алгоритм вы используете? Можете привести матлабовскую его реализацию?
DuHast
При кратных частотах выборки частоте несущей у меня с демодуляцией проблем нет, но только она начинает гулять (а плюс еще дребезг фронта при скачке фазы) у меня получается полный бардак.
[/quote]

То что вам необходимо называется система тактовой синхронизации, самый прострой способ - запустить счетчик который бы стробировал Ваш сигнал(уже преобразованый по алгоритму предложеному выше) так , как будто частота выборки кратна частоте несущей(с этим у Вас проблем нет smile.gif ), а затем подстраивать его значения в те момента когда сигнал(уже преобразованый) меняет полярность.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.