tam*_*lev 5 python audio fft scipy spectrogram
在我的算法中,我创建了一个频谱图并对数据进行了操作:
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
// ...
Run Code Online (Sandbox Code Playgroud)
有没有办法将频率、时间和 Sxx 恢复为信号?
不,这是不可能的。要计算频谱图,请将输入时域信号划分为(半重叠)数据块,每个数据块都乘以适当的窗函数,然后进行FFT,这会给出一个复数向量,该向量表示幅度和每个频率仓的相位。频谱图的每一列最终都是通过一次 FFT 的绝对平方形成的(通常您会丢弃负频率,因为 PSD 对于实际输入信号是对称的)。通过取绝对平方,您会丢失任何相位信息。这使得无法准确地重建原始时域信号。
由于您的耳朵不关心相位信息(您的大脑会感觉到类似于频谱图的东西),因此有可能重建听起来大致相同的信号。这基本上可以通过反向执行所有描述的步骤来完成,同时为 FFT 选择随机相位。
请注意,您的代码存在一个问题:您创建了一个名为 的变量signal
,该变量“隐藏”您使用相同名称导入的 scipy.signal 模块。