Теперь у нас есть стенд SDR проекта, приемная часть работает и не плохо работает, в подтверждение тому небольшое видео, в начале сигнал подается с генератора уровнем S9, в конце реальный эфир, замечу без использования ДПФ, сигнал с антенны подается напрямую на вход. Есть и неприятность, при использовании входного трансформатора который дает прибавку по чувствительности +5dB есть неравномерность по чувствительности на НЧ и ВЧ, от 160m до 10m перекос по чувствительности может достигать до 10dB, объясняется это отличием входного сопротивления смесителя на НЧ и ВЧ, если входную цепь сделать следующим образом
то перекос по чувствительности на НЧ и ВЧ практически пропадает. Из видео видно, что при изменении частоты сигнала в пределах полосы пропускания 48 кГц у нас нет ни зеркалки, ни еще каких либо артефактов, два пика на спектре это ошибка буферизации при передачи данных в UAC1, если сделать все правильно, то получим уже такой спектр
А что будет если уводить сигнал за границы панорамы больше чем +/-24 кГц? Тогда в нашей полосе мы увидим отголоски сигнала хоть и значительно меньшим уровнем! Но ведь у нас же перед АЦП стоит уже ФНЧ… Смотрим его расчетное АЧХ
Но этого не достаточно, АЦП оцифровывает сигнал с частотой дискретизации 96 кГц, в последнем моем варианте даже с частотой равной 192 кГц. Грубо говоря, все что есть в полосе и просачивается через аналоговый ФНЧ стоящий перед АЦП, то и оцифровывается, но нам же это не надо, зачем нам видеть и слышать то, чего реально нет!? Вот теперь дело за цифровой обработкой сигналов — ЦОС(DSP). Будем по шагам осваивать эту интересную науку, для меня это тоже в новинку! Так, что если будут дельные замечания/пожелания, буду только признателен! В данном случае нам нужно сделать фильтрацию и децимацию до 48 кГц.
Децимация (от лат. decimatio, от лат. decem — «десять») — уменьшение частоты дискретизации дискретного во времени сигнала путём прореживания его отсчётов.
Для этой цели служат цифровые фильтры. В теорию фильтров вникать не буду, материала в интернетах достаточно.
В нашем случае поможет цифровой фильтр нижних частот с конечной импульсной характеристикой — КИХ(FIR). Спроектировать/рассчитать его коэффициенты такого фильтра можно разными путями, есть и онлайн калькуляторы и отдельное программное обеспечение. Мы же воспользуемся онлайн конструктором TFilter.
Открыв ссылку, увидим следующее
Например мы работаем с комплексным IQ-сигналом (I/Q) от SDR, и нам нужен следующий тип фильтра:
- Тип — Low-pass FIR (для IQ — это эквивалент BPF вокруг 0 Гц)
- Fs — 192 кГц
- Fpass — 22 кГц (чтобы сохранить почти всю ±24 кГц)
- Fstop — 24 кГц
- Apass — 0.1 дБ
- Astop — ≥ 80 дБ
Вводим параметры интересующего нас фильтра, и кликаем по кнопке DESIGN FILTER
видим расчетную АЧХ фильтра. А что за магический параметр TAP?
Tap(от англ. tap — «отвод») — это коэффициенты FIR-фильтра. Чем больше этих коэффициентов, тем круче фильтр, «резче» может быть переход между полосами пропускания и заграждения, но соответственно и выше вычислительная нагрузка.
Характеристики STM32H723ZGT6:
- Ядро: Cortex-M7.
- Тактовая частота: до 550 МГц.
- FPU: одинарная точность (SP).
- DSP-инструкции: есть.
- CMSIS-DSP: оптимизирован под Cortex-M7.
Оценка производительности:
Мы обрабатываем IQ-сигнал с Fs = 192 кГц, Используем децимацию ×4 → выходная частота = 48 кГц, Но фильтр применяется ко всем 192 кГц отсчётам (до децимации).
Количество MAC-операций в секунду, для одного канала:
192 000×335=64.32×106192000×335=64.32×106 MAC/сек
для I+Q:
2×64.32=128.642×64.32=128.64 миллионов умножений/сложений в секунду.
Время на один отсчёт (на ядре 550 МГц), например при идеальной оптимизации: ≈1 такт на MAC (благодаря параллельным инструкциям), требуется: ~129 млн тактов/сек, доступно: 550 млн тактов/сек, предварительно получается, что загрузка CPU ≈ 24%, в теории реально, будем проверять на практике.
На вкладке Source Code можно скопировать коэффициенты фильтра
А можно ли посмотреть АЧХ фильтра по имеющимся коэффициентам? Да можно через тот же Python
Продолжение следует…
73!

