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

Лабораторная 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 в идеальном случае соответствует заданному номеру символа.

Инженерные вопросы

  1. Почему постоянная огибающая удобна для нелинейного или ограниченного по мощности передатчика?
  2. Что изменится, если частота дискретизации выше полосы CSS-сигнала?
  3. Почему умножение chirp на сопряжённый опорный chirp превращает его в тон?
  4. Какие блоки естественно переносить в 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.

Упражнения

  1. Замените SF на 9. Сколько чипов и сколько миллисекунд на символ? Сколько бит несёт один символ?
  2. Закодируйте символы 127 и 0. Куда они попадают после сжатия чирпа и почему соседние символы лежат в соседних бинах?
  3. Умножьте принятый чирп на небольшой частотный сдвиг (четверть бина). Что происходит с бином пика и его высотой?
Ответы (проверены запуском скрипта лабораторной)
  1. 2^9 = 512 чипов, 512 / 125 кГц = 4,096 мс на символ, 9 бит на символ. Каждый шаг SF удваивает длительность символа и добавляет один бит: скорость падает, чувствительность растёт.
  2. Символ 0 после снятия чирпа попадает в бин 0, символ 127 в бин 127. Символ CSS это базовый чирп, циклически сдвинутый на своё значение; после умножения на сопряжённый базовый чирп сдвиг на m чипов становится тоном в m бинах, поэтому соседние символы: соседние частоты.
  3. Смещение на четверть бина оставляет пик в том же бине (37), но понижает его на 0,91 дБ, а соседний бин поднимается до уровня на 9,5 дБ ниже пика: тон теперь между бинами (гребешковые потери, как в Лабораторной 3.1). При половине бина оба бина сравнялись бы это предел, который измеряет Лабораторная 8.21.