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

09. Анализ записанного сигнала в Python

Цель раздела

Научиться анализировать записанный IQ-сигнал в Python и использовать скриптовый подход для автоматизации измерений.

1. Зачем нужен Python

Python полезен в курсе как быстрый универсальный инструмент. Он позволяет:

  • читать IQ-файлы;
  • строить графики;
  • вычислять FFT;
  • автоматизировать повторяющиеся измерения;
  • готовить небольшие утилиты для обработки записей.

Для инженерной практики это особенно важно: Python хорошо подходит для быстрой проверки гипотез.

2. Задачи анализа

В рамках первого блока нужно:

  • прочитать файл с IQ-данными;
  • преобразовать данные в комплексный сигнал;
  • построить временную форму;
  • построить спектр;
  • найти частоту основного тона;
  • сохранить результаты.

3. Рекомендуемые библиотеки

Для первого анализа достаточно:

  • numpy
  • matplotlib

При необходимости можно использовать и:

  • scipy

4. Общая последовательность работы

  1. Открыть файл.
  2. Прочитать сырой массив.
  3. Разделить I и Q.
  4. Сформировать комплексный массив.
  5. Построить временную форму.
  6. Вычислить FFT.
  7. Найти спектральный пик.
  8. Вывести численные результаты.

5. Пример скрипта на Python

import numpy as np
import matplotlib.pyplot as plt

filename = "tone_capture_iq.bin"
fs = 2.4e6

raw = np.fromfile(filename, dtype=np.int16)

i_data = raw[0::2]
q_data = raw[1::2]

x = i_data.astype(np.float64) + 1j * q_data.astype(np.float64)

n_view = min(len(x), 2000)
t = np.arange(n_view) / fs

plt.figure()
plt.plot(t, np.real(x[:n_view]))
plt.xlabel("Time, s")
plt.ylabel("Amplitude")
plt.title("Real part of IQ signal")
plt.grid(True)

nfft = 4096
X = np.fft.fftshift(np.fft.fft(x[:nfft], nfft))
f = np.fft.fftshift(np.fft.fftfreq(nfft, d=1/fs))

plt.figure()
plt.plot(f, 20 * np.log10(np.abs(X) + 1e-12))
plt.xlabel("Frequency, Hz")
plt.ylabel("Magnitude, dB")
plt.title("Spectrum of recorded tone")
plt.grid(True)

peak_index = np.argmax(np.abs(X))
peak_freq = f[peak_index]

print(f"Peak frequency: {peak_freq:.2f} Hz")

plt.show()

Скрипт читает отсчёты int16: формат .ci16 курса. Сырой файл rtl_sdr хранит беззнаковые 8-битные отсчёты со смещением 127,5, а запись HDSDR это WAV-файл; см. таблицу форматов на странице 07. Читатели курса из Лабораторной 9.3 (ci16, cu8, cf32) и Лабораторной 9.4 (WAV IQ) делают это за вас.

5a. Запустите версию курса и проверьте её на известном тоне

Тот же анализ с печатью пика и сохранением графика лежит в blocks/block_01_intro_sdr/python/iq_analysis_example.py. Прежде чем доверять ему реальную запись, запустите его на файле с известным ответом. Тон 200 кГц при частоте дискретизации 2,4 MS/s, записанный как .ci16, даёт:

samples: 65536, FFT length: 4096, bin width: 585.9 Hz
peak offset from the tuning frequency: 199804.7 Hz
peak above the median spectrum level: 63.6 dB

Пик на 195 Гц не дотягивает до 200 кГц. Это не ошибка: у FFT есть только бины через fs/nfft = 585,9 Гц, и 199 804,7 Гц это бин, ближайший к тону.

python blocks/block_01_intro_sdr/python/iq_analysis_example.py capture.ci16 --fs 2.4e6 --out spectrum.png
python blocks/block_01_intro_sdr/python/iq_analysis_example.py capture.cu8 --dtype uint8

6. Что должен увидеть студент

Во временной области

  • устойчивую форму сигнала;
  • отсутствие случайных скачков;
  • периодическую структуру.

В спектре

  • основной спектральный пик;
  • уровень шума;
  • возможно, слабые паразитные составляющие.

7. Преимущества Python в этом блоке

Python удобен, потому что позволяет быстро:

  • менять параметры анализа;
  • обрабатывать несколько файлов;
  • автоматически вычислять частоту пика;
  • сохранять графики;
  • строить простые измерительные инструменты.

Это особенно полезно для дальнейшей работы с большими объёмами IQ-данных.

8. Что нужно проверить

Во время анализа убедитесь, что:

  • выбран правильный тип данных;
  • I и Q не перепутаны;
  • частота дискретизации задана правильно;
  • анализируется достаточно длинный фрагмент;
  • шкала частот интерпретирована правильно.

9. Что можно улучшить в следующей версии скрипта

Дальше студент может расширить скрипт:

  • добавить оконную функцию;
  • оценить уровень шума;
  • автоматически находить несколько пиков;
  • сохранять результаты в файл;
  • строить спектрограмму;
  • сравнивать несколько записей.

9a. Упражнения

  1. Запишите тот же тон 200 кГц как файл rtl_sdr (uint8, смещение 127,5) и проанализируйте его с --dtype uint8. Затем проанализируйте тот же файл с типом по умолчанию int16. Неверный тип даёт уверенный, но неправильный ответ: пик около −400 кГц, примерно на 48 дБ выше медианы. Почему ошибка формата не выглядит как шум?
  2. Измените --nfft с 4096 на 65536. Насколько пик приблизится к 200 000 Гц и какова теперь ширина бина?
  3. Поменяйте местами I и Q в загрузчике. Куда сместится тон и почему?

10. Что включить в отчёт

Рекомендуется включить:

  • текст или фрагмент скрипта на Python;
  • график во временной области;
  • график спектра;
  • найденную частоту пика;
  • краткий вывод.

11. Выводы

После этого этапа студент должен:

  • уметь читать IQ-файл в Python;
  • строить базовый спектральный анализ;
  • автоматически находить частоту тестового тона;
  • использовать Python как инструмент инженерной автоматизации.