Порядок 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:
@@ -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 # вес полосы задерживания
|
||||
|
||||
Reference in New Issue
Block a user