Лабораторная 4.2 — Цифровой смеситель в fixed-point арифметике¶
Цель¶
Реализовать цифровое смешение IQ-сигнала в fixed-point арифметике и оценить ошибки, возникающие из-за квантования NCO, sin/cos таблицы и комплексного умножения.
Что выполняется¶
В работе студент:
- задаёт частоту цифрового гетеродина;
- выбирает fixed-point формат для IQ и sin/cos;
- выполняет комплексное умножение в fixed-point;
- сравнивает результат с floating-point эталоном;
- оценивает ошибку амплитуды, фазы и спектральные побочные составляющие.
Результат¶
После выполнения работы должны быть получены:
- таблица форматов данных;
- спектры до/после смешения;
- сравнение 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 реализуют один и тот же эксперимент:
- генерируют комплексный IQ-тон с аддитивным шумом;
- генерируют генератор NCO/DDS с аккумулятором фазы;
- запускают микшер с плавающей точкой;
- запускают учебный комплексный умножитель Q1.15 в фиксированной точке;
- сравнивают спектры с плавающей и фиксированной точкой;
- считают ошибку частотного сдвига, RMS-ошибку, EVM, оценку побочных составляющих и число насыщений;
- сохраняют графики сравнения.
Обсуждение 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 Гц | распространённый надёжный выбор |
Обязательные графики¶
Постройте как минимум:
- входной спектр;
- спектр выхода микшера с плавающей точкой;
- спектр выхода микшера в фиксированной точке;
- модуль ошибки float против fixed;
- необязательное увеличение побочных составляющих около несущей;
- необязательное созвездие до/после для модулированных сигналов.
Метрики¶
| Метрика | Как считать | Инженерный смысл |
|---|---|---|
| Ошибка частотного сдвига | измеренный пик минус ожидаемый пик | точность приращения фазы 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 = 32EVM падает до 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 для этого смесителя.
Упражнения¶
- Установите
phase_bits = 16. Ошибка частоты становится -7,32 Гц, EVM: 35,9 %, при этом наибольший спур по-прежнему -69,1 дБc, а пик всё так же попадает в бин 0 Гц. Объясните, почему проверка только по спектру приняла бы такой NCO и что измеряет EVM относительно эталона, чего не измеряет спектр. - Установите
noise_rms = 0иq_fractional_bits = 11. Наибольший спур растёт с -98,2 до -79,6 дБc. Близко ли это к 6 дБ на бит? Какую часть смесителя (слова данных или слова синуса/косинуса) вы бы расширили в первую очередь? - Сколько бит фазы нужно, чтобы при 2,4 MS/s накопленная ошибка фазы сдвига оставалась ниже 0,01 рад на пакете длительностью 100 мс?
Ответы (проверены запуском скрипта лабораторной)
- Ошибка частоты 7,32 Гц сдвигает выходной пик гораздо меньше чем на один бин FFT (здесь 73 Гц), а паразиты определяются квантованием амплитуды, которое не изменилось: поэтому спектр выглядит идеально. Но ошибка накапливается как линейный набег фазы: за 32 768 отсчётов при 2,4 MS/s он достигает
2π·7,32·0,0137 ≈ 0,63 рад, что и даёт EVM 35,9 %. EVM относительно эталона сравнивает отсчёт за отсчётом, поэтому видит фазу и время, которые амплитудный спектр отбрасывает. - С −98,2 до −79,6 дБн это 18,6 дБ на 4 бита, около 4,7 дБ на бит: близко к 6 дБ, но меньше. Расширять сначала слова данных: если 11 бит только у данных, худший паразит −78,7 дБн, если только у слов синуса/косинуса это −86,4 дБн.
- Округление приращения фазы оставляет ошибку частоты не больше
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, потому что ______.