Автор |
Сообщение |
|
Дата: 07 Дек 2009 12:29:28 · Поправил: Вебмастер (15 Дек 2009 19:48:40)
#
Ни передача сигналов ни DSP не являются моей специальностью, поэтому заранее извиняюсь, если использую не совсем точные термины/определения. Мне понадобилось (как специфическую часть большого проекта) имплементировать цифровой FM демодулятор.
Входной сигнал может содержать от одного до трех каналов. В простейшем случае - один. Несущая частота - порядка 2000 Гц (если каналов несколько, несущие частоты всех каналов находятся в диапазоне 1300-2900 Гц). Ширина полосы порядка 300 Гц. Диапазон модулируемого сигнала - до 60Гц.
Я реализовал следующую схему:
1.сигнал оцифровывается аудио картой с частотой дискретизации 8000 Гц, за
2.Полосовой фильтр (если многоканальная передача)
3.Получение комплексного квадратурного сигнала умножением входного на синус и косинус
4.НЧ. фильтр для I и Q сигналов (с отсечкой на 130 Гц)
5. Квадратурный демодулятор:
d_i = in_i[i]; d_q = in_q[i]; d_i0 = in_i[i - 1]; d_q0 = in_q[i -1];
real = d_i *d_i0 + d_q * d_q0;
img = d_q *d_i0 - d_i * d_q0;
out[i] = (short) (gain * ATAN2(img, real) + 0.5);
6. НЧ фильтр с децимацией на 8
В целом, эта схема работает. Идеальный сигнал (с симулятора) декодируется отлично. Однако при декодировании реальных сигналов (записаных на CD) и переданных на линейный вход аудио карты - видны очень сильные искажения. Особенно, при передаче прямоугольного сигнала. Скажем сильный "всплеск" на переломе "вниз". Насколько я могу видеть - основное отличие "идеального" сигнала от "реального" - наличие в реальном паразитной амплитудной модуляции.
Вопросы следующие:1) является ли схема выше правильной и оптимальной при заданных условиях и 2) Как можно улучшить качество демодуляции?
Буду благодарен за любые разумные советы, комментарии, предложения...
|
|
Дата: 07 Дек 2009 14:14:49
#
Как можно улучшить качество демодуляции?
вы используете дискриминационный метод демодуляции. попробуйте использовать фильтровой метод.
|
Реклама Google
|
|
|
Дата: 07 Дек 2009 14:23:12
#
vis Сигнальчик положите который (записаных на CD) и переданных на линейный вход аудио карты - видны очень сильные искажения а там видно будет. Так можно насоветовать чего угодно.
|
|
Дата: 07 Дек 2009 14:32:45
#
out[i] = (short) (gain * ATAN2(img, real) + 0.5);
А +0.5 что даёт? Волшебная константа?
|
|
Дата: 07 Дек 2009 14:54:53
#
А +0.5 что даёт? Волшебная константа?
(short)(float_val + 0.5) - дает наименьшее целое, большее чем float_val
|
|
Дата: 07 Дек 2009 15:04:09
#
дает наименьшее целое, большее чем float_val
Это разве критично, в какую сторону округлять? если gain = ~8000 ?
|
|
Дата: 07 Дек 2009 15:08:11
#
вы используете дискриминационный метод демодуляции. попробуйте использовать фильтровой метод.
А что это за фильтровой метод? Это через FFT с отбрасыванием ненужных частот? Или что-то другое?
|
|
Дата: 07 Дек 2009 15:18:44 · Поправил: Mesh (07 Дек 2009 15:19:03)
#
vis Плз намекните хотя бы сигнал будет или нет? Что бы знать следить за веткой или нет смысла.
|
|
Дата: 07 Дек 2009 15:43:58
#
Mesh Плз намекните хотя бы сигнал будет или нет? Что бы знать следить за веткой или нет смысла. Сигнал будет обязательно. Только - завтра. К сожалению, мне надо вернуться для этого домой:-(
|
|
Дата: 07 Дек 2009 15:46:29
#
vis Ок, уже хорошо. :)
|
|
Дата: 07 Дек 2009 16:06:29
#
DEmiurg Это разве критично, в какую сторону округлять? если gain = ~8000 ?
Да в общем-то нет, конечно... Некоторые вещи руки просто на автомате делают:-)
|
|
Дата: 07 Дек 2009 19:49:16
#
Это через FFT с отбрасыванием ненужных частот? Или что-то другое?
2vis два фильтра на каждую из частотных составляющих и по разности выходов получаем демодулированный поток.
|
|
Дата: 08 Дек 2009 09:43:08
#
Mesh Сигнальчик положите который (записаных на CD) и переданных на линейный вход аудио карты - видны очень сильные искажения а там
Вот один из характерных примеров: http://www.radioscanner.ru/uploader/2009/waves.zip
Входной сигнал - микс трех каналов.
Все файлы - PCM, 16 бит
input.wav - это то, что на входе аудио карты, сразу после оцифровки. (8000 сэмплов в секунду)
after_bpf.wav - это сигнал после полосового фильтра - выделен один канал с несущей 1875 Гц. (8000 сэмплов в секунду)
basic_out.wav - сигнал после демодуляции (1000 сэмплов в секунду). По идее - это должен быть "чистый" треугольник 5 Гц. |
|
Дата: 08 Дек 2009 10:09:10
#
mikasa76два фильтра на каждую из частотных составляющих и по разности выходов получаем
Не совсем понял.. Есть сигнал шириной 60 Гц модулированный несущей 1800Гц,
скажем. Что здесь есть "каждую из частотных составляющих "? FFT? И какие два фильтра? Можно чуть подробней?
|
|
Дата: 08 Дек 2009 13:40:27 · Поправил: Mesh (08 Дек 2009 13:52:23)
#
vis О! Сигналик. Уже проходили это тут много раз, без записи насоветовать можно чего угодно. :) Прикольно было сделать её покрасивше малость, уж больно похабно её слепили :-|) http://www.radioscanner.ru/uploader/2009/inputnew.wav
Ну и по файлу afterbpf видно, что bpf у вас криво работает. Раз bpf кривой может и всё остальное таким же быть. Это bpf по пункту 2 так я пониаю?
Вот как должно быть у нормального bpf http://www.radioscanner.ru/uploader/2009/bpf_gut.wav
А и название темы поменять бы надо у вас не FSK, хотя так вот из текста мессаги получается вроде FSK, а по сигналику частотная модуляция. |
|
Дата: 08 Дек 2009 13:57:49
#
Mesh Это bpf по пункту 2 так я пониаю?
Да по пункту 2. Генерный С код имплементирующий FIR фильтр писал сам, а кэффициенты генерировал MatLab-ом примерно с такими параметрами:BandPass 1875Hz, equiripple,Fs = 16000, Fstop1 = 1500, Fpass1 =1675, Fpass1 =2075, Fstop2 = 2300, Astop1 = 40, Astop2 = 40
|
|
Дата: 08 Дек 2009 14:03:53 · Поправил: vis (08 Дек 2009 14:04:42)
#
Mesh А и название темы поменять бы надо у вас не FSK, хотя так вот из текста мессаги получается вроде FSK, а по сигналику частотная модуляция.
Да, я, изначально ее создавал как "Качество FM демодулятора, как его повысить", но робот ее поменял сначала на "Демодуляция FM", а потом на текущую... Пытался найти на сайте какой-нибудь адрес админа/модератора, чтоб попросить вернуть, но не нашел ничего:-( Написал на всякий случай роботу:-)
|
|
Дата: 08 Дек 2009 14:17:26 · Поправил: Mesh (08 Дек 2009 14:19:20)
#
vis Смотрите сами что должно быть, это нижняя фотограмма, а что у вас, это средняя. Сигнал не в середине полосы а где-то скраю, какие-то выбросы по сигналу, полоса в три раза шире чем надо, ну это ладно это не сильный порок.
Увеличить
Что-то не так однозначо. Математику и програмирование я проверить не могу, так алогритм рабочий вроде. Проблемы походу в его реализации, если у вас входной bpf так работает да плюс lpf в 4 пункте такой же и в 6, то конечно в итого будет что-то несуразное, я б с этого начал, застваить работать всё так как надо. |
|
Дата: 08 Дек 2009 14:45:51 · Поправил: mikasa76 (08 Дек 2009 18:44:44)
#
Не совсем понял..
vis я не совсем понял какая у вас модуляция - аналоговая (FM) или двухпозиционная цифровая (FSK2). если все же FSK2, то алгоритм демодуляции следующий:
1. Снятие несущей 1800. Делается с помощью комплексного перемножителя (отсчеты коснус-синусного гетеродина перемножаются со входными квадратурными отсчетами сигнала - i/q).
2. ресамплер+фнч. перенос сигнала с первоначальной частоты дискретизации 8 кГц на промежуточную частоту определяемую как сумма частоты разноса между частотными составляющими (mark и space) и символьной скорости сигнала (в вашем случае как я понимаю это 60 Гц).
3. гетеродин разноса. перенос составляющих с частоты +/-половина частоты разноса в ноль.
4. второй ресамплер+фнч. перенос сигнала с промежуточной частоты (п.2) дискретизации на двойную символьную. таким образом получаем два отсчета на символ.
5. выделение огибающей для двух частотных составляющих (mark и space).
6. берем разность между двумя значениями огибающей и по знаку этой разности получаем знакопеременную сосавляющую которая и представляет собой демодулированный битовый поток.
к этому всему еще можно добавить фапч для основного гетеродина и гетеродина разноса и адаптивный фильтр. кроме всего эта схема еще должна тактироваться системой тактовой синхронизации.
|
|
Дата: 08 Дек 2009 15:23:30 · Поправил: vis (08 Дек 2009 15:27:02)
#
Mesh Что-то не так однозначо. Математику и програмирование я проверить не могу, так алогритм рабочий вроде.
Спасибо. Попробую еще раз просмотреть алгоритм/код фильтра... Хотя, не похоже, чтоб там были проблемы.. По крайней мере я вижу, что фильтры в целом работают нормально.. Фильтр НЧ, в частности. Да и на идеальном сигнале, то есть прочитанном из файла а не из аудио карточки - результаты вполне нормальные. Ошибки в реализации такого рода вещей обычно дают ОЧЕВИДНО неправильные результаты, мусор. Хотя, всякое конечно бывает.. Попробую проанализировать еще раз.
А что, сами параметры фильтра BandPass 1875Hz, equiripple,Fs = 8000, Fstop1 = 1500, Fpass1 =1675, Fpass1 =2075, Fstop2 = 2300, Astop1 = 40, Astop2 = 40 выглядят подходящими?
|
|
Дата: 08 Дек 2009 15:26:05
#
mikasa76 я не совсем понял какая у вас модуляция - аналоговая (FM) или двухпозиционная цифровая (FSK2)
FM все таки. Просто, робот на форуме почему-то поменял тему на FSK.. :-(
|
|
Дата: 08 Дек 2009 16:09:03
#
vis Просто, робот на форуме Гм, прикольно, ну ладно.
Если из файла нормально, значит проблемы с получанием сигнала с карточки. Так не бывает, карта должна отдать то что получила, и все карты этим и занимаются. Само собой там, уровни, частота дискрета, полоса сигнала и всё такое это на совести экспериментатора.
Мне например непонято на синус и косинус чего умножается входной после bpf. Проверять параметры фильтра я тож не могу, это как нибудь без меня, stop1 stop2 мне ни о чём не говорят, но работает он, по файлу afterbpf криво. Может даже причина и в этом, а может ещё где косяки какие.
|
|
Дата: 08 Дек 2009 16:35:07 · Поправил: vis (08 Дек 2009 16:36:18)
#
Mesh Мне например непонято на синус и косинус чего умножается входной после bpf
На синус/косинус от N * (2*PI*Fcarrier)/sample_rate , где N - номер сэмпла, Fcarrier - частота несущей, sample_rate - частота дискретизации (8000 в моем случае). Вроде все "по математике"..
Проверять параметры фильтра я тож не могу, это как нибудь без меня
Собственно, мой вопрос был - какова практически необходимая глубина и т.п. такого фильтра. Ответы на такого рода вопросы требуют некоторого опыта в предметной области, который у меня как раз и отсутствует:-(
Что касается Astop1 и Astop2 - это термины MatLab-а - уровень понижения в дб соответственно левой и правой частей спектра за пределами пропускаемой полосы. Думал (вероятно ошибочно), что это общепринятая терминология.
|
|
Дата: 08 Дек 2009 16:42:26
#
vis Чему равана Fcarrier конкретно для того сигнала файлы которого вы положили?
По вашей записи, "глубина" вполне себе ничего.
А, МатЛаб понято, я в нём всё равно не рублю.
|
|
Дата: 08 Дек 2009 16:52:28
#
Mesh
Чему равана Fcarrier конкретно для того сигнала файлы которого вы положили
1875 Гц.
А, МатЛаб понято, я в нём всё равно не рублю. Да я, в общем-то тоже:-) , к сожалению. Но с генерацией коэффициентов он мне помог здорово.
|
|
Дата: 08 Дек 2009 17:06:46 · Поправил: Mesh (08 Дек 2009 17:10:35)
#
vis Прикольно, 1875 из какх соображений?
Увеличить
Вроде надо 1788? Или нет? :) |
|
Дата: 08 Дек 2009 18:05:40
#
Mesh Прикольно, 1875 из какх соображений?
Это не "из соображений", это - просто "дано". То есть, по спецификации устройства. Судя по картинке - реально симулятор передает несколько сдвинутую полосу...
|
|
Дата: 08 Дек 2009 18:32:06
#
vis Понятно, с таким "дано" и такими записями задача вообще не решается. :) А входной bpf это тоже "дано"? Он ведь ненужен в тех условиях и алгоритме какие у вас, его можно просто выкинуть. :-) Прикольно однако. Лечите частоту, выкиньте этот bpf вообще и получите желанный треугольный сигнал. Ну а там видно будет какое качество, может и устроит вас, да и проблемы нет.
|
|
Дата: 08 Дек 2009 18:57:09
#
Mesh А входной bpf это тоже "дано"?
Нет, входной bpf - это плод моих собственных размышлений:-) Если вы имеете в виду сам факт его наличия в алгоритме. Впрочем, если вы имеете в виду его дизайн и имплементацию, то они тоже мои.
Он ведь ненужен в тех условиях и алгоритме какие у вас, его можно просто выкинуть Можно эту мысль чуть поподробней? Он не нужен при таком алгоритме (квадратурный дискриминатор)? Или он не нужен при таком разбросе несущей, что дает реальный передатчик? Или он не нужен, потому что он у меня плохо имплементирован? Мне представлялось (возможно по-дилетантски), что если есть несколько каналов, то их обязательно нужно разделить перед демодулированием.. Неправильно?
выкиньте этот bpf вообще и получите желанный треугольный сигнал Сейчас попробую..
Спасибо!
|
|
Дата: 08 Дек 2009 19:02:49
#
vis Он не нужен из условий и алгоритма. Его функции выполняют НЧ фильтры пункта 4. Входной bpf ставят по такой схеме для отсекания внеполосных сильных помех, что бы не перегрузить смесители. Вам это тут не грозит ну ни каким боком. :-) Да можете и оставить, если ФНЧ у вас хорошие, то не холодно и ни жарко от его отсутсвия или присутствия.
|
Реклама Google |
|