Easyelectronics.ru

Электроника для всех
Текущее время: 01 окт 2020, 18:27

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 20 ] 
Автор Сообщение
 Заголовок сообщения: Оптимальный алгоритм амплитудного демодулятора
СообщениеДобавлено: 03 окт 2016, 12:35 
Старожил

Зарегистрирован: 08 июн 2015, 16:26
Сообщения: 507
Доброго времени суток.
Возникла задача - детектирование АМ сигнала с синусоидальной несущей в 4 кГц. Есть идея реализовать детектор программно, на микроконтроллере. Однако возник спор с сотрудниками по поводу того, что если отсчитывать хотя бы на частоте Котельникова (т.е. 8 кГц) с помощью АЦП, то уже работа всей программы забьется, хотя я с этим не согласен. Целевой контроллер, скорее всего, MSP430. Также были предложены идеи использовать входной пиковый детектор или триггер Шмитта, чтобы из синусоиды формировать прямоугольные импульсы и отлавливать пики результирующих импульсов с помощью прерывания, тогда частота срабатывания прерываний гипотетически снизилась бы до требуемых 4 кГц. Однако здесь другая проблема есть: поскольку огибающая у нас имеет довольно большой диапазон по напряжению (от 2 до 5 вольт), то прерывание не будет срабатывать на импульсы с такой амплитудой, т.к. далеко не всегда они будут достигать лог. 1.
Поэтому возник вопрос: кто может подсказать оптимальный алгоритм программного детектирования? В гугле не забанили, я спрашиваю совета по поводу того, как лучше в данном случае поступить? Мое мнение все же заключается в том, что можно после пикового детектора заводить сигнал на АЦП и считывать с частотой 8 кГц, таким образом выделяя необходимые пики.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Оптимальный алгоритм амплитудного демодулятора
СообщениеДобавлено: 03 окт 2016, 14:05 
Старожил

Зарегистрирован: 26 авг 2014, 10:34
Сообщения: 774
теория:
http://r4n.su/forum/viewtopic.php?f=28&t=331
готовый велосипед (в исходниках поковыряться):
https://www.youtube.com/watch?v=Clw0pLYIrCc


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Оптимальный алгоритм амплитудного демодулятора
СообщениеДобавлено: 03 окт 2016, 15:38 
Старожил

Зарегистрирован: 08 июн 2015, 16:26
Сообщения: 507
Спасибо огромное, кажется, это то, что мне нужно сейчас!

P.S. Еще один вопрос возник по пути. Решили временно попробовать такой велосипед: входную синусоиду подавать на триггер Шмитта, где она преобразуется в четкие прямоугольные импульсы. По приходу каждого импульса на вывод внешнего прерывания запускаем АЦП и замеряем мгновенное значение синусоидального напряжения. Поскольку для данной частоты нам приблизительно известна фаза пришедшего синуса, то зная фазу и мгновенное значение через табличный синус вычисляем амплитудное значение напряжения программно. Затем уже полученную серию амплитуд фильтруем программным ФНЧ и обрабатываем далее. Хотел бы спросить мнение, насколько данный велосипед эффективен будет?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Оптимальный алгоритм амплитудного демодулятора
СообщениеДобавлено: 03 окт 2016, 17:29 
Старожил

Зарегистрирован: 28 янв 2015, 16:31
Сообщения: 248
sdv_cyborg писал(а):
с синусоидальной несущей в 4 кГц.
У вас всего одна частота - достаточно примитивного Goertzel algorithm https://ru.wikipedia.org/wiki/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%93%D1%91%D1%80%D1%86%D0%B5%D0%BB%D1%8F
Простейшая реализация есть и на этом сайте http://we.easyelectronics.ru/samnetmon/testovaya-zapis-algoritm-gercelya.html

Там по коду найдёте :
Код:
magnitudeSquared= real*real+imag*imag;
magnitude=sqrt(magnitudeSquared);
это и есть амплитудное декодирование...

sdv_cyborg писал(а):
По приходу каждого импульса на вывод внешнего прерывания запускаем АЦП и замеряем мгновенное значение синусоидального напряжения. Хотел бы спросить мнение, насколько данный велосипед эффективен будет?
Если у вас есть сигнал синуса не модулированный (пилот-тон), то можно подать его на ключ и сделать "устройство выборки хранения" на входе АЦП. Это будет синхронный детектор без фапч. Тогда вы сможете оцифровывать сигнал МК в любые удобные для вас моменты времени. Ваш вариант тоже заработает, но старт АЦП не должен прерываться/откладыватся другими кусками кода

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


Последний раз редактировалось Миха 03 окт 2016, 17:51, всего редактировалось 5 раз(а).

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Оптимальный алгоритм амплитудного демодулятора
СообщениеДобавлено: 03 окт 2016, 17:45 
Старожил

Зарегистрирован: 08 июн 2015, 16:26
Сообщения: 507
Нет, частота несущей таки будет изменяться, так что лучше программно.
Спасибо за совет, попробую еще такой метод обработки.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Оптимальный алгоритм амплитудного демодулятора
СообщениеДобавлено: 03 окт 2016, 19:00 
Старожил

Зарегистрирован: 26 авг 2014, 10:34
Сообщения: 774
посмотрите еще статейку "AVR Software Defined Radio " в журнале "Elektor Electronic" April 2012 - там теория и практика программной обработки на популярном 8-битнике. Софт вроде был к статье.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Оптимальный алгоритм амплитудного демодулятора
СообщениеДобавлено: 03 окт 2016, 19:14 
Старожил

Зарегистрирован: 08 июн 2015, 16:26
Сообщения: 507
Миха писал(а):
У вас всего одна частота - достаточно примитивного Goertzel algorithm https://ru.wikipedia.org/wiki/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%93%D1%91%D1%80%D1%86%D0%B5%D0%BB%D1%8F
Простейшая реализация есть и на этом сайте http://we.easyelectronics.ru/samnetmon/testovaya-zapis-algoritm-gercelya.html


Хм, я вот только сейчас прикинул... алгоритм Герцеля как-то неуместен выходит. Дело в том, что сигнал оооочень медленно изменяется - от 0.5 до 20 Гц максимум. При частоте несущей 8 кГц, чтобы получать все необходимые отсчеты в таком скромном уголке спектра, надо собирать что-то около 16 тысяч отсчетов. Кажется, алгоритм Герцеля здесь - это забивание велосипедом гвоздей. С другой стороны... Сигнал все-равно медленный, можно все это время как раз выборки хватать, на фильтр подавать и получать нужные отсчеты, потом с пороговыми значениями сверять отсчеты... Надо подумать, в общем.

oleg110592 писал(а):
посмотрите еще статейку "AVR Software Defined Radio " в журнале "Elektor Electronic" April 2012 - там теория и практика программной обработки на популярном 8-битнике. Софт вроде был к статье.

Посмотрю тоже, это ближе к MSP430 по производительности, чем к ARM'ам.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Оптимальный алгоритм амплитудного демодулятора
СообщениеДобавлено: 03 окт 2016, 20:56 
Старожил

Зарегистрирован: 05 фев 2013, 00:58
Сообщения: 3516
Что-то меня терзают смутные сомнения, сможет ли хоть один процессор без плавающей точки отработать весь анализ за предложенное время... Лично я бы делал аппаратно - схема нахождения модуля + ФНЧ, дешево и сердито.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Оптимальный алгоритм амплитудного демодулятора
СообщениеДобавлено: 03 окт 2016, 22:30 
Только пришел

Зарегистрирован: 29 авг 2012, 00:11
Сообщения: 21
Аналоговым компаратором получаем меандр из входного синуса, делим частоту результата счетчиком на 128 и просим прерывание. В прерывании измеряем период, сглаживаем фильтром и запускаем ацп с задержкой в 1/512 измеренного периода от момента прерывания.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Оптимальный алгоритм амплитудного демодулятора
СообщениеДобавлено: 03 окт 2016, 22:51 
Старожил

Зарегистрирован: 08 июн 2015, 16:26
Сообщения: 507
ztkl писал(а):
Аналоговым компаратором получаем меандр из входного синуса, делим частоту результата счетчиком на 128 и просим прерывание. В прерывании измеряем период, сглаживаем фильтром и запускаем ацп с задержкой в 1/512 измеренного периода от момента прерывания.

По сути тоже самое, что я и предлагаю, только вместо компаратора триггер Шмитта, чтобы меньше шумов ловил.
А вот на счет деления я не подумал, протупил.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Оптимальный алгоритм амплитудного демодулятора
СообщениеДобавлено: 03 окт 2016, 22:57 
Старожил

Зарегистрирован: 30 апр 2010, 22:56
Сообщения: 1589
Откуда: Киев
чото сложно все делаете. Имхо надо так:

домножаем на синус/косинус 4кГц. Если правильно подобрать частоту дискретизации (например 4 отчета на период), то все выродится в домножение на плюс-минус 1, сиречь сложение и вычитание.

Амплитуда - корень квадратный из суммы квадратов. Фаза побоку - с синхронизацией не паримся. Все.

Если есть какие-то побочные шумы - давим фильтром перед детектором.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Оптимальный алгоритм амплитудного демодулятора
СообщениеДобавлено: 04 окт 2016, 00:12 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2795
Откуда: Санкт-Петербург
Зачем это всё? Какая-то непонятная гора сложностей в реализации и явно недостаточная информация о задаче.
Вопросы:
1. На входе отфильтрованный сигнал (модулированная синусоида 4 кГц) или с помехами?
2. Если с помехами - каков их частотный диапазон и амплитуда?
3. Какова baud rate (не путать с bit rate) сигнала? Иначе говоря, сколько раз в секунду меняется амплитуда?
4. Как меняется модулирующий сигнал? Плавно или резко? Если резко - синхронизированы ли его изменения с несущей?
5. Насколько стабильна частота несущей и насколько точно она известна?

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Оптимальный алгоритм амплитудного демодулятора
СообщениеДобавлено: 04 окт 2016, 10:12 
Старожил

Зарегистрирован: 08 июн 2015, 16:26
Сообщения: 507
aamonster писал(а):
Зачем это всё? Какая-то непонятная гора сложностей в реализации и явно недостаточная информация о задаче.
Вопросы:
1. На входе отфильтрованный сигнал (модулированная синусоида 4 кГц) или с помехами?
2. Если с помехами - каков их частотный диапазон и амплитуда?
3. Какова baud rate (не путать с bit rate) сигнала? Иначе говоря, сколько раз в секунду меняется амплитуда?
4. Как меняется модулирующий сигнал? Плавно или резко? Если резко - синхронизированы ли его изменения с несущей?
5. Насколько стабильна частота несущей и насколько точно она известна?


1. На входе отфильтрованная несущая в виде синусоиды 4 кГц.
2. Помех нет.
3. Baudrate несущей 4 кБод.
4. Модулирующий сигнал меняется с очень низкой частотой - от 0.5 до 20 Гц. Может в некоторые моменты меняться резко. С несущей никак не синхронизированы изменения.
5. Частота несущей, к счастью, достаточно стабильна и точно известна: фазных помех практически нет (крайне редко проявляются). У передатчика с этим, к счастью, все хорошо.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Оптимальный алгоритм амплитудного демодулятора
СообщениеДобавлено: 04 окт 2016, 10:48 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2795
Откуда: Санкт-Петербург
Полнейшая халява. Baud rate (это частота изменения _параметров_ сигнала) 5-20 Гц, сигнал отфильтрован... 100 измерений в секунду точно хватит.
Остаётся только решить, как мерить именно амплитуду. Вариантов много, самым дешёвым мне кажется цифровать с периодом 1/16000 + n/4000 (n = 0, 1, 2... на выбор, но при слишком большом начнёт сбоить) и считать амплитуду синуса в лоб преобразованием Фурье (по блокам, кратным 4 отсчётам) - коэф-ты будут целые.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Оптимальный алгоритм амплитудного демодулятора
СообщениеДобавлено: 04 окт 2016, 11:52 
Старожил

Зарегистрирован: 28 янв 2015, 16:31
Сообщения: 248
aamonster писал(а):
Полнейшая халява.
Если сигнал настолько сильный что есть возможность выделять из него пилот-тон, почему просто не использовать банальный аппаратный диодный амплитудный детектор на операционнике ?
http://nauchebe.net/2014/07/amplitudnye-detektory-na-ou-v-ustrojstvax-na-mikrosxemax/
http://nauchebe.net/2011/04/amplitudnye-detektory-mk/


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Оптимальный алгоритм амплитудного демодулятора
СообщениеДобавлено: 04 окт 2016, 12:24 
Старожил

Зарегистрирован: 08 июн 2015, 16:26
Сообщения: 507
Миха писал(а):
aamonster писал(а):
Полнейшая халява.
Если сигнал настолько сильный что есть возможность выделять из него пилот-тон, почему просто не использовать банальный аппаратный диодный амплитудный детектор на операционнике ?
http://nauchebe.net/2014/07/amplitudnye-detektory-na-ou-v-ustrojstvax-na-mikrosxemax/
http://nauchebe.net/2011/04/amplitudnye-detektory-mk/


Тоже вариант. Только задумался сделать пиковый детектор зачем-то, например. На диоде и триггере Шмитта.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Оптимальный алгоритм амплитудного демодулятора
СообщениеДобавлено: 04 окт 2016, 12:53 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2795
Откуда: Санкт-Петербург
Миха, я тоже примерно о том же подумал, но частоты совсем уж низкие, так что можно обойтись без "лишних деталей".

sdv_cyborg, уточнение к тому, что я написал: можно цифровать с периодом (n±¼)/f (±¼/f - это просто 4 отсчёта на период, а добавление n/f ничего не меняет, эффект стробоскопа), т.е. с частотами обработка в прерывании от таймера будет выглядеть как-то так: (не оптимизировано, просто попрозрачней написал)
Код:
static uint n=0;
static int a=0, b=0;
uint input = adc();
switch (n&4) {
  case 0: a += input; break; // cos φ = 1, sin φ = 0
  case 1: b += input; break; // cos φ = 0, sin φ = 1
  case 2: a -= input; break; // cos φ = -1, sin φ = 0
  case 3: b -= input; break; // cos φ = 0, sin φ = -1
}
n++;
if(n==16) { // для примера, период любой, кратный 4
  output = fast_hypot(a,b); // можно вместо этого выплюнуть a и b куда-то, а hypot считать уже в главном цикле
  n = 0; a = 0; b = 0;
}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Оптимальный алгоритм амплитудного демодулятора
СообщениеДобавлено: 04 окт 2016, 12:57 
Старожил

Зарегистрирован: 08 июн 2015, 16:26
Сообщения: 507
aamonster писал(а):
sdv_cyborg, уточнение к тому, что я написал: можно цифровать с периодом (n±¼)/f (±¼/f - это просто 4 отсчёта на период, а добавление n/f ничего не меняет, эффект стробоскопа), т.е. с частотами обработка в прерывании от таймера будет выглядеть как-то так: (не оптимизировано, просто попрозрачней написал)
Код:
static uint n=0;
static int a=0, b=0;
uint input = adc();
switch (n&4) {
  case 0: a += input; break; // cos φ = 1, sin φ = 0
  case 1: b += input; break; // cos φ = 0, sin φ = 1
  case 2: a -= input; break; // cos φ = -1, sin φ = 0
  case 3: b -= input; break; // cos φ = 0, sin φ = -1
}
n++;
if(n==16) { // для примера, период любой, кратный 4
  output = fast_hypot(a,b); // можно вместо этого выплюнуть a и b куда-то, а hypot считать уже в главном цикле
  n = 0; a = 0; b = 0;
}

О как, спасибо за такое подробное разъяснение, приму на вооружение его!

Думаю, что тему можно считать закрытой.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Оптимальный алгоритм амплитудного демодулятора
СообщениеДобавлено: 04 окт 2016, 13:11 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2795
Откуда: Санкт-Петербург
На всякий случай напоминаю: не забудьте обеспечить атомарный доступ к переменным, которые выдаются из прерывания в основную прогу (чтобы не оказалось, что основная прога прочитала половину переменной, и тут прерывание изменило её значение - в результате прога использует что-то непонятное).
Хотя на MSP430 обращения к 16-битным переменным, наверное, атомарны "из коробки"?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Оптимальный алгоритм амплитудного демодулятора
СообщениеДобавлено: 04 окт 2016, 13:42 
Старожил

Зарегистрирован: 08 июн 2015, 16:26
Сообщения: 507
Да, верно, об этом я помню всегда. Хоть опыт у меня небольшой, но навозиться с косяками несоблюдения атомарности пришлось.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 20 ] 


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB