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

Лабораторная 4.2 — Цифровой смеситель в fixed-point арифметике

Цель

Реализовать цифровое смешение IQ-сигнала в fixed-point арифметике и оценить ошибки, возникающие из-за квантования NCO, sin/cos таблицы и комплексного умножения.

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

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

  1. задаёт частоту цифрового гетеродина;
  2. выбирает fixed-point формат для IQ и sin/cos;
  3. выполняет комплексное умножение в fixed-point;
  4. сравнивает результат с floating-point эталоном;
  5. оценивает ошибку амплитуды, фазы и спектральные побочные составляющие.

Результат

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

  • таблица форматов данных;
  • спектры до/после смешения;
  • сравнение float и fixed реализаций;
  • оценка пригодности формата для Verilog/NCO реализации.

Что приложить к отчёту

  • частоту дискретизации;
  • частоту NCO;
  • разрядность phase accumulator и LUT;
  • ошибку fixed-point реализации;
  • вывод о рисках при переносе в RTL.

Подробная техническая часть

Практический вопрос

Сколько бит нужно в NCO и комплексном умножителе, чтобы сдвинуть IQ-сигнал без недопустимых побочных составляющих или ухудшения EVM?

Исполняемые файлы

Среда Файл Результат
Python blocks/block_04_simulink_and_fixed_point/python/lab_4_2_fixed_point_digital_mixer.py метрики + PNG-графики в docs/assets
MATLAB blocks/block_04_simulink_and_fixed_point/matlab/lab_4_2_fixed_point_digital_mixer.m метрики + PNG-графики в docs/assets

Запуск из корня репозитория:

python blocks/block_04_simulink_and_fixed_point/python/lab_4_2_fixed_point_digital_mixer.py

MATLAB:

matlab -batch "run('blocks/block_04_simulink_and_fixed_point/matlab/lab_4_2_fixed_point_digital_mixer.m')"

Сгенерированные Python-графики:

docs/assets/lab42_fixed_point_mixer_spectrum.png
docs/assets/lab42_fixed_point_mixer_error.png
docs/assets/lab42_nco_frequency_resolution.png

Сгенерированные MATLAB-графики:

docs/assets/lab42_fixed_point_mixer_spectrum_matlab.png
docs/assets/lab42_fixed_point_mixer_error_matlab.png
docs/assets/lab42_nco_frequency_resolution_matlab.png

Инженерный контекст

Цифровой микшер сдвигает комплексный сигнал основной полосы, умножая его на комплексный генератор:

y[n] = x[n] * exp(j * 2*pi*f_shift*n/Fs)

В железе это превращается в:

NCO / DDS -> LUT sin/cos или CORDIC -> комплексный умножитель -> округление/насыщение

Цепочка обработки

flowchart LR
    X[Входные IQ] --> CMUL[Комплексный умножитель]
    NCO[NCO sin/cos] --> CMUL
    CMUL --> ROUND[Округление / масштабирование]
    ROUND --> SAT[Насыщение]
    SAT --> Y[Сдвинутые IQ]
    Y --> FFT[Анализ спектра и побочных составляющих]

Рекомендуемые начальные форматы

Сигнал Начальный формат Примечания
Входные IQ Q1.15 нормированный комплексный вход
NCO sin/cos Q1.15 простой формат, совместимый с LUT
Члены произведения Q2.30 результат каждого вещественного умножения
Сумма/разность Q3.30 накопление комплексного умножения
Выходные IQ Q1.15 после округления и насыщения
Аккумулятор фазы 24–32 бита зависит от разрешения по частоте и целевого уровня побочных составляющих

Комплексное умножение

Для:

x = I + jQ
w = cos(phi) + j sin(phi)

Выход микшера:

y_i = I*cos(phi) - Q*sin(phi)
y_q = I*sin(phi) + Q*cos(phi)

Эталонные реализации

Исполняемые скрипты на Python и MATLAB реализуют один и тот же эксперимент:

  1. генерируют комплексный IQ-тон с аддитивным шумом;
  2. генерируют генератор NCO/DDS с аккумулятором фазы;
  3. запускают микшер с плавающей точкой;
  4. запускают учебный комплексный умножитель Q1.15 в фиксированной точке;
  5. сравнивают спектры с плавающей и фиксированной точкой;
  6. считают ошибку частотного сдвига, RMS-ошибку, EVM, оценку побочных составляющих и число насыщений;
  7. сохраняют графики сравнения.

Обсуждение NCO / DDS

В HDL генератор обычно строится как NCO:

phase[n+1] = phase[n] + phase_increment
phase_increment = round(f_shift / Fs * 2^P)

где P: ширина аккумулятора фазы.

Разрешение по частоте:

delta_f = Fs / 2^P
Ширина фазы Разрешение по частоте при Fs = 2,4 МС/с Практическое замечание
16 бит 36,6 Гц достаточно для простых демонстраций
24 бита 0,143 Гц хорошо для большинства работ
32 бита 0,00056 Гц распространённый надёжный выбор

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

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

  1. входной спектр;
  2. спектр выхода микшера с плавающей точкой;
  3. спектр выхода микшера в фиксированной точке;
  4. модуль ошибки float против fixed;
  5. необязательное увеличение побочных составляющих около несущей;
  6. необязательное созвездие до/после для модулированных сигналов.

Метрики

Метрика Как считать Инженерный смысл
Ошибка частотного сдвига измеренный пик минус ожидаемый пик точность приращения фазы NCO
RMS-ошибка rms(y_float - y_fixed) средняя ошибка реализации
EVM RMS-ошибка, нормированная на RMS сигнала влияние на качество модуляции
Уровень побочных составляющих крупнейшая нежелательная спектральная компонента артефакты NCO и квантования
Число насыщений обрезанные выходные отсчёты качество масштабирования

Отображение на HDL

Предлагаемый потоковый интерфейс:

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

Внутренние блоки:

flowchart LR
    PHASE[Аккумулятор фазы] --> LUT[LUT sin/cos или CORDIC]
    LUT --> CMUL[Комплексный умножитель]
    IN[Входные IQ] --> CMUL
    CMUL --> SCALE[Округление / масштабирование]
    SCALE --> OUT[Выходные IQ]

Чего ожидать

Input tone: 120.0 kHz
Requested shift: -120.0 kHz
Actual NCO shift: -120.000029 kHz
Phase bits: 24
NCO frequency resolution: 0.143051 Hz
Measured output peak: 0.000 Hz
Frequency shift error: 0.000 Hz
RMS error: 1.086899e-03
EVM: 0.1417 %
Largest spur estimate: -70.12 dBc
Saturation count: 0

Два из этих чисел означают не то, чем кажутся:

  • EVM 0,14 % это не округление Q1.15. 24-битный шаг фазы даёт -120 000,0286 Гц вместо -120 000 Гц. За 32 768 отсчётов (13,7 мс) эта ошибка 0,0286 Гц накапливает около 0,0025 рад фазы относительно идеального эталона с плавающей точкой, и этот дрейф и есть EVM. При phase_bits = 32 EVM падает до 0,0027 %. Спектр этого не покажет: 0,0286 Гц это глубоко внутри одного FFT-бина шириной 73 Гц, поэтому «Frequency shift error: 0.000 Hz».
  • «Спур» -70,12 дБc это самый высокий бин шума, а не паразитная составляющая смесителя. Вход содержит noise_rms = 0.01. При noise_rms = 0 наибольший спур равен -98,2 дБc: реальный предел Q1.15 для этого смесителя.

Упражнения

  1. Установите phase_bits = 16. Ошибка частоты становится -7,32 Гц, EVM: 35,9 %, при этом наибольший спур по-прежнему -69,1 дБc, а пик всё так же попадает в бин 0 Гц. Объясните, почему проверка только по спектру приняла бы такой NCO и что измеряет EVM относительно эталона, чего не измеряет спектр.
  2. Установите noise_rms = 0 и q_fractional_bits = 11. Наибольший спур растёт с -98,2 до -79,6 дБc. Близко ли это к 6 дБ на бит? Какую часть смесителя (слова данных или слова синуса/косинуса) вы бы расширили в первую очередь?
  3. Сколько бит фазы нужно, чтобы при 2,4 MS/s накопленная ошибка фазы сдвига оставалась ниже 0,01 рад на пакете длительностью 100 мс?
Ответы (проверены запуском скрипта лабораторной)
  1. Ошибка частоты 7,32 Гц сдвигает выходной пик гораздо меньше чем на один бин FFT (здесь 73 Гц), а паразиты определяются квантованием амплитуды, которое не изменилось: поэтому спектр выглядит идеально. Но ошибка накапливается как линейный набег фазы: за 32 768 отсчётов при 2,4 MS/s он достигает 2π·7,32·0,0137 ≈ 0,63 рад, что и даёт EVM 35,9 %. EVM относительно эталона сравнивает отсчёт за отсчётом, поэтому видит фазу и время, которые амплитудный спектр отбрасывает.
  2. С −98,2 до −79,6 дБн это 18,6 дБ на 4 бита, около 4,7 дБ на бит: близко к 6 дБ, но меньше. Расширять сначала слова данных: если 11 бит только у данных, худший паразит −78,7 дБн, если только у слов синуса/косинуса это −86,4 дБн.
  3. Округление приращения фазы оставляет ошибку частоты не больше Fs / 2^(B+1). Чтобы 2π · Δf · 0,1 с было меньше 0,01 рад, нужно Δf < 0,0159 Гц, то есть 2^(B+1) > 2,4 МГц / 0,0159 Гц ≈ 1,5·10⁸: 27 бит (ошибка 0,0089 Гц, 0,0056 рад). 26 бит дают 0,0179 Гц и 0,011 рад, чуть больше нормы. 32-битный аккумулятор даёт большой запас.

Чек-лист отчёта (расширенный)

  • Указаны частота дискретизации, частота входного тона и частота сдвига.
  • Указаны форматы входа, NCO, произведения и выхода.
  • Вычислены приращение фазы и разрешение по частоте.
  • Сравнены спектры float и fixed.
  • Оценена ошибка частотного сдвига.
  • Вычислены RMS-ошибка и EVM.
  • Оценён уровень побочных составляющих.
  • Подсчитаны события насыщения.
  • Объяснено, что предпочтительнее: LUT, CORDIC или прямой DDS.

Шаблон инженерного вывода

Выбранный формат микшера ______ даёт EVM = ____ % и число насыщений = ____.
Ширина аккумулятора фазы ____ даёт разрешение по частоте ____ Гц при Fs = ____ Гц.
Крупнейшая наблюдаемая побочная составляющая — примерно ____ дБн.
Эта конфигурация готова / не готова к HDL, потому что ______.