Задать вопрос
20two_may
@20two_may

Как преобразовать спектрограмму в изображение?

Приветствую! Надо реализовать алгоритм, который:
1. Преобразует сигнал в log-спектрограмму;
2. Спектрограмму превращает в изображение 128 на 128. Но по факту под изображением имеется ввиду массив с шейпом (3, 128, 128) или же (1, 128, 128);

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

1-ый этап алгоритма реализован:
sampling_rate = 360 # Сигнал записан с частотой 360 Hz
length = 3600 # Беру 10 секунд от сигнала

wnd = scipy.signal.get_window('hann', 256) # Окно Ханнинга размером 256
f,  t,  Zxx = sp.signal.spectrogram(data[0:length ], fs=360, window=wnd, nperseg=256, noverlap=178)

plt.pcolormesh(t, f, np.log10(np.abs(Zxx)), shading='gouraud', cmap='jet') # Вывожу спектрограмму

64046a4403606226365740.png

А вот со 2-ым этапом проблемка. Я до сих пор не могу даже предположить как это сделать. Например, в изображении обе оси (высота и ширина) находятся в пространственной области и имеют одинаковый масштаб, пиксели хранятся как целые числа в диапазоне [0, 255]. А вот оси в спектрограмме относятся к разным "измерениям": горизонтальная ось - время, а вертикальная - частота. Каждая из этих величин имеет свой масштаб. Размерность частоты определяется размером окна, а размерность времени задается общей длиной сигнала, размером окна и т.д.
  • Вопрос задан
  • 198 просмотров
Подписаться 1 Средний Комментировать
Решения вопроса 1
i229194964
@i229194964
Веб разработчик
import numpy as np
import matplotlib.pyplot as plt
from scipy.misc import imresize
from matplotlib import cm

# Преобразуем спектрограмму в log-шкалу и нормализуем значения
Zxx_log = np.log10(np.abs(Zxx))
Zxx_norm = (Zxx_log - Zxx_log.min()) / (Zxx_log.max() - Zxx_log.min())

# Используем colormap 'viridis' для преобразования значений в цвета
cmap = cm.get_cmap('viridis')
Zxx_rgb = cmap(Zxx_norm)

# Изменяем размер изображения до 128x128
Zxx_resized = imresize(Zxx_rgb, (128, 128))

# Переводим изображение в формат (3, 128, 128)
Zxx_final = np.transpose(Zxx_resized, (2, 0, 1))

# Выводим изображение
plt.imshow(Zxx_final)
plt.show()
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы