Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Демодуляция АМ сигнала
Форум разработчиков электроники ELECTRONIX.ru > Цифровая обработка сигналов - ЦОС (DSP) > Алгоритмы ЦОС (DSP)
Allregia
Есть сигнал, несущая около 1кгц, промодулированная (АМ) низкочастотным (0.1-10гц) сигналом.
Сигнал приходит (с АЦП) в виде uint16 /10kHz SR.
Нужно выделить модулирующий сигнал и сделать децимацию на 50гц.

Сейчас я делаю просто: output=IIR_LPF_20Гц (abs(input));
Затем беру каждый 20-й отсчет.

Все работает, но - так как индекс модуляции весьма мал (3-5%), то и сигнал на выходе я получаю весьма маленькой амплитуды (разрядности). Вместе с тем, когда я беру модуль входного сигнала, он содержит большую постоянную составляющую. Если перед тем как делать LPF вычесть константу из этого модуля, то наверное можно повысить разрядность выходного сигнала.
Вопрос первый - так ли это (типа "а не дурк ли я?" sm.gif), и второй - как лучше выделить эту константу (постоянную составляющую)? Амплитуда несущей может быть разной, это непредсказуемо.
Выделять по простому, поставить еще один LPF, с частотой среза ниже нижней частоты полезного сигнала, и вычитать его выход их модуля входного сигнала, перед основым LPF и децимацией?

P.S. Все происходит не на ДСП а на обычном МК (АРМ7).
fontp
Цифровой детекторный приемник? Круто, мечта начинающего радиолюбителя cool.gif

Попробуйте сделать супергетеродинный с переносом частоты.
Если несущая фиксирована, перенос частоты для прямого преобразования можно сделать на биениях, просто сразу прорежая входной сигнал
Allregia
Цитата(fontp @ Sep 1 2011, 10:33) *
Цифровой детекторный приемник?


Ага sm.gif

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


Несущая не фиксирована и не стабильна.
SPACUM
Цитата(Allregia @ Sep 1 2011, 11:38) *
индекс модуляции весьма мал (3-5%), то и сигнал на выходе я получаю весьма маленькой амплитуды (разрядности).

Повышение разрядности это только на идеальных АЦП. Легкая нелинейность и шум с ненормальным распределением все испортят. Мне пришлось все переделать и поставить 24 разрядный. Они шумят на несколько последних разрядов, но все-равно точнее.
sup-sup
Цитата(Allregia @ Sep 1 2011, 14:47) *
Несущая не фиксирована и не стабильна.

Все-таки, какая-то полоса есть? Если это так, то наверняка, полезен будет полосовой фильтр для отделения сигнала от помех. Таким образом, уйдет постоянная составляющая. А разрядность 'сама повысится' на выходе фильтра.
Можно сразу решить задачу с помощью квадратурного приема огибающей. Для вычисления каждой точки огибающей нужно выполнить две свертки (сразу с нужным прореживанием, т.е. один раз в 20 мс). Делать свертку сигнала (перемноженного на окно эквивалентного фнч, выбранное в зависимости от болтанки несущей + полоса сигнала) с синусом и косинусом центральной частоты. Для получения точки огибающей нужно векторно сложить результаты сверток (сумма квадратов под корнем). Чем узкополоснее будет фильтр (длиннее ядро), тем выше разрядность выходного сигнала. Останется только отбросить младшие разряды.
PS. Скорее всего, нужен будет еще один полосовой фильтр уже для огибающей
Allregia
Цитата(sup-sup @ Sep 1 2011, 18:10) *
Все-таки, какая-то полоса есть? Если это так, то наверняка, полезен будет полосовой фильтр для отделения сигнала от помех.


Полоса есть конечно, примерно 800-2500 гц. Полосовой фильтр есть - после АЦП стоит HPF 4 порядка на 600гц, без него там вообще все в НЧ гумах и наводках потонуло бы.


Цитата
Таким образом, уйдет постоянная составляющая. А разрядность 'сама повысится' на выходе фильтра.


В исходном сигнале постоянной составляющей нет - там сигнал через несколко конденсаторов еще до АЦП проходит. Она появляется когда я модуль беру (abs)

Цитата
Можно сразу решить задачу с помощью квадратурного приема огибающей. Для вычисления каждой точки огибающей нужно выполнить две свертки (сразу с нужным прореживанием, т.е. один раз в 20 мс). Делать свертку сигнала (перемноженного на окно эквивалентного фнч, выбранное в зависимости от болтанки несущей + полоса сигнала) с синусом и косинусом центральной частоты. Для получения точки огибающей нужно векторно сложить результаты сверток (сумма квадратов под корнем). Чем узкополоснее будет фильтр (длиннее ядро), тем выше разрядность выходного сигнала. Останется только отбросить младшие разряды.
PS. Скорее всего, нужен будет еще один полосовой фильтр уже для огибающей


Врядли успею в реалтайме, но попробую.
bahurin
Сначала вы говорите

Цитата
Есть сигнал, несущая около 1кгц, промодулированная (АМ) низкочастотным (0.1-10гц) сигналом.
Сигнал приходит (с АЦП) в виде uint16 /10kHz SR.
Нужно выделить модулирующий сигнал и сделать децимацию на 50гц.


А потом

Цитата(Allregia @ Sep 1 2011, 23:13) *
Полоса есть конечно, примерно 800-2500 гц. Полосовой фильтр есть - после АЦП стоит HPF 4 порядка на 600гц, без него там вообще все в НЧ гумах и наводках потонуло бы.


Я себе очень слабо представляю как модулируя АМ 10 -ти герцовым сигналом можно добиться полосы 2500 Гц да еще и на несущей 1 кГц.

Цитата
Врядли успею в реалтайме, но попробую.


Да бросьте 10 кГц SampleRate можно даже в столбик на листочке успеть в реал тайме обработать. 7 arm схавает и даже не заметит.
GetSmart
Цитата(bahurin @ Sep 2 2011, 09:13) *
Сначала вы говорите
...
А потом
...
Я себе очень слабо представляю как модулируя АМ 10 -ти герцовым сигналом можно добиться полосы 2500 Гц да еще и на несущей 1 кГц.

А в промежутке было
Цитата
Несущая не фиксирована и не стабильна" ... примерно 800-2500 гц.


Разве не очевидно?

Цитата(bahurin @ Sep 2 2011, 09:13) *
10 кГц SampleRate можно даже в столбик на листочке успеть в реал тайме обработать

sm.gif
Это смотря какой алгоритм, сколько у него будет мат.операций на 1 сэмпл.
bahurin
Цитата(GetSmart @ Sep 2 2011, 08:28) *
А в промежутке было


Разве не очевидно?


sm.gif
Это смотря какой алгоритм, сколько у него будет мат.операций на 1 сэмпл.


Не передергиваете сказано было что около 1 кГц. 2.5 кГц это уже нифига не около согласитесь. Это первое. Во вторых полоса 2500 Гц и нестабильность несущей в пределах 2500 Гц это совершенно 2 разные вещи. Если несущая частота меняется от 800 до 2500 Гц, то надо знать на каком временном интервале это может происходить. Потому что изменение несущей во времени приводит к паразитной частотной модуляции на выходе, которая в свою очередь сопровождается паразитной АМ, которая в свою очередь изничтожит полезную АМ с глубиной 3-5%. Постановка задачи совершенно не понятна. Поэтому я и спросил.
GetSmart
Цитата(bahurin @ Sep 2 2011, 09:52) *
Не передергиваете сказано было что около 1 кГц. 2.5 кГц это уже нифига не около согласитесь.

Не соглашусь. Не все поголовно пофи, которые фильтруют каждое слово. Так что с учётом поправочки на неспециалиста всё становится понятно.

Цитата(bahurin)
Во вторых полоса 2500 Гц и нестабильность несущей в пределах 2500 Гц это совершенно 2 разные вещи. Если несущая частота меняется от 800 до 2500 Гц, то надо знать на каком временном интервале это может происходить.

Вот и задайте прямой вопрос. Сэкономите время.
Allregia
Цитата(bahurin @ Sep 2 2011, 06:52) *
Не передергиваете сказано было что около 1 кГц. 2.5 кГц это уже нифига не около согласитесь.


В среднем - 1кгц.


Цитата
Это первое. Во вторых полоса 2500 Гц и нестабильность несущей в пределах 2500 Гц это совершенно 2 разные вещи. Если несущая частота меняется от 800 до 2500 Гц, то надо знать на каком временном интервале это может происходить.


На любом, несущая - псевдошумоподобный сигнал. На 3гц она обрезана сверху антиалиасным фильтром на входе АЦП.

АЦП - 16 бит.

Цитата
Потому что изменение несущей во времени приводит к паразитной частотной модуляции на выходе, которая в свою очередь сопровождается паразитной АМ, которая в свою очередь изничтожит полезную АМ с глубиной 3-5%. Постановка задачи совершенно не понятна. Поэтому я и спросил.


Нет там никакой ПАМ, это не радиоприемник с контуром на входе. Во всяком случае - я ее не вижу.

Цитата
Да бросьте 10 кГц SampleRate можно даже в столбик на листочке успеть в реал тайме обработать. 7 arm схавает и даже не заметит.


Их таких 8 каналов, имеющийся алголритм успевает, но загрузка 72мгц проца уже под 80%. т.к.. один из фильтров (LPF) приходится делать во float.
fontp
QUOTE (Allregia @ Sep 2 2011, 11:03) *
Их таких 8 каналов, имеющийся алголритм успевает, но загрузка 72мгц проца уже под 80%. т.к.. один из фильтров (LPF) приходится делать во float.



В любом случае оптимальное решение - синхронный детектор с ФАПЧ.
Вычислительная сложность его совсем не велика - табличный ГУН, умножитель, пропорционально-интегрирующий фильтр и IIR-ФНЧ на выходе
Другое дело, что ФАПЧ нужно проектировать - так есть литература.

Детекторный приемник - решение далеко не оптимальное. Да и у Вас возможности улучшений почти отсутствуют . Что остается - сделать полосовой фильтр на входе до взятия абсолюта, убирать постоянную составляющую на выходе узкополосным режектором, пожалуй что всё...
Allregia
Цитата(fontp @ Sep 2 2011, 09:08) *
В любом случае оптимальное решение - синхронный детектор с ФАПЧ.


Я не знаю как себя поведет PLL на шумоподобном сигнале.

Цитата
Детекторный приемник - решение далеко не оптимальное. Да и у Вас возможности улучшений почти отсутствуют . Что остается - сделать полосовой фильтр на входе до взятия абсолюта, убирать постоянную составляющую на выходе узкополосным режектором, пожалуй что всё...


Полосовой фильтр перед взятием модуля и так стоит, а вот про узкополсный фильтр - можно поподробнее ? На какие частоты его сделать?
sup-sup
Все-таки, в общем случае, если нужно просто отловить энергию сигнала в полосе 600-3000 Гц, то схема с детектором огибающей способом свертки сигнала с двумя полосовыми FIR, с синусным и косинусным заполнением, решает задачу сразу. Никаких других фильтров не нужно. Нужно просчитывать две свертки один раз в 20 мс. Если 8 каналов, то одно вычисление в 1.25 мс.
Еще вариант, умножить сигнал на частоту 2.5 кГц (умножать на 0, +1, 0, -1, 0, +1, и т.д.), отфильтровав перед этим верхние частоты. Перейти на частоту 5 кГц и сделать ФНЧ на ~2 кГц, чтобы отсечь бывшие 600 Гц низких частот. После этой промежуточной фильтрации - децимации - фильтрации будет меньше нагрузка на 8 каналов обработки.
fontp
QUOTE (Allregia @ Sep 2 2011, 11:42) *
Я не знаю как себя поведет PLL на шумоподобном сигнале.



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


PLL на шумоподобном сигнале ведёт себя по теории, т.е. хорошо и полностью предсказуемо. )) Пропорционально-интегрирующий фильтр специально рассчитывают, чтобы достичь нужного компромисса между подавлением шума и полосой захвата.
Впрочем ФАПЧ нужен только если несущая нестабильна.

Узкополосный фильтр на выходе Вы всегда можете приделать, только он будет удалять не только паразитную постоянную составляющую, но и постоянную компоненту сигнала в той же полосе. Они неотличимы уже. Для звука это безразлично (до 20 гц всегда можно прибить), а у как оно у Вас решайте сами на какие частоты. IIR небольшого порядка на все ненужные.
Если все частоты нужные - тогда никак, тогда Вы с детекторного приемника выжали всё. Другое дело приемник с прямым преобразованием
Allregia
Цитата(sup-sup @ Sep 2 2011, 09:57) *
Все-таки, в общем случае, если нужно просто отловить энергию сигнала в полосе 600-3000 Гц, то схема с детектором огибающей способом свертки сигнала с двумя полосовыми FIR, с синусным и косинусным заполнением, решает задачу сразу. Никаких других фильтров не нужно. Нужно просчитывать две свертки один раз в 20 мс. Если 8 каналов, то одно вычисление в 1.25 мс.
Еще вариант, умножить сигнал на частоту 2.5 кГц (умножать на 0, +1, 0, -1, 0, +1, и т.д.), отфильтровав перед этим верхние частоты. Перейти на частоту 5 кГц и сделать ФНЧ на ~2 кГц, чтобы отсечь бывшие 600 Гц низких частот. После этой промежуточной фильтрации - децимации - фильтрации будет меньше нагрузка на 8 каналов обработки.


Я честно говоря, не очень силен в этом. Как делать IIR/FIR я знаю, а вот свертку - понятия не имею sad.gif
Хоть бы пример какой...
thermit
Цитата(Allregia @ Sep 2 2011, 12:09) *
Я честно говоря, не очень силен в этом. Как делать IIR/FIR я знаю, а вот свертку - понятия не имею sad.gif
Хоть бы пример какой...



FIR == апериодическая свертка
Allregia
Цитата(thermit @ Sep 2 2011, 11:40) *
FIR == апериодическая свертка


Тогда я не очень понимаю как сделать: "схема с детектором огибающей способом свертки сигнала с двумя полосовыми FIR, с синусным и косинусным заполнением"
sup-sup
Цитата(Allregia @ Sep 2 2011, 12:09) *
Я честно говоря, не очень силен в этом. Как делать IIR/FIR я знаю, а вот свертку - понятия не имею sad.gif
Хоть бы пример какой...

Свертка, все-таки, это базовая операция FIR. Каждое выходное значение FIR вычисляется операцией свертки выборок АЦП с импульсной характеристикой фильтра (ядром). На пальцах, или как это выполняется на рассыпухе или на ПЛИС - в один регистр загоняем импульсную характеристику FIR на все время работы, а в другой (рядом) проталкиваем данные из АЦП (или уже обработанную последовательность данных. Как только данные встали рядом перемножаем соседние значения данных и ИХ фильтра и все произведения складываем. Это и есть свертка. Следующим шагом сдвигаем данные на один шаг (сэмпл) (или на несколько шагов, если применяем децимацию) и опять делаем свертку (перемножение со сложением - или MAC - операцию).
А так как мы вычисляем модуль огибающей, а его можно вычислить из комплексного сигнала, то нам нужны два значения (I и Q). По другому, мы принимаем сигнал с неизвестной фазой. То есть, фильтр нужен для комплексного сигнала (или с комплексной ИХ).
GetSmart
Цитата
Все-таки, в общем случае, если нужно просто отловить энергию сигнала в полосе 600-3000 Гц

Бесполезная в данной задаче вещь.

В идеале было бы аппаратно-программное решение. Пиковый детектор со сбросом и его опрос/оцифровка на 50 Гц или меньше. А для вычета постоянки НЧ фильтр на минимальную частоту. Собственно, если 10 кгц оцифровка даёт хорошее качество, а это итак 1000 кратный оверсэмплинг, то и что ещё надо.

Несучка непредсказуема и шумоподобна. Поэтому все методы, что здесь перечислены не будут работать. Они все не из той оперы.

Я только не понял, 8 каналов это с 8-ми разных линий или с одной, но на разных несучках?
sup-sup
Цитата(GetSmart @ Sep 2 2011, 12:55) *
Бесполезная в данной задаче вещь.

В идеале было бы аппаратно-программное решение. Пиковый детектор со сбросом и его опрос/оцифровка на 50 Гц или меньше. А для вычета постоянки НЧ фильтр на минимальную частоту. Собственно, если 10 кгц оцифровка даёт хорошее качество, а это итак 1000 кратный оверсэмплинг, то и что ещё надо.

Несучка непредсказуема и шумоподобна. Поэтому все методы, что здесь перечислены не будут работать. Они все не из той оперы.

Так задачи еще и не было. Похоже на полосу телефона.
SPACUM
Цитата(GetSmart @ Sep 2 2011, 14:05) *
Несучка непредсказуема и шумоподобна.

Как я понял если модуляции нет, то это идеальная синусоида с хаотически меняющейся частотой, но имеющая не менее 800 и не более 2500 полных периодов в секунду и все максимумы строго одинаковые. А если модуляция есть, то отличаются на +- 3%. Это так? Или что-нибудь еще похуже?
GetSmart
Цитата(SPACUM @ Sep 2 2011, 15:20) *
Как я понял если модуляции нет, то это идеальная синусоида с хаотически меняющейся частотой, но имеющая не менее 800 и не более 2500 полных периодов в секунду и все максимумы строго одинаковые. А если модуляция есть, то отличаются на +- 3%. Это так? Или что-нибудь еще похуже?

Как буд-то я ТС sm.gif
Я сам слабо представляю шумоподобный сигнал с постоянной амплитудой. Хотя представил. Но не факт, что то, что у ТС.
Пусть ТС покажет картинку с сигналом например 500 сэмплов.
Allregia
Цитата(GetSmart @ Sep 2 2011, 12:05) *
Я только не понял, 8 каналов это с 8-ми разных линий или с одной, но на разных несучках?


8 разных линий и разных сигналов.
Описанный выше сигнал идет по 6-ти из них, еще по 2-м - там тоже нужна фильтрация но сигнал другой, с ними проблем нет.

Цитата
Как я понял если модуляции нет, то это идеальная синусоида с хаотически меняющейся частотой, но имеющая не менее 800 и не более 2500 полных периодов в секунду и все максимумы строго одинаковые. А если модуляция есть, то отличаются на +- 3%. Это так?


Да, примерно так.

Цитата
Пусть ТС покажет картинку с сигналом например 500 семплов.


Ммм, я не на работе сейчас, в КПК есть только старый искуственный сигнал, там модуляция выше.
Сейчас попробую из него картинку сделать.
GetSmart
Цитата(Allregia @ Sep 2 2011, 16:11) *
Сейчас попробую из него картинку сделать.

Сверху и снизу одно и то же, только масштаб разный?

Upd.
На синусоиду мало похоже. Шумоподобный это да.
Allregia
Да, я зум сделал.
GetSmart
Цитата(Allregia @ Sep 2 2011, 16:16) *
Да, я зум сделал.

А откуда такая несущая и как происходит модуляция?

И вдогонку. Качество демодуляции, описанное в первом посте, устраивает?
Allregia
Цитата(GetSmart @ Sep 2 2011, 13:21) *
А откуда такая несущая и как происходит модуляция?


С датчика хмических процессов. Извините, но что там в датчике и как происходит - и от меня скрыто.
Цитата
И вдогонку. Качество демодуляции, описанное в первом посте, устраивает?


К сожалению, средняя амплитуда несущей может меняться от процесса к процессу, и нет обратной связи с датчиком, в плане его коэффициента усиления перед АЦП, его можно только на самом датчике менять переключателем. Поэтому выставляем такой Ку, чтобы гарантированно не было перегрузки АЦП (он в самом датчике).
На сильном сигнале, когда несущая занимает хотя-бы треть шкалы - все в приницпе устраивает, но когда сигнал слабый (1/8 шкалы) - хотелось бы С/Ш немного повысить.
Собственно, почему я хотел как-нибудь отсечь постоянку после взятия модуля (детектора sm.gif) - чтобы на вход последних фильтров приходило побольше, а том ожет быть проблемы в округлениях пир вычислениях - тот-же алгоритм на РС дает на том-же сигнале выше СШ, колеги отрабатывали в Матлабе.
GetSmart
Цитата(Allregia @ Sep 2 2011, 16:43) *
Собственно, почему я хотел как-нибудь отсечь постоянку после взятия модуля (детектора sm.gif) - чтобы на вход последних фильтров приходило побольше, а том ожет быть проблемы в округлениях пир вычислениях - тот-же алгоритм на РС дает на том-же сигнале выше СШ, колеги отрабатывали в Матлабе.

А FLOAT на какой стадии используется?
И в остальных местах сколько бит целочисленная арифметика?
Вообще, при 1000 кратном оверсэмплинге после фильтров можно иметь разрешение на порядки выше, чем в АЦП.
SPACUM
Цитата(Allregia @ Sep 1 2011, 11:38) *
Вопрос первый - так ли это (типа "а не дурк ли я?" sm.gif), и второй - как лучше выделить эту константу (постоянную составляющую)?

Все сделано разумно, только фильтр IIR_LPF_20Гц должен быть 32-битным. Так лишние разряды и появятся. Ваш процессор имеет быстрое умножение 64 = 32 * 32 и быстрые сдвиги 32 разрядных чисел. Операции с числами long и longlong намного быстрее и точнее, чем с float.
Allregia
Об этом я уже думал, у меня коэфф. фильтра самый боьлшой (по модулю) 1.8, а самый маленький - примерно 8е6 (там в реальности еще куча знаков после запятой). Я думаю если я умножу коэфф. на 1е9 и входные данные перейду от 16 к 32 бита с 64 накопителями, то не выскочу из разрядности. Результат потом промсштабирую до 16 бит.
GetSmart
Цитата(Allregia @ Sep 2 2011, 20:09) *
Об этом я уже думал, у меня коэфф. фильтра самый боьлшой (по модулю) 1.8, а самый маленький - примерно 8е6 (там в реальности еще куча знаков после запятой). Я думаю если я умножу коэфф. на 1е9 и входные данные перейду от 16 к 32 бита с 64 накопителями, то не выскочу из разрядности. Результат потом промсштабирую до 16 бит.

Я бы начал с меньшего. 32 бит математика и накопители. А коэффициенты умножил бы на 1e4. Сильно сомневаюсь, что понадобится больше.
Allregia
Цитата(GetSmart @ Sep 3 2011, 04:02) *
Я бы начал с меньшего. 32 бит математика и накопители. А коэффициенты умножил бы на 1e4. Сильно сомневаюсь, что понадобится больше.


Тогда один коэффициент вместо 0.00000754499299976238 получится 7, и еще один: вместо 0.00001508998599952476 - 15, вам не кажется, что это слишком округленные значения ?
Но попробовать я конечно могу.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.