Comments 52
Надо же, SDR своими руками.
Следующий шаг - эту конструкцию стоит доработать до супергетеродина, частота ПЧ будет как раз по зубам этому контроллеру. А в качестве гетеродина взять какой-нить Si5351
Ну и модуляций добавить, не только АМ, но и SSB и FM можно докинуть
Исключительно добротный материал. Проработанная и качественная подача материала, отличное оформление статьи. Номинируйтесь на Технотекст 2021, с удовольствием проголосую.
Чувствуется основательный подход к делу, автор - инженер старой школы, который получил в руки все современные технологии :)
Один вопрос: если уж упомянули гетеродинирование, то может быть стоит первым этапом после АЦП умножать сигнал на синус ВЧ, а затем не спеша обрабатывать его фильтрами высоких порядков?
Большое спасибо. Попробую :)
Я опять выступлю как скептик, в статье слишком большая "разжеванность" подачи некоторых аспектов, выходящих за рамки статьи. Пример про пружину. А в общем тема DSP обработки сигналов на распространенных MCU, младших Cortex-ах, вполне неплохо представлена автором.
Сам удивился. Возможно находится автор у границы Китая или Украины (https://worldradiomap.com/map/). По фразе "По количеству мощных радиостанций диапазон средних волн 530 – 1600 KHz (MW) значительно более интереснее длинноволнового диапазона" подозреваю Китай.
У нас более интереснее попробовать сделать "навигатор" для системы "Чайка". Что-то об этом попадалось на хабре.
У автора типичный для Центральной России вечерний эфир - на ДВ принимается Румыния (153 кГц) и Польша (225 кГц), на СВ много мощной Румынии, громко слышна Украина на 549 кГц, Питер на 828 кГц, Эстония на русском на 1035 кГц, Радио Свобода на 1386 кГц, Вести ФМ на 1413 кГц. В ролике он сам сказал, что находится в Зеленограде. Рядом с Китаем эфир будет кардинально другой, там славянской речи вы не услышите. Можете попробовать для интереса включить вечером приемник с ДВ и СВ, желательно на улице, если есть такая возможность. Жизнь на СВ все еще есть.
Вероятно главное условие приема - большая магнитная антенна от советского радиоприемника типа ВЭФ.
Да, антенна сильно влияет на прием. Но у автора еще и довольно чистый эфир. Сейчас в городской квартире, где куча помех от китайских зарядок, блоков питания компьютеров, телевизоров и всего прочего, бывает очень проблематично послушать АМ-станции.
А я на ДВ (камчатка) слышал русскую речь, от китайцев.
На самом деле полно...
Вопрос по реализации:
1) Чип STM32G431 имеет математический ускоритель для расчета тригонометрии. Может имеет смысл его использовать для расчетов? А то такой инструмент простаивает, а вы на ассемблер уходите ...
2) На чипе есть аппаратный цифровой фильтр FMAC. Зачем тогда Вам нужен программый фильтр?
Все это вместе может сильно снять нагрузку с основного чипа.
цифровой фильтр FMAC
а вы его сами пробовали? интересно как оно в действии
edit: а разве FMAC не в новых stm32U5 появился? увидел. в это тоже есть, они его почему-то на диаграмме не показали как FMAC, а просто написали filtering. для U5 было было виднее)
Ещё можно ускорить программу, переписав вычисления на целочисленных SIMD-инструкциях. Хотя у процессоров Cortex-M4 нет 64-битных регистров, но они умеют обрабатывать 32-битное слово как 2 16-битных или 4 8-битных числа одной командой. При разрядности сигнала 12 бит часть вычислений можно проводить в 16-битном формате.
Пробовал, получается не очень хорошо. Использование 16 бит не обеспечивает достаточный динамический диапазон для качественной работы фильтра. Использование float32 существенно улучшает работу без заметного уменьшения производительности. Когда познакомился с системой команд сопроцессора с плавающей точкой, очень удивился, насколько нерационально написана стандартная библиотека С работы с float (смотрел дизассемблерный код).
Многие команды сопроцессора, такие как сложение, вычитание, умножение и т.д. выполняются за один такт. А DSP команда VMLA.F32 (Floating-point Multiply
and Add Sd <- Sd + Sn × Sm) выполняется за три такта. То есть на ассемблере работа с int и float не сильно отличается по времени.
Когда познакомился с системой команд сопроцессора с плавающей точкой, очень удивился, насколько нерационально написана стандартная библиотека С работы с float (смотрел дизассемблерный код).
Это может быть вызвано требованиями стандартов языка С, т.к. каждая функция должна корректно обрабатывать все возможные значения, предусмотренные IEEE-754 (0.0, -0.0, NaN, субнормальные числа и т.д.), с точностью до последнего бита. Недавно была статья об опции компилятора -ffast-math, которая может помочь ускорить вычисления за счёт уменьшения строгости проверок. Например, без ключа -fassociative-math компилятор не станет переставлять аргументы и упрощать многие математические выражения.
1) Генерация синуса в тексте статьи приводилась для описания модели элементарного осциллятора и демонстрации работы ЦАП. В макете приемника осциллятор не использовался. Для реализации гетеродинной схемы попробую использовать CORDIC сопроцессор.
2) Аппаратный ускоритель FMAC работает с 16-ти разрядными целыми числами. В реализации приемника используется 32-х битный float, а это уже совершенно другой уровень качества обработки сигнала.
Ничоси! Пасхалочка с маятником...
Например, на рисунке 11 приведена осциллограмма выходного сигнала при значении f в формуле (13) равной 200 KHz.
В online-симуляторе DDS'ок от Аналоговых Девиц — примерно такие-же буераки на выходе. А после фильтра — всё становится чинно-благородно.
Итак, для перекрытия всего MW диапазона необходимо увеличить скорость обработки сигнала минимум еще в 2 раза. Традиционным путем увеличения производительности программы является написание наиболее нагруженных частей кода на языке ассемблера.
НЯЗ — ещё можно перенести критичные секции кода в ОЗУ и избавиться от циклов ожидания ПЗУ.
1) В приемнике на выходе перестраиваемого фильтра стоит ФНЧ для сглаживания "буераков". На рисунке 11 - демонстрация "ужасов" промежуточных результатов цифровой обработки.
2) Хорошая идея - перенести критический код в RAM. Попробую.
Имеете в виду что-то типа "ART accelerator"? Но, если есть свободное ОЗУ, — можно получить гарантированные "0-wait state".
ART акселератор контроллера STM32G содержит очередь предварительной выборки инструкций и кеш ветвлений. Код DSP обработчика ( функция DMA1_CH4_IRQHandler из файла dsp.s) достаточно компактна - код основного цикла обработки занимает 62 байта и скорее всего полностью помещается в кэш.
В главе 2 (базовый проект) аналитически подсчитывается, что количество тактов ядра, затрачиваемых на выполнение цикла while( i ) i--; равно 11 (без тактов ожидания). В главе 3 (подключение внешнего кварцевого резонатора) проводится измерение с помощью осциллографа времени одной итерации цикла на частоте ядра 170 MHz. Оно равно 64,7 нс, или или 64,7/11 = 5,88 нс на такт, что соответствует 170 MHz тактовой частоты. То есть ART акселератор для коротких блоков кода довольно эффективно работает.
Это фигня.. Народ умудрялся на голой ардуинке за счёт тонкого real-time выдавать с цап модулированный аналоговый телесигнал с видео, который можно было на антенну телика подать. Правда не высокого разрешения и чб, но все же..
В этой серии контроллеров есть такой экземпляр: stm32g474. У него есть волшебный high resolution таймер, который в сочетании с возможностью конфигурации тактовой частоты способен творить чудеса для построения квадратурных детекторов или сэмплеров. Сам применяю именно эту серию и вам рекомендую :)
Очень хорошая статья!
Мк серии G выбраны из каких соображений?
Есть же stm32h750, 16 бит АЦП, 400МГц, 64 бит double аппаратно и цена 7 долларов.
На борту заявлено пара ОУ, тоже можно пустить в дело
Спасибо.
stm32G выбран из соображения цены и качества. NUCLEO-G431KB самая доступная плата, а статья прежде всего адресована старшеклассникам и "младшекурсникам". Да и хотелось сделать именно "простой" приемник прямого усиления (хотя , на мой взгляд, это DDR).
stm32h750 - лежит у меня на столе. Очень хочется попробовать.
Пытался использовать ОУ на борту в качестве УВЧ. Имеется два недостатка: 1) частота единичного усиления 15 MHz, то есть на 2 MHz усиление не более 7 (7*7 = 49, а нужно 100); 2) очень сильно шумят.
Добрый день.
Мануалы, которые я использовал для работы, указаны в начале статьи.
«RM0440, Reference manual STM32G4 Series advanced Arm ® -based 32-bit MCUs» - подробное описание функциональных блоков контроллеров серии STM32G4.
«DS12589 Rev 2 - Datasheet STM32G431x6, STM32G431x8, STM32G431xB» - описание контроллеров линейки STM32G431x6, STM32G431x8, STM32G431xB.
«PM0214 Rev 10 - STM32 Cortex ® -M4 MCUs and MPUs programming manual» - руководство программиста.
Не дал прямые ссылки. Просто не уверен, что это можно сделать ничего не нарушая.
Названия документов указаны точно, через googl вы сразу выйдите на ссылки.
Очень крутая статья. Какую литературу по цифровой обработке сигналов можете посоветовать для новичка? Захотелось даже самому всё это испробовать и сделать фильтр для звуковых частот на МК
Как было правильно сказано про меня в одном из комментариев "инженер старой школы, который получил в руки все современные технологии :)". То есть я изучал цифровую обработку еще в советское время. Но как-то мне попалась в руки одна интересная книга, которую могу порекомендовать новичкам: Юкио Сато "Без паники! Цифровая обработка сигналов". Книга была переведена на русский язык в 2010 году.
Стал читать эту книгу. Это бомба просто! Везде пичкают непонятные математические выкладки. А тут автор проводит целый экскурс в необходимые разделы математики и очень наглядно объясняет математику. Вспоминаю вузовский курс математики и офигеваю, как он наглядно, доступно с приведением аналогий объясняет все понятия.
Без математики для звуковых частот можно взять готовый DSP процессор. ПО для настройки очень хорошее, можно блочками сконфигурировать любые фильтры, задержки, перемножители сигнала и залить конфигурацию в чип. Можно нормализацию АЧХ сделать по образцовому микрофону. Стоит дешево, на борту АЦП, ЦАП и выход цифровой для оптики например.
Это просто бомба. Тянет на диплом. Спасибо, очень интересно, а главное доступно.
Простой цифровой радиоприемник на базе контроллера STM32G4 своими руками