我正试图通过对短时傅里叶变换信号进行短时傅里叶逆变换来重建信号,类似于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过程不了解的地方
事实证明,对于
sig.stft()
和sig.istft()
中的函数参数,我有很多遗漏/误解sig.stft()
中的nfft
参数是如果要将FFT置零,其中nfft>;nperseg,其中nperseg是每段的长度。sig.stft()
中nperseg的默认值为nperseg = 256
。nfft的默认值为nfft = nperseg
如果使用零填充FFT,那么
sig.istft()
需要指定nperseg,我没有这样做,因此默认值导致我对原始FFT的每个段使用的点数估计过高。如果未指定nperseg,则使用的公式为nperseg=2*(Zxx.shape[freq_axis] - 1)
。所以它假设我的每个片段的长度是2*(1025-1)=2*(1024)=2048。这对应于sig.stft()
中的初始默认值,其中nfft = nperseg
,因此默认值作为对sig.istft()
的假设进行,除非另有说明相关问题 更多 >
编程相关推荐