В статье про кросс-компиляцию я рассказал о том, как подготовить удобный инструментарий для работы с Raspberry Pi. Напомню, что статья началась с новости о том, что Broadcom открыл спецификации своего чипа GPU, который используется в RPi, что открыло возможности по быстродействующим вычислениям преобразования Фурье: БПФ/FFT на этом чипе.
Поскольку бродкомовские библиотеки у меня поднялись сразу, я не стал торопиться и подготовил пару питоновских утилит для моделирования входной выборки и визуализации выходных данных (спектр выборки). Дальше — больше: чтобы наработанный материал не пропадал зря, я сразу решил приспособить fft-on-chip технологию для нахождения кросс — функции неопределенности, которая используется в пассивной локации (PCL). В итоге, у меня получилось три приложения.
Три источника и три составные части FFT-on-Chip
Первое приложение — питоновская программа для формирования входной I/Q выборки. Для того чтобы обеспечить последующую визуализацию результатов работы, данные формируются блоками по принципу один блок — одна картинка. В результате все записывается в бинарный файл, который отдается приложению на RPi.
Для какого сигнала будем определять кросс — функцию неопределенности? Вначале я планировал сделать выборку близкой к реальному речевому/музыкальному сигналу, который транслируется ФМ станциями, что и нужно пассивному радару. Однако я обнаружил что закапываюсь в звуковых и ALSA модулях Питона и трачу много времени на то, чтобы распатронить mp3 запись с песней Тото Кутуньо в PCM формат, который уже можно преобразовать в I/Q последовательность. Поэтому я поступил просто: чтобы визуализация/анимация была наглядной, выбрал в качестве входного сигнала выборку М-последовательности, которые славятся хорошими автокорреляционными свойствами.
Алгоритм формирования этих последовательностей нетривиален. В старых добрых потрепаных книжках даются рекурсивные алгоритмы, реализуемые на сдвиговых регистрах с обратной связью. В одной радиолокационной конторе искали такие последовательности самостоятельно, чтобы получить большую длину и соответственно одновременно хорошее разрешение по скорости и дальности.
Мы пойдем простым путем. Помните, что каждый раз когда надо сделать просто, на помощь приходит Питон? Одна строчка и последовательность у нас в кармане, то есть в переменной m_seq:
1 |
m_seq = scipy.signal.max_len_seq(9)[0] |
Девятка — это длина последовательности как степень двойки. Дальше, самое время вспомнить что мы собираемся генерировать «кросс» функцию неопределенности, поэтому полученную выборку будем интерпретировать как опорную для пассивного радиолокатора, то есть полученную с базовой ФМ станции. Сам сигнал, отраженный от цели, должен получить доплеровский сдвиг по частоте (движение цели) и сдвиг по времени (задержка при отражении от цели). Опять таки, для наглядности будущей анимации сделаем эти параметры линейно меняющимися во времени. Сигнал и опору записываем в файл, и на этом генерация данных завершена.
Второе приложение на RPi: программа обработки данных и нахождения кросс — функции неопределенности. Здесь мы вовсю используем наработанный инструментарий. Приложение работает на ARM процессоре RPi и для вычисления FFT использует GPU модуль. Вне зависимости от того, какой из методов нахождения кросс — функции неопределенности мы используем, для входной выборки нужно выполнить серию FFT преобразований. И было бы обидно, если быстродействующую функцию БПФ нужно было вызывать каждый раз, теряя драгоценное время на вызов.
К счастью, разработчики спецификаций и библиотек дали возможность отправлять на разработку целый пакет выборок, возвращая пакет спектров БПФ. Пакетную обработку выполняет функция API gpu_fft_execute(fft). В результате, пакет комплексных переменных записывается в файл уже для последующей анимации.
С третьим приложением все просто. Питоновская программа получает файл с 2D блоками кросс — функций неопределенности и прокручивает его на экране. Поскольку в качестве входной выборки я задавал М — последовательности, хорошо видно пик диаграммы.
Естественно, пик перемещается, потому как мы задавали изменение доплеровской скорости и задержки во входных данных. Для наглядности я крутил функцию неопределенности в разные стороны, чтобы были видны ее сечения как по времени, так и по частоте.
Coming Soon
В основном приложении я не упомянул про важный модуль, который обеспечивает подавление опорного сигнала во входных данных. Этот метод основан на сложной математической процедуре и реализован адаптивным способом. Об этом я расскажу в другой статье; надеюсь к этому моменту можно будет использовать вместо М — последовательностей аудио — данные.
Приближенность к спектру реального сигнала позволит оценить эффективность подавления. Пока что в своих экспериментах я достигал величины 60 дБ, но нет предела совершенству.
Ответить