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

Люк Кербс и Джордж Уильямс ([email protected])

Сигналы везде!

Вы не можете их увидеть, но сигналы есть повсюду - сигнал - это наблюдаемое изменение количества, несущее информацию. Сигнал может нести информацию практически обо всем, от аудио до видео и текстовых данных. Способность классифицировать сигналы - важная задача, которая открывает возможности для множества различных приложений. Например, датчики ЭМГ измеряют электрическую активность в ответ на нервную стимуляцию мышцы. Если к запястью прикреплены датчики ЭМГ, электрические сигналы можно классифицировать как движения отдельных пальцев, которые затем можно использовать для управления рукой робота.

Поскольку существует так много разных типов сигналов, нам нужен способ различать и извлекать информацию из сигналов. Это тема, которую мой наставник попросил меня изучить в рамках моей летней стажировки в GSI Technology, особенно в отношении классификации радиосигналов.

Беспроводная революция

Существование радиоволн было успешно доказано в 1888 году немецким физиком Генрихом Герцем. Всего через шесть лет после открытия Гульемо Маркони начал разработку первого беспроводного радиотелеграфа, положив начало революции в беспроводной связи. Невозможно переоценить важность радиоволн для функционирования нашего современного мира.

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

Многие стороны используют радиочастотный спектр. Ключевым методом контроля и управления использованием спектра является классификация сигналов. Нам нужно быстро различать и идентифицировать сигналы прямо с антенны.

В типичной настройке RF устройству может потребоваться быстро определить тип принимаемого сигнала. Рассмотрим изображение выше: это лишь некоторые из множества возможных сигналов, которые может потребоваться машине для различения.

Оказывается, для этого типа классификации можно использовать современное машинное обучение. Но сначала давайте взглянем на традиционный метод обработки сигналов.

Преобразования Фурье

Жан-Батист Жозеф Фурье (21 марта 1768–16 мая 1830) был французским математиком и физиком, наиболее известным благодаря открытию ряда Фурье и преобразования Фурье, основы всех теорий, связанных с сигналами.

Основная идея преобразований Фурье проста, и ее лучше всего описать аналогией: если художник смешивает несколько разных цветов вместе, найдите исходный рецепт цветов, которые создали смесь.

Однако вместо смешанной краски мы хотим найти рецепт, который составляет данное показание сигнала. Преобразование Фурье осуществляет обратное проектирование данного сигнала, чтобы найти все различные частоты, которые его составляют.

Рассмотрим изображение выше, пример из области звука. Когда вы объединяете вместе желтую и пурпурную частоты, вы получаете зеленый сигнал вверху. Преобразование Фурье - это математическая функция, которая может использоваться для отображения различных частотных компонентов непрерывного сигнала.

Как это работает?

Чтобы проиллюстрировать, как работает преобразование Фурье, давайте рассмотрим простой пример двух синусоидальных функций: f (t) = sin (2t) и g (t) = sin (3t) .

Представьте, если бы вам просто дали сигнал справа; как бы вы могли разложить его на два исходных компонента, показанных слева?

В этом нам поможет преобразование Фурье. Он переводит сигналы во временной области в частотную. Итак, после применения преобразования к сигналу справа вы получите что-то вроде этого:

Теперь давайте посмотрим, как все это сделать в Python.

Генерация данных сигнала

Здесь мы генерируем две синусоидальные частоты sin (2t) и sin (3t).

# frequency, in cycles per second, or Hertz
f1 = 2  
f2 = 3
# sampling rate, or number of measurements per second
sample_rate = 100
seconds = 10
intervals = seconds * sample_rate
# create signal time series data 
t = np.linspace(0, seconds, intervals)
sin1 = np.sin(f1 * 2 * np.pi * t)
sin2 = np.sin(f2 * 2 * np.pi * t)

Затем мы наносим на график частоты ...

# plot signal
plt.plot(t, x1)
plt.plot(t, x2)
plt.xlim(0,2)
plt.title('sin(2t) and sin(3t)')
plt.xticks([], [])
plt.yticks([], [])
plt.show()

Сгенерируйте и нанесите на карту сигнал

Здесь мы складываем sin (2t) и sin (3t) вместе, чтобы сгенерировать наш комбинированный сигнал:

# generate signal
signal = []
for i in range(len(sin1)):
    signal.append(sin1[i] + sin2[i])
    
# plot signal
plt.plot(t, signal)
plt.xlim(0,2)
plt.title('Combined Signal')
plt.xticks([], [])
plt.yticks([], [])
plt.show()

И строим результат:

Быстрое преобразование Фурье (БПФ)

Теперь мы применим быстрое преобразование Фурье к нашему сигналу выше, используя встроенную функцию из библиотеки Python SciPy:

signal_fft = fftpack.fft(signal)
signal_fft = np.abs(signal_fft)
freqs = fftpack.fftfreq(len(signal)) * sample_rate
# plot fft
plt.plot(freqs, signal_fft)
plt.xlim(0,5)
plt.style.use(['dark_background'])
plt.yticks([], [])
plt.show()

И, вычерчивая результат, мы получаем следующее:

Обратите внимание, как все значения БПФ близки к нулю, за исключением частот 2 и 3, то есть частот, соответствующих sin (2t) и sin (3t). Мы успешно изолировали основные частотные составляющие сигнала. Преобразование Фурье принимает сигнал из временной области в частотную область.

Некоторые из вас могут заметить, что приведенная выше диаграмма немного отличается от диаграммы, показанной на рис. 1. Это связано с тем, что Рис. 1 представляет собой непрерывное преобразование Фурье, а приведенное выше - это БПФ, которое намного быстрее, но также дискретно и приближенно.

Это очень краткое введение в преобразование Фурье. Если вы хотите узнать больше по этой теме, я рекомендую посмотреть видео 3Blue1Brown: Но что такое преобразование Фурье.

Подход, основанный на глубоком обучении

Анализ Фурье был доминирующим математическим методом для обработки, деконструкции и, в конечном итоге, классификации сигналов. Но в последнее время возрос интерес к использованию глубоких нейронных сетей для выполнения этих задач.

В последнее время я экспериментировал со сверточными нейронными сетями, чтобы классифицировать радиосигналы из небольшого набора данных с 11 классами. Я использовал простую архитектуру CNN, показанную ниже:

Сверточный классификатор достиг точности теста до 73%.

Глубокие остаточные сети (resNets) продемонстрировали современные результаты в обработке изображений и звука и открывают перспективы для классификации сигналов. Я попробую использовать глубокую остаточную сеть на гораздо большей базе данных радиосигналов с еще большим количеством классов сигналов. В моем следующем блоге мы рассмотрим интересную статью, в которой экспериментируют с использованием остаточных нейронных сетей для классификации сигналов.