Проектирование отладочного сигнала для SDR-стенда¶
Этот материал дополняет аппаратную отладку практическим приёмом: отладочный сигнал должен быть спроектирован так, чтобы его было легко найти в эфире, измерить и разобрать offline.
В реальном SDR-эксперименте недостаточно просто передать BPSK/QPSK/OFDM-поток. Если сигнал не найден, спектр выглядит странно или BER не сходится, нужен специальный диагностический формат. Он помогает ответить на вопросы:
- есть ли вообще передача;
- на какой частоте она появилась;
- не перепутаны ли I/Q;
- правильно ли работает NCO/mixer/FIR/интерполяция;
- где начинается пакет;
- какая символьная скорость и timing;
- есть ли clipping, перегруз или неверный gain;
- совпадает ли принятый payload с ожидаемым.
Главная идея¶
Сигнал для отладки должен быть не только полезной нагрузкой,
но и диагностическим инструментом.
Поэтому в курсе полезно иметь отдельный debug waveform format — учебный кадр, который можно передавать через Zynq/AD9363 и наблюдать через RTL-SDR/HDSDR или другую независимую приёмную цепочку.
Рекомендуемый формат отладочного кадра¶
silence
lead-in tone
preamble
sync word
header
training sequence
payload / PRBS
CRC
silence
| Поле | Назначение |
|---|---|
silence |
разделяет пакеты на waterfall и позволяет измерить noise floor |
lead-in tone |
помогает быстро найти передачу по спектру |
preamble |
используется для корреляционного поиска начала пакета |
sync word |
фиксирует точное начало кадра и снижает ложные срабатывания |
header |
задаёт режим, длину, номер кадра и параметры теста |
training sequence |
помогает оценить CFO, фазу, timing, SNR/EVM |
payload / PRBS |
проверяет битовый тракт и BER |
CRC |
отделяет обнаружение пакета от правильного приёма |
Диагностический маршрут¶
flowchart LR
MODEL[Model waveform] --> FIELDS[Frame fields]
FIELDS --> TX[Zynq / FPGA TX]
TX --> RF[AD9363 RF path]
RF --> RX[RTL-SDR / receiver]
RX --> IQ[IQ recording]
IQ --> DETECT[Detect preamble / sync]
DETECT --> METRICS[CFO / SNR / EVM / BER]
METRICS --> REPORT[Debug report]
REPORT -. update waveform .-> MODEL
Преамбула¶
Преамбула — известная последовательность перед полезной частью кадра. Она нужна для поиска сигнала и грубой синхронизации.
| Тип преамбулы | Где полезна | Что проверяет |
|---|---|---|
| Чистый тон | первые RF-опыты | частоту, уровень, наличие передачи |
101010... |
BPSK/FSK/простые пакеты | символьную скорость и timing |
| Barker code | короткие учебные пакеты | корреляционный пик при малой длине |
| PN/m-sequence | шумоподобный поиск | устойчивый корреляционный поиск |
| Zadoff-Chu | синхронизация и оценка сдвигов | хороший корреляционный профиль |
| Chirp/sweep | визуальный поиск на waterfall | полосу и частотное направление |
Для первых лабораторий достаточно начать с простого варианта:
preamble_bits = 10101010101010101010101010101010
Позже можно перейти к PN-последовательности или Barker/Zadoff-Chu.
Sync word¶
После преамбулы полезно передавать уникальное слово синхронизации:
sync_word = 0xA5A55A5A
Оно помогает:
- отличить настоящий пакет от случайного корреляционного пика;
- найти точное начало header/payload;
- выявить перепутанный порядок битов;
- выявить перепутанный порядок байтов;
- проверить инверсию битового потока.
Для учебного курса удобно использовать несколько вариантов и показать, как они выглядят при ошибках bit order/endian.
Header отладочного кадра¶
Минимальный header:
magic uint32 0xA5A55A5A
version uint8
mode_id uint8
frame_id uint32
payload_len uint16
pattern_id uint8
flags uint8
| Поле | Зачем нужно |
|---|---|
version |
позволяет менять формат кадра без путаницы |
mode_id |
показывает, какой тест был включён |
frame_id |
помогает находить потери и дубли кадров |
payload_len |
даёт парсеру длину данных |
pattern_id |
описывает payload: zeros, PRBS, counter, ASCII |
flags |
режимы: inversion, loopback, pilot enabled и т.д. |
Известная полезная нагрузка¶
Для отладки payload должен быть предсказуемым.
| Payload | Что диагностирует |
|---|---|
0x00 0x00 ... |
DC offset, reset, паразитные составляющие |
0xFF 0xFF ... |
насыщение, инверсию логики |
0xAA 0xAA ... |
тайминг и чередование битов |
0xCC 0xCC ... |
группировку битов и символов |
счётчик 0,1,2,3... |
потерю слов, кадров, байтовый порядок |
ASCII ZYNQ-SDR-TEST |
быстрый визуальный контроль декодирования |
| PRBS с seed | BER и воспроизводимый шумоподобный поток |
Хороший минимальный payload для курса:
frame_id
counter_0
counter_1
counter_2
...
crc16
PRBS и seed¶
Для BER-тестов полезна PRBS-последовательность. Но seed должен быть явно сохранён:
prbs_seed = 0x12345678
Это позволяет:
- восстановить ожидаемый payload offline;
- посчитать BER;
- повторить эксперимент;
- сравнить MATLAB/fixed-point/RTL/hardware результат.
Pilot tone¶
Пилотный тон можно добавлять как отдельный диагностический элемент.
pilot_offset = +50 kHz
pilot_level = -20 dBc относительно полезного сигнала
Он помогает:
- быстро найти передачу на спектре;
- оценить CFO и дрейф;
- проверить знак частотного сдвига;
- контролировать gain staging;
- увидеть перегруз по появлению гармоник и побочных составляющих.
Важно: пилот не должен мешать полезному сигналу. В учебном режиме его можно включать отдельно через mode_id или flags.
Training sequence¶
Training sequence — известные символы перед payload. Она полезна для оценки канала и синхронизации.
Для BPSK:
+1, +1, -1, +1, -1, -1, +1, ...
Для QPSK можно использовать известный комплексный паттерн:
(+1 + j), (-1 + j), (-1 - j), (+1 - j), ...
Что можно оценить:
- CFO;
- фазовый сдвиг;
- timing offset;
- SNR;
- EVM;
- IQ imbalance;
- частотную характеристику канала;
- ошибку масштаба fixed-point/RTL.
Пакетная передача с паузами¶
Для первых RF-лабораторий не стоит передавать сигнал непрерывно. Лучше использовать пачки:
100 ms silence
packet
100 ms silence
packet
100 ms silence
packet
Это даёт:
- видимые пакеты на waterfall;
- измерение шума до и после пакета;
- удобный поиск начала кадра;
- проверку AGC-поведения;
- простое сопоставление TX-log и RX IQ-записи.
Амплитудная лестница¶
Амплитудная лестница помогает подобрать уровни и найти перегруз:
packet at -30 dBFS
packet at -24 dBFS
packet at -18 dBFS
packet at -12 dBFS
packet at -6 dBFS
Что искать:
- clipping;
- появление гармоник;
- рост noise floor;
- изменение BER/EVM от уровня;
- границу нормальной работы ADC/RF frontend;
- влияние внешнего аттенюатора.
Этот режим особенно полезен для стенда с управляемым цифровым аттенюатором.
Частотная лестница¶
Частотная лестница проверяет частотный план и знаки переносов:
-200 kHz
-100 kHz
0 kHz
+100 kHz
+200 kHz
Она помогает обнаружить:
- неверный знак NCO;
- перепутанные I/Q;
- зеркальный спектр;
- ошибку частотной оси;
- неверную интерпретацию sample rate;
- неправильные DUC/DDC настройки.
I/Q diagnostic modes¶
Эти режимы нужно заложить обязательно, потому что ошибки I/Q очень часты в SDR.
| Режим | Что диагностирует |
|---|---|
I = tone, Q = 0 |
канал I, зеркала, неправильный complex path |
I = 0, Q = tone |
канал Q, знак квадратуры |
I = Q |
поворот/зеркалирование созвездия |
Q = -I |
инверсию знака одного канала |
exp(+jωt) |
положительное комплексное смещение |
exp(-jωt) |
отрицательное комплексное смещение |
| swap I/Q flag | проверку защиты от перепутанного порядка |
Если студент видит сигнал «не с той стороны» спектра, первый подозреваемый — знак комплексного тона или порядок I/Q.
Two-tone test¶
Двухтональный тест:
f1 = -100 kHz
f2 = +100 kHz
Полезен для проверки:
- линейности;
- интермодуляции;
- clipping;
- симметрии спектра;
- влияния gain;
- паразитных составляющих.
При перегрузе могут появляться дополнительные пики:
2f1 - f2
2f2 - f1
f1 + f2
Multitone / comb signal¶
Гребёнка тонов:
-300 kHz, -200 kHz, -100 kHz, 0, +100 kHz, +200 kHz, +300 kHz
Используется для:
- проверки полосы;
- оценки АЧХ;
- поиска завала на краях;
- проверки FIR/CIC/интерполяции;
- проверки RF bandwidth AD9363;
- сравнения модели и реальной IQ-записи.
Режимы передатчика¶
В PS/FPGA желательно иметь управляемый tx_mode:
tx_mode = 0: off
tx_mode = 1: pure tone
tx_mode = 2: two-tone
tx_mode = 3: multitone / comb
tx_mode = 4: preamble only
tx_mode = 5: repeated sync word
tx_mode = 6: PRBS packet
tx_mode = 7: amplitude sweep
tx_mode = 8: frequency sweep
tx_mode = 9: full debug packet
Это позволяет переключать отладку без пересборки bitstream.
Минимальная карта регистров¶
| Регистр | Назначение |
|---|---|
tx_mode |
выбор отладочного режима |
frame_period_ms |
пауза между пакетами |
tone_offset_hz |
смещение одиночного тона |
pilot_enable |
включение пилота |
pilot_offset_hz |
смещение пилота |
amplitude_step_db |
шаг амплитудной лестницы |
frequency_step_hz |
шаг частотной лестницы |
prbs_seed |
seed для BER-теста |
frame_id_reset |
сброс счётчика кадров |
status_frames_sent |
число отправленных кадров |
Что должен сохранять эксперимент¶
Для воспроизводимости каждая IQ-запись должна сопровождаться metadata:
debug_waveform:
mode_id: 9
frame_format_version: 1
preamble: alternating_1010
sync_word: 0xA5A55A5A
payload_pattern: prbs
prbs_seed: 0x12345678
frame_period_ms: 100
pilot_enabled: true
pilot_offset_hz: 50000
tx_gain_db: -20
external_attenuation_db: 40
sample_rate_sps: 2400000
rf_center_frequency_hz: 915000000
Минимальные критерии успеха¶
Эксперимент с отладочным сигналом считается успешным, если:
- сигнал виден на waterfall в ожидаемой полосе;
- lead-in tone или packet burst обнаруживаются автоматически;
- корреляция по преамбуле даёт устойчивый пик;
- sync word найден в правильной позиции;
frame_idрастёт без необъяснимых пропусков;- CRC проходит для достаточной доли кадров;
- измеренные CFO/SNR/EVM/BER сохранены в отчёте;
- результат можно повторить по metadata и seed.
Связь с лабораториями курса¶
Этот материал полезен сразу в нескольких блоках:
- Block 5: заранее заложить
tx_mode, debug mux и testbench для режимов; - Block 6: найти сигнал в RF и проверить уровни;
- Block 7: проверить TX/RX chain;
- Block 8: использовать преамбулу и training sequence для синхронизации;
- Block 9: записать IQ и выполнить offline replay;
- Block 11: собрать всё в полноценный end-to-end SDR-проект.
Вывод¶
Преамбула — только первый шаг. Хороший SDR-стенд должен иметь целый набор отладочных сигналов: tone, preamble, sync word, PRBS, pilot, two-tone, multitone, amplitude sweep, frequency sweep и I/Q diagnostic modes.
Именно эти режимы превращают эксперимент из угадывания в инженерную процедуру:
видим сигнал → находим пакет → проверяем sync → измеряем ошибки → доказываем работу тракта