Перейти к содержанию

Лабораторная 4.1 — FIR-фильтр в fixed-point арифметике

Цель

Перевести FIR-фильтр из floating-point модели в fixed-point представление и оценить, как квантование коэффициентов и отсчётов влияет на ошибку, спектр и устойчивость реализации.

Что выполняется

В работе студент:

  1. выбирает формат входных данных и коэффициентов;
  2. квантует коэффициенты FIR-фильтра;
  3. сравнивает floating-point и fixed-point выходы;
  4. оценивает ошибку квантования;
  5. фиксирует правила округления, насыщения и масштабирования.

Результат

После выполнения работы должны быть получены:

  • таблица 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 реализуют один и тот же эксперимент:

  1. генерируют комплексный IQ-сигнал с полезным тоном, помехой и шумом;
  2. проектируют низкочастотный FIR с окном Блэкмана;
  3. квантуют входные отсчёты и коэффициенты в Q1.15;
  4. запускают учебную целочисленную fixed-point модель FIR;
  5. сравнивают выходы с плавающей и фиксированной точкой;
  6. считают RMS-ошибку, максимальную ошибку, SQNR, защитные биты и число насыщений;
  7. сохраняют графики сравнения.

Обязательные графики

Постройте как минимум:

  1. АЧХ FIR с плавающей точкой;
  2. АЧХ FIR с квантованными коэффициентами;
  3. спектр до фильтрации;
  4. спектр после float FIR;
  5. спектр после fixed FIR;
  6. спектр ошибки или ошибку во временной области.

Метрики

Метрика Как считать Инженерный смысл
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).

Упражнения

  1. Измените 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 дБ на бит: ошибка коэффициентов это одно фиксированное детерминированное изменение фильтра, а не белый шум, добавленный к каждому отсчёту.
  2. Проквантуйте только коэффициенты и постройте полосу задерживания. Наблюдаемые пики начиная с 400 кГц: -71,0 дБ (15 дробных бит), -59,6 дБ (13), -47,9 дБ (11), -35,3 дБ (9), снова около 6 дБ на бит. Посчитайте коэффициенты, округлившиеся в ноль (ненулевых 115, 107, 93, 73 из 129). Что дешевле для требования -80 дБ: больше бит коэффициентов или более короткий фильтр с большими коэффициентами?
  3. Увеличивайте вход, пока счётчик насыщений не станет ненулевым. Что происходит с SQNR и почему несколько насыщений гораздо хуже нескольких LSB ошибки округления?
Ответы (проверены запуском скрипта лабораторной)
  1. Числа приведены в самом упражнении; суть в неравномерных шагах: ошибка коэффициентов это одно фиксированное изменение характеристики фильтра, поэтому ошибка зависит от того, как это изменение ложится на конкретный сигнал, а не от равномерной шумовой полки.
  2. Два бита коэффициентов. 17 дробных бит дают пик полосы подавления −84,9 дБ, а 18-битный коэффициент всё ещё помещается в 18-битный порт DSP48E1 без дополнительных затрат. Более короткий фильтр имеет крупнее отводы, но шире переход и мельче полосу подавления, поэтому удаляется от −80 дБ, а не приближается.
  3. Увеличение пика входа с 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, потому что ______.