Есть ли способ инвертировать спектрограмму обратно в сигнал - PullRequest
2 голосов
/ 16 октября 2019

В своем алгоритме я создал спектограмму и провел манипуляции с данными:

import scipy.signal as signal

data = spio.loadmat(mat_file, squeeze_me=True)['records'][:, i]
data = data- np.mean(data)
data = data/ np.max(np.abs(data))
freq, time, Sxx = signal.spectrogram(data, fs=250000, window=signal.get_window("hamming", 480), nperseg=None, noverlap=360, nfft=480)
// ...
// manipulation on Sxx
// ...

Есть ли способ вернуть частоту, время и Sxx обратно в сигнал?

1 Ответ

2 голосов
/ 16 октября 2019

Нет, это невозможно. Чтобы рассчитать спектрограмму, вы делите свой входной сигнал во временной области на (наполовину перекрывающиеся) порции данных, каждый из которых умножается на соответствующую оконную функцию , после чего вы делаете FFT , который дает вам сложный вектор, который указывает амплитуду и фазу для каждого частотного бина. Каждый столбец спектрограммы, наконец, формируется путем взятия абсолютного квадрата одного БПФ (и обычно вы отбрасываете отрицательные частоты, так как PSD симметричен для реального входного сигнала). Взяв абсолютный квадрат, вы потеряете любую информацию о фазе. Это делает невозможным точное восстановление исходного сигнала во временной области.

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

Обратите внимание, что в вашем коде есть одна проблема: вы создаете переменную с именем signal, которая 'shadows 'модуль scipy.signal, который вы импортируете с тем же именем.

...