Дешумирование сигнала с помощью автоматических кодировщиков

Дешумирование сигнала с помощью автоматических кодировщиков

16 мая 2022 г.

Сигнал


Сигнал может быть определен как любое наблюдаемое изменение величины в пространстве или во времени, даже если оно не несет информации. В основном их можно разделить на два типа:


  • Аналоговый сигнал

  • Цифровой сигнал

Аналоговый сигнал


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


Цифровой сигнал


Цифровой сигнал представляет собой дискретный поток значений. Есть только определенные возможные значения.


Введение в проект


Этот проект направлен на создание синусоидального сигнала, добавление к нему аддитивного белого гауссовского шума (AWGN) и его шумоподавление с использованием моделей автоэнкодера.


Импорт библиотеки


```питон


импортировать numpy как np


импортировать matplotlib.pyplot как plt


Генерация синусоидального сигнала


Чтобы сгенерировать образец синусоидального сигнала, мы можем использовать приведенный ниже код.


t = np.linspace(1,100,1000)


v = 10*np.sin(t/(2*np.pi))


Это будет генерировать сигнал, который будет выглядеть как



Теперь мы вычисляем мощность сгенерированного выше сигнала, используя


```питон


ш = v ** 2


Сгенерированный сигнал теперь будет выглядеть как



Теперь, чтобы преобразовать мощность из ватт в дБ, мы будем использовать следующий код


```питон


w_db = 10 * np.log10 (ш)


Мощность, выраженная в дБ, будет выглядеть так:



Генерация шума


Мы выбираем целевое значение SnR или отношение сигнал-шум, вычисляем среднюю мощность и конвертируем ее в дБ. Затем мы вычисляем среднее значение шума в дБ, конвертируем его в ватты, затем делаем выборку из нормального распределения с использованием рассчитанных параметров и добавляем его к сгенерированному сигналу, чтобы получить зашумленный сигнал.


```питон


target_snr_db = 20


Рассчитать мощность сигнала и преобразовать в дБ


sig_avg_watts = np.mean(w)


sig_avg_db = 10 * np.log10 (sig_avg_ватт)


Рассчитаем шум согласно [2], затем переведем в ватты


Noise_avg_db = sig_avg_db - target_snr_db


шум_авг_ватт = 10 ** (шум_авг_дб / 10)


Генерируем образец белого шума


средний_шум = 0


Noise_volts = np.random.normal (mean_noise, np.sqrt (noise_avg_watts), len (w))


Зашумить исходный сигнал


y_volts = v + шум_вольты


После этого сигнал с шумом будет выглядеть так



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


```питон


определение signal_gen():


л = np.random.randint (1, 100)


т = np.linspace (1, л, 1000)


v = 10np.sin(t/(2np.pi))/1000


вернуть v


определение шума_ген (v):


ш = v ** 2


target_snr_db = 20


sig_avg_watts = np.mean(w)


sig_avg_db = 10 * np.log10 (sig_avg_ватт)


Noise_avg_db = sig_avg_db - target_snr_db


шум_авг_ватт = 10 ** (шум_авг_дб / 10)


средний_шум = 0


Noise_volts = np.random.normal (mean_noise, np.sqrt (noise_avg_watts), len (w))


y_volts = v + шум_вольты


вернуть y_volts


Чтобы просмотреть образец из сгенерированного набора данных, мы можем использовать следующий фрагмент кода.


```питон


v = генератор_сигнала()


plt.subplot(2,1,1)


plt.title("Случайный сигнал")


plt.plot(v)


plt.show()


plt.subplot(2,1,2)


plt.title("Случайный сигнал с шумом")


plt.plot (noise_gen (v))


plt.show()


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



Для создания набора данных мы используем следующий фрагмент кода.


```питон


сигнал = []


шумный_сигнал = []


для я в диапазоне (1000):


v = генератор_сигнала()


signal.append(v)


noisy_signal.append (noise_gen (v))


Определение модели глубокого обучения


Чтобы выполнить это шумоподавление, мы используем простую модель линейного автоэнкодера. Это будет иметь 1 уровень кодировщика и 1 уровень декодера. Размер каждой входной выборки будет 1000, а всего для модели будет 1000 точек данных.


```питон


импортировать torch.nn как nn


импортировать torch.nn.functional как F


класс DeNoise (nn.Module):


защита init(сам):


super(DeNoise, self).init()


self.lin1 = nn.Linear(1000, 800)


self.lin_t1 = nn.Linear(800, 1000)


защита вперед (я, х):


x = F.tanh (self.lin1 (x))


х = self.lin_t1 (х)


вернуть х


модель = DeNoise().cuda()


печать (модель)


Здесь мы используем функцию активации tanh, поскольку мы знаем, что максимальная и минимальная границы синусоидальной функции равны -1 и 1. Имея аналогичные границы, мы обнаружили, что она лучше всего подходит для этого приложения.


Определение функций потерь и оптимизации


```питон


импортный факел


критерий = nn.MSELoss()


оптимизатор = torch.optim.Adam(model.parameters(), lr=0,001)


Определение цикла обучения


```питон


def train (n_epochs, модель):


training_loss = []


для эпохи в диапазоне (n_epochs):


поездпотери = 0,0


для sig, noisig в ​​zip(signal, noisy_signal):


сигнал = факел.Tensor(sig).cuda()


noisig = факел.Tensor(noisig).cuda()


оптимизатор.zero_grad()


вывод = модель (шум)


потеря = критерий (выход, сигнал)


потеря.назад()


оптимизатор.шаг()


убыток поезда += убыток.элемент()


print("Эпоха: {} , Потеря обучения: {}".format(эпоха + 1 , Trainloss / len(signal)))


training_loss.append (убыток поезда / длина (сигнал))


plt.plot (обучение_потеря)


print("Обучение завершено!!!")


Обучение модели


```питон


поезд(10, модель)


Результат тренировки будет выглядеть так



Визуализация результатов


```питон


заговор (я):


pred = модель (torch.Tensor (сигнал [i]).cuda()).cpu()


plt.subplot(4,1,1)


plt.title("Исходный сигнал")


plt.xlabel("Напряжение")


plt.ylabel("Время")


plt.plot (сигнал [i])


plt.show()


plt.subplot(4,1,2)


plt.title("Шумный сигнал")


plt.xlabel("Напряжение")


plt.ylabel("Время")


plt.plot (шумной_сигнал [я])


plt.show()


plt.subplot(4,1,3)


plt.title("Предсказанный сигнал")


plt.xlabel("Напряжение")


plt.ylabel("Время")


plt.plot(pred.detach().numpy())


plt.show()


Приведенный выше блок будет генерировать результаты, которые будут выглядеть так:





Вывод


Итак, в этом проекте мы успешно реализовали шумоподавитель сигнала, использующий модель глубокого обучения на основе PyTorch.


Код


GitHub: https://github.com/srimanthtenneti/Autoencoders/blob/main/Signal_Denoiser.ipynb


Пожалуйста, не стесняйтесь подключаться.


Контакт


LinkedIn: https://www.linkedin.com/in/srimanth-tenneti-662b7117b/



Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE