Лабораторная 8.20 — CSS: chirp-сигнал и кодирование символа¶
Цель¶
Построить базовый сигнальный тракт chirp spread spectrum (CSS):
- сформировать комплексный базовый upchirp;
- закодировать целочисленный символ циклическим сдвигом chirp;
- исследовать мгновенную частоту и частотно-временное представление;
- выполнить dechirp умножением на комплексно-сопряжённый опорный chirp;
- убедиться, что после dechirp энергия символа концентрируется в одном отсчёте FFT.
Лабораторная реализует учебный CSS-сигнал. Это ещё не полный LoRa-совместимый пакетный PHY: преамбула, заголовок, whitening, перемежение, помехоустойчивое кодирование и CRC здесь не реализуются. Полный LoRa-совместимый PHY: пакетную структуру, hard/soft-декодирование, проверенное на записанном SX1262 IQ, и позиционирование по времени прихода (ToA/TDoA) с FPGA-трактом: развивает сопутствующий проект zynq-lora-phy.
Основные соотношения¶
Для spreading factor SF и полосы BW:
N = 2^SF
Ts = 2^SF / BW
При SF=7 и BW=125 кГц символ содержит 128 chips и длится 1,024 мс.
Цепочка обработки¶
flowchart LR
IDX[номер символа] --> SHIFT[циклический сдвиг chirp]
REF[опорный upchirp] --> SHIFT
SHIFT --> TX[CSS-символ]
TX --> MUL[умножение на сопряжённый upchirp]
REF --> CONJ[комплексное сопряжение]
CONJ --> MUL
MUL --> FFT[FFT]
FFT --> PEAK[поиск максимума]
Запуск¶
python blocks/block_08_modulation_and_synchronization/python/lab_8_20_css_waveform.py
Генерируемые артефакты¶
docs/assets/lab820_css_upchirp_frequency.png
docs/assets/lab820_css_symbol_spectrogram.png
docs/assets/lab820_css_dechirped_fft.png
docs/assets/lab820_css_metrics.json
Что проверить¶
- комплексная огибающая остаётся постоянной с точностью вычислений;
- мгновенная частота upchirp проходит заданную полосу;
- циклический сдвиг меняет передаваемый символ, но не мощность огибающей;
- после dechirp сигнал превращается в комплексный тон;
- максимум FFT в идеальном случае соответствует заданному номеру символа.
Инженерные вопросы¶
- Почему постоянная огибающая удобна для нелинейного или ограниченного по мощности передатчика?
- Что изменится, если частота дискретизации выше полосы CSS-сигнала?
- Почему умножение chirp на сопряжённый опорный chirp превращает его в тон?
- Какие блоки естественно переносить в FPGA: chirp NCO, комплексный умножитель, FFT или поиск максимума?
Что включить в отчёт¶
- Значения
SF,BW, частоты дискретизации и длительности символа. - График мгновенной частоты.
- Частотно-временную диаграмму символа.
- FFT после dechirp и найденный bin.
- Явное указание, что реализован учебный CSS-тракт, а не полный LoRa PHY.
Чего ожидать¶
При SF = 7, BW = 125 кГц: 128 чипов на символ, 1,024 мс на символ, ошибка постоянства огибающей на уровне точности плавающей запятой (2e-16). Символ 37 после сжатия чирпа попадает в бин FFT 37, а исходный восходящий чирп имеет пик в бине 0. В этом случае без шума отношение пика ко второму (192 дБ) отражает лишь численную точность; что с ним делает шум, показывает Лабораторная 8.21.
Упражнения¶
- Замените
SFна 9. Сколько чипов и сколько миллисекунд на символ? Сколько бит несёт один символ? - Закодируйте символы 127 и 0. Куда они попадают после сжатия чирпа и почему соседние символы лежат в соседних бинах?
- Умножьте принятый чирп на небольшой частотный сдвиг (четверть бина). Что происходит с бином пика и его высотой?
Ответы (проверены запуском скрипта лабораторной)
2^9 = 512чипов,512 / 125 кГц = 4,096 мсна символ, 9 бит на символ. Каждый шаг SF удваивает длительность символа и добавляет один бит: скорость падает, чувствительность растёт.- Символ 0 после снятия чирпа попадает в бин 0, символ 127 в бин 127. Символ CSS это базовый чирп, циклически сдвинутый на своё значение; после умножения на сопряжённый базовый чирп сдвиг на
mчипов становится тоном вmбинах, поэтому соседние символы: соседние частоты. - Смещение на четверть бина оставляет пик в том же бине (37), но понижает его на 0,91 дБ, а соседний бин поднимается до уровня на 9,5 дБ ниже пика: тон теперь между бинами (гребешковые потери, как в Лабораторной 3.1). При половине бина оба бина сравнялись бы это предел, который измеряет Лабораторная 8.21.