Порядок CIC 3 вместо 4: аккумуляторы шире 18 бит не работают в кристалле

Тракт молча отдавал нули: CIC с 26-битными аккумуляторами в железе не считает,
хотя синтез, трассировка, тайминг и симуляция чистые. Порог найден перебором на
плате с приёмом по UART: 26, 24 и 20 бит мертвы, 18, 16 и 10 работают.

Порядок 3 требует ровно 18 бит вместо 24 и попадает в рабочую область.
Характеристики от этого стали лучше: подавление в задерживании 76 дБ вместо 72,
сворачиваемых полос 92 дБ вместо 77, полоса та же 0.032 дБ. Коэффициенты ФНЧ
пересчитаны под sinc^3, сдвиг выхода уменьшен до 13 -- усиление CIC теперь
50^3, и коэффициенты по-прежнему укладываются в 18 бит.

Сброс по включению убран: он тоже убивает тракт, проверено прошивкой в обе
стороны. Маяк светодиода вынесен в условную генерацию, чтобы его широкий
счётчик не собирался в рабочем режиме.

Проверено на плате: 1481 кадр за 6 с, 74050 отсчётов, CRC без ошибок,
STATUS чистый, на входе живой звук.
This commit is contained in:
nikit3s
2026-08-18 12:06:43 +03:00
parent f936d86f89
commit 668c0564e9
5 changed files with 130 additions and 113 deletions
+4 -4
View File
@@ -1,13 +1,13 @@
#!/usr/bin/env python3
"""Расчёт ФНЧ-дециматора /5 и генерация src/fir_coefs_pkg.vhd.
Фильтр стоит после CIC sinc^4 /50 и решает две задачи сразу:
Фильтр стоит после CIC sinc^3 /50 и решает две задачи сразу:
- давит всё выше 6250 Гц, куда после децимации на 5 сворачивается
шум сигма-дельта модулятора микрофона (CIC там ничего не подавляет);
- выравнивает спад CIC в полосе (задаётся желаемая АЧХ 1/H_cic).
Масштаб выбран так, чтобы постоянная '1' на входе PDM давала полную шкалу
24 бит: коэффициенты домножены на 2^23 / 50^4 и сумма подогнана точно.
24 бит: коэффициенты домножены на 2^23 / 50^3 и сумма подогнана точно.
Запуск: py -3 tools/gen_fir_coefs.py
"""
@@ -21,7 +21,7 @@ from scipy.signal import firls, freqz
# --- параметры тракта, должны совпадать с Top.vhd ---
F_PDM = 3_125_000.0 # PDM_CLK = 50 МГц / 16
R_CIC = 50 # децимация CIC
N_CIC = 4 # порядок CIC
N_CIC = 3 # порядок CIC
FS_IN = F_PDM / R_CIC # 62500 Гц на входе FIR
DECIM = 5 # децимация FIR
FS_OUT = FS_IN / DECIM # 12500 Гц
@@ -29,7 +29,7 @@ FS_OUT = FS_IN / DECIM # 12500 Гц
# --- параметры фильтра ---
NTAPS = 221 # нечётное: линейная фаза, симметрия
COEF_W = 18 # разрядность коэффициента
SHIFT = 17 # выход = (сумма произведений) >> SHIFT
SHIFT = 13 # выход = (сумма произведений) >> SHIFT
PASS = 5000.0 # граница полосы пропускания
STOP = 6250.0 # граница полосы задерживания = FS_OUT/2
WSTOP = 300.0 # вес полосы задерживания