Лабораторная 4.1 — FIR-фильтр в fixed-point арифметике¶
Цель¶
Перевести FIR-фильтр из floating-point модели в fixed-point представление и оценить, как квантование коэффициентов и отсчётов влияет на ошибку, спектр и устойчивость реализации.
Что выполняется¶
В работе студент:
- выбирает формат входных данных и коэффициентов;
- квантует коэффициенты FIR-фильтра;
- сравнивает floating-point и fixed-point выходы;
- оценивает ошибку квантования;
- фиксирует правила округления, насыщения и масштабирования.
Результат¶
После выполнения работы должны быть получены:
- таблица fixed-point форматов;
- график ошибки между float и fixed;
- спектры/АЧХ до и после квантования;
- вывод о допустимости выбранного формата для FPGA.
Что приложить к отчёту¶
- формат данных, например Q1.15;
- разрядность коэффициентов;
- accumulator width;
- правило rounding/saturation;
- максимальную и RMS-ошибку;
- инженерный вывод для перехода к RTL.
Подробная техническая часть¶
Практический вопрос¶
Какой разрядности достаточно FIR-фильтру, чтобы сохранить полезное качество сигнала и при этом остаться экономичным для реализации в FPGA?
Исполняемые файлы¶
| Среда | Файл | Результат |
|---|---|---|
| Python | blocks/block_04_simulink_and_fixed_point/python/lab_4_1_fixed_point_fir.py |
метрики + PNG-графики в docs/assets |
| MATLAB | blocks/block_04_simulink_and_fixed_point/matlab/lab_4_1_fixed_point_fir.m |
метрики + PNG-графики в docs/assets |
Запуск из корня репозитория:
python blocks/block_04_simulink_and_fixed_point/python/lab_4_1_fixed_point_fir.py
MATLAB:
matlab -batch "run('blocks/block_04_simulink_and_fixed_point/matlab/lab_4_1_fixed_point_fir.m')"
Сгенерированные Python-графики:
docs/assets/lab41_fixed_point_fir_response.png
docs/assets/lab41_fixed_point_fir_spectrum.png
docs/assets/lab41_fixed_point_fir_error.png
Сгенерированные MATLAB-графики:
docs/assets/lab41_fixed_point_fir_response_matlab.png
docs/assets/lab41_fixed_point_fir_spectrum_matlab.png
docs/assets/lab41_fixed_point_fir_error_matlab.png
Инженерный контекст¶
FIR с плавающей точкой удобен для проектирования алгоритма, но реализация в FPGA требует явных решений о:
- формате входных IQ;
- формате коэффициентов;
- ширине произведения;
- ширине аккумулятора;
- режиме округления;
- режиме насыщения;
- масштабировании выхода;
- допустимой ошибке относительно эталонной модели.
Цепочка обработки¶
flowchart LR
X[Входные IQ, формат Q] --> COEF[Квантованные коэффициенты FIR]
COEF --> MAC[Fixed-point цепочка MAC]
X --> MAC
MAC --> ROUND[Округление / масштабирование]
ROUND --> SAT[Насыщение]
SAT --> Y[Выходные IQ]
Y --> ERR[Ошибка float против fixed]
Рекомендуемые начальные форматы¶
| Сигнал | Начальный формат | Примечания |
|---|---|---|
| Входные IQ | Q1.15 | нормированные комплексные отсчёты |
| Коэффициенты FIR | Q1.15 | коэффициенты Блэкмана/оконного sinc |
| Произведение | Q2.30 | умножение Q1.15 на Q1.15 |
| Аккумулятор | Q6.30 или шире | зависит от числа коэффициентов |
| Выходные IQ | Q1.15 | после округления и насыщения |
Для FIR с N коэффициентами используйте не менее:
guard_bits = ceil(log2(N))
дополнительных бит аккумулятора.
Эталонные реализации¶
Исполняемые скрипты на Python и MATLAB реализуют один и тот же эксперимент:
- генерируют комплексный IQ-сигнал с полезным тоном, помехой и шумом;
- проектируют низкочастотный FIR с окном Блэкмана;
- квантуют входные отсчёты и коэффициенты в Q1.15;
- запускают учебную целочисленную fixed-point модель FIR;
- сравнивают выходы с плавающей и фиксированной точкой;
- считают RMS-ошибку, максимальную ошибку, SQNR, защитные биты и число насыщений;
- сохраняют графики сравнения.
Обязательные графики¶
Постройте как минимум:
- АЧХ FIR с плавающей точкой;
- АЧХ FIR с квантованными коэффициентами;
- спектр до фильтрации;
- спектр после float FIR;
- спектр после fixed FIR;
- спектр ошибки или ошибку во временной области.
Метрики¶
| Метрика | Как считать | Инженерный смысл |
|---|---|---|
| RMS-ошибка | rms(y_float - y_fixed) |
средняя ошибка реализации |
| SQNR | RMS сигнала / RMS ошибки | качество квантования |
| Максимальная абсолютная ошибка | max(abs(error)) |
наихудшее отклонение |
| Дельта полосы заграждения | полоса заграждения float против квантованной | влияние квантования коэффициентов |
| Число насыщений | число обрезанных выходных отсчётов | качество масштабирования |
Отображение на HDL¶
Fixed-point FIR отображается на потоковый блок:
input wire clk
input wire rst
input wire in_valid
input wire signed [15:0] in_i
input wire signed [15:0] in_q
output wire out_valid
output wire signed [15:0] out_i
output wire signed [15:0] out_q
Варианты реализации:
| Архитектура | Плюсы | Минусы |
|---|---|---|
| Полностью параллельный FIR | максимальная пропускная способность | много умножителей |
| MAC, мультиплексированный по времени | меньше ресурсов | ниже пропускная способность / больше управляющей логики |
| Симметричный FIR | меньше умножителей | только для симметричных коэффициентов |
Чего ожидать¶
FIR taps: 129
Cutoff: 250.0 kHz
Input/coefficient format: Q1.15
Recommended FIR guard bits: 8
RMS error: 3.975029e-05
Max abs error: 7.540183e-05
SQNR: 83.51 dB
Saturation count: 0
- SQNR 83,5 дБ это весь путь с фиксированной точкой (округление входа, коэффициентов и выхода) против фильтра с плавающей точкой. Максимальная ошибка 7,5e-5 это около 2,5 LSB Q1.15 (1 LSB = 3,05e-5).
- Ноль насыщений: вход нормирован к пику 0,85, а коэффициенты к единичному усилению на постоянном токе, поэтому выход не может превысить полную шкалу.
- 8 защитных бит = ceil(log2(129)). С этими коэффициентами сумма |h| равна 1,81, поэтому реальный худший рост меньше 1 бита; правило: надёжная верхняя граница и ничего не стоит в DSP48 с 48-битным аккумулятором.
- Полосу задерживания задаёт квантование коэффициентов: АЧХ с коэффициентами Q1.15 достигает -71,0 дБ начиная с 400 кГц против -89,7 дБ для коэффициентов с плавающей точкой (тот же фильтр, что в Lab 3.2).
Упражнения¶
- Измените
q_fractional_bitsи перезапустите. Приsample_count = 8192(чтобы цикл на чистом Python работал быстро) SQNR составил 83,5, 80,7, 75,9, 66,4 и 63,9 дБ для 15, 14, 13, 12 и 11 бит и 49,3 дБ при 9. Квантование только коэффициентов (данные с плавающей точкой) даёт почти те же числа (84,1 дБ при 15 битах), значит, доминируют коэффициенты. Поэтому и шаги нерегулярны, а не 6,02 дБ на бит: ошибка коэффициентов это одно фиксированное детерминированное изменение фильтра, а не белый шум, добавленный к каждому отсчёту. - Проквантуйте только коэффициенты и постройте полосу задерживания. Наблюдаемые пики начиная с 400 кГц: -71,0 дБ (15 дробных бит), -59,6 дБ (13), -47,9 дБ (11), -35,3 дБ (9), снова около 6 дБ на бит. Посчитайте коэффициенты, округлившиеся в ноль (ненулевых 115, 107, 93, 73 из 129). Что дешевле для требования -80 дБ: больше бит коэффициентов или более короткий фильтр с большими коэффициентами?
- Увеличивайте вход, пока счётчик насыщений не станет ненулевым. Что происходит с SQNR и почему несколько насыщений гораздо хуже нескольких LSB ошибки округления?
Ответы (проверены запуском скрипта лабораторной)
- Числа приведены в самом упражнении; суть в неравномерных шагах: ошибка коэффициентов это одно фиксированное изменение характеристики фильтра, поэтому ошибка зависит от того, как это изменение ложится на конкретный сигнал, а не от равномерной шумовой полки.
- Два бита коэффициентов. 17 дробных бит дают пик полосы подавления −84,9 дБ, а 18-битный коэффициент всё ещё помещается в 18-битный порт DSP48E1 без дополнительных затрат. Более короткий фильтр имеет крупнее отводы, но шире переход и мельче полосу подавления, поэтому удаляется от −80 дБ, а не приближается.
- Увеличение пика входа с 0,85 до 1,0 ничего не меняет (SQNR 83,6 дБ). При 1,2 SQNR обваливается до 33,1 дБ, а счётчик насыщений по-прежнему 0: входной квантователь молча обрезает отсчёты выше полной шкалы, а счётчик следит только за выходом. При 1,5 счётчик показывает 44 события и SQNR 20,3 дБ; при 2,0: 4911 событий и 11,7 дБ. Ошибка округления не больше половины МЗР; обрезанный отсчёт ошибается на всё превышение, поэтому горстка таких отсчётов перевешивает миллионы ошибок округления. И счётчик видит переполнения только там, где он поставлен.
Чек-лист отчёта (расширенный)¶
- Указаны форматы входа, коэффициентов, произведения, аккумулятора и выхода.
- Объяснено квантование коэффициентов.
- Построены АЧХ float и квантованного FIR.
- Сравнены выходные спектры.
- Вычислены RMS-ошибка и SQNR.
- Подсчитаны события насыщения.
- Оценены защитные биты аккумулятора.
- Указано, готов ли FIR для HDL.
Шаблон инженерного вывода¶
Выбранный формат FIR ______ даёт SQNR = ____ дБ и число насыщений = ____.
Квантование коэффициентов меняет подавление в полосе заграждения примерно на ____ дБ.
Аккумулятору требуется не менее ____ защитных бит для ____ коэффициентов.
Эта конфигурация готова / не готова к реализации в HDL, потому что ______.