我正在尝试通过对经过短时傅立叶变换的信号进行短时傅立叶逆变换来重建信号-类似于scipy教程here中的内容
然而,结果重建的信号似乎与原始信号不同。我的代码如下
import scipy.signal as sig
import numpy as np
import matplotlib.pyplot as plt
fs = 44100
nfft = 2048
time = np.arange(10*fs)/float(fs) # test signal will be 10 seconds long
test_sig = np.sin(2 * np.pi * 50 * time) # gives 441000 sample vector
f,t,Zxx = sig.stft(test_sig,fs,nfft=2048) # Zxx.shape = (1025,3447)
_, xrec = sig.istft(Zxx,fs) # xrec.shape = 3528704我不确定这里出了什么问题,这可能是我对istft过程不理解的地方。
发布于 2021-05-04 23:22:03
事实证明,我在sig.stft()和sig.istft()中都遗漏了/误解了函数参数。
sig.stft()中的nperseg参数是如果您想要对FFT进行零填充,其中nfft > nperseg,其中nperseg是每个段的长度。在sig.stft()中,nperseg的默认值是nperseg = 256。nfft的缺省值为nfft = nperseg
如果使用填充零的快速傅立叶变换,那么sig.istft()需要指定nperseg,我没有这样做,所以默认设置会导致我在原始快速傅立叶变换中每段使用的点数被高估。如果未指定nperseg,则它使用的公式为nperseg=2*(Zxx.shape[freq_axis] - 1)。因此,假设我的每个段的长度为2*(1025-1) = 2*(1024) = 2048。这对应于sig.stft()中的初始缺省值,其中nfft = nperseg是默认的,所以除非另有说明,否则该缺省值将作为假设传递到sig.istft()。
https://stackoverflow.com/questions/67385837
复制相似问题