09. Анализ записанного сигнала в Python¶
Цель раздела¶
Научиться анализировать записанный IQ-сигнал в Python и использовать скриптовый подход для автоматизации измерений.
1. Зачем нужен Python¶
Python полезен в курсе как быстрый универсальный инструмент. Он позволяет:
- читать IQ-файлы;
- строить графики;
- вычислять FFT;
- автоматизировать повторяющиеся измерения;
- готовить небольшие утилиты для обработки записей.
Для инженерной практики это особенно важно: Python хорошо подходит для быстрой проверки гипотез.
2. Задачи анализа¶
В рамках первого блока нужно:
- прочитать файл с IQ-данными;
- преобразовать данные в комплексный сигнал;
- построить временную форму;
- построить спектр;
- найти частоту основного тона;
- сохранить результаты.
3. Рекомендуемые библиотеки¶
Для первого анализа достаточно:
numpymatplotlib
При необходимости можно использовать и:
scipy
4. Общая последовательность работы¶
- Открыть файл.
- Прочитать сырой массив.
- Разделить I и Q.
- Сформировать комплексный массив.
- Построить временную форму.
- Вычислить FFT.
- Найти спектральный пик.
- Вывести численные результаты.
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. Упражнения¶
- Запишите тот же тон 200 кГц как файл
rtl_sdr(uint8, смещение 127,5) и проанализируйте его с--dtype uint8. Затем проанализируйте тот же файл с типом по умолчаниюint16. Неверный тип даёт уверенный, но неправильный ответ: пик около −400 кГц, примерно на 48 дБ выше медианы. Почему ошибка формата не выглядит как шум? - Измените
--nfftс 4096 на 65536. Насколько пик приблизится к 200 000 Гц и какова теперь ширина бина? - Поменяйте местами I и Q в загрузчике. Куда сместится тон и почему?
10. Что включить в отчёт¶
Рекомендуется включить:
- текст или фрагмент скрипта на Python;
- график во временной области;
- график спектра;
- найденную частоту пика;
- краткий вывод.
11. Выводы¶
После этого этапа студент должен:
- уметь читать IQ-файл в Python;
- строить базовый спектральный анализ;
- автоматически находить частоту тестового тона;
- использовать Python как инструмент инженерной автоматизации.