Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Демодуляция FM (УКВ-радио): почему может быть очень низкий SNR?
Форум разработчиков электроники ELECTRONIX.ru > Цифровая обработка сигналов - ЦОС (DSP) > Алгоритмы ЦОС (DSP)
blacklion
Сразу скажу, что формального образования в области ЦОС и электроники у меня нет, но в связи с интересом к SDR я прочитал уже десяток англоязычных учебников по разным аспектам теории связи и ЦОС.

Сейчас я, что бы теория не оставалась голой теорией, экспериментирую с широкоизвестным RTL-SDR USB-свистком. При этом, я не пользуюсь GNURadio, а кусочки пишу сам, с нуля. Первая цель — полная реализация FM-радио, включая RDS. Понятно, что я совершенно не оригинален, но можно считать это курсовой работой для самого себя.

С приёмника я получаю оцифрованный Q/I поток в baseband. Частота семплирования — 2Ms/s, т.е. по 1Ms/s на Q и на I.

Так вот, я вполне успешно реализовал LPF, PLL и ресемплер. В результате, с использованием PLL в качестве демодулятора (его частотного выхода) после LPF-фильтрации со срезом в 15Khz и ресемплингом в 48Khz моно-звук вполне сносо играет.

Я решил реализовать два других основных метода FM-демодуляции в complex baseband — квадратурную (y[n] = arg(x[n] × x*[n-1]), где x*[n] — комплексное сопряжённое) и с использованием дефференциатора (y[n] = (Re(x[n]) × Im(x'[n]) - Im(x[n]) × Re(x'[n])) / abs²(x[n]), где x'[n] — производная, считается 5-ти стадийным FIR'ом).

Оба способа, в принципе, работают (что-то слышно). Но у них ужасный SNR. Звук радио слышен едва-едва на фоне статики. При том, что я пробую локальные радиостанции, которые отлично принимаются любым "аппаратным" радиоприёмником и вполне нормально детектируется PLL.

Так как я неопытный, я не понимаю: это я что-то делаю не так? Почему оба «классических» способа фактически непригодны к использованию? Где я налажал?

У PLL, впрочем, есть другая проблема: на «разговорных» станциях поверх голосов ведущих и прочих гостей в студии всё время слышен отчётливый нерегулярный треск (не как статика, а отдельными песчинками, если можно так сказать). Почему-то поверх музыки его при этом нет! Опять же, вопрос: что я сделал не так?

Да, вся реализация в double, все значения болтаются во вполне разумных пределах (~10), так что это точно не проблемы недостатка точности.
Fat Robot
Полосу входных отсчетов (I/Q) надо бы ограничить, чтобы она соответствовала полосе радиоканала. Иначе у вас вся полоса в 1 МГц поступает на демодулятор.

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

Подробнее здесь:
Кантор Л. Я. и Дорофеев В. М. Помехоустойчивость приема ЧМ сигналов. М., «Связь», 1977. 336 с. с ил.

Также
В примерах GNU Radio был проект демодулятора RDS.

То, что в вашей системе отсутствует, насколько я мне удалось понять из вашего повествования, - это Channel Filter вот с этой картинки.
Serg76
Цитата(blacklion @ Oct 20 2014, 21:45) *
Я решил реализовать два других основных метода FM-демодуляции в complex baseband — квадратурную (y[n] = arg(x[n] × x*[n-1]), где x*[n] — комплексное сопряжённое) и с использованием дефференциатора (y[n] = (Re(x[n]) × Im(x'[n]) - Im(x[n]) × Re(x'[n])) / abs²(x[n]), где x'[n] — производная, считается 5-ти стадийным FIR'ом).

попробуйте такой дискриминатор y[n] = Re(x[n]) × Im(x[n-1]) - Im(x[n]) × Re(x[n-1]), все должно работать, любое дифференцирование сильно разгоняет шумовую составляющую, и плюс к этому надо убрать весь внеполосный шум, чтобы он не попадал в полосу дискриминатора
andyp
Ну и мои 5 копеек - там по идее должен быть фильтр-деемфазис, подавляющий шум на выходе частотного детектора. Про него не забыли?
V_G
Ну, и Re(x[n]) * Im(x[n-1]) - Im(x[n]) * Re(x[n-1]) - это как раз вариант вычислений с производной по 2-м точкам. Желательно (но не обязательно) выходной сигнал пронормировать по амплитуде (/ (abs(x[n])^2), чтобы громкость разных радиостанций была одинакова.

И наконец, для минимизации искажений частота дискретизации должна быть максимально высокой, иначе вычисление производной по двум точкам будет неточным.
blacklion
Всем спасибо! Разумеется, не было входного фильтра на 100Khz, введение его всё починило, работают одинаково все 3 способа демодуляции.

Про де-емфазис я помню, пока его нет, но это вопрос правильности передачи частот :) Ну да, высокие неправильные в звуке сейчас.

Производную я считаю по 5 точкам, по 3-м точкам даже на тестовом сигнале (2 синуса как сигнал) очень много шума остаётся.

Ещё раз всем спасибо.

(да, в GNURadio я тоже подглядываю, конечно, но код там… Местами вот прямо баги очевидные, на уровне перепутанных имён переменных, надо, кстати, парочку отрепортить).
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.