首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么istft(sft(x))不等于x

为什么istft(sft(x))不等于x
EN

Stack Overflow用户
提问于 2021-05-04 21:32:53
回答 1查看 84关注 0票数 0

我正在尝试通过对经过短时傅立叶变换的信号进行短时傅立叶逆变换来重建信号-类似于scipy教程here中的内容

然而,结果重建的信号似乎与原始信号不同。我的代码如下

代码语言:javascript
复制
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过程不理解的地方。

EN

回答 1

Stack Overflow用户

发布于 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()

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67385837

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档