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

2024-10-04 03:29:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试图通过对短时傅里叶变换信号进行短时傅里叶逆变换来重建信号,类似于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过程不了解的地方


Tags: testimportsignaltime信号asnpscipy
1条回答
网友
1楼 · 发布于 2024-10-04 03:29:43

事实证明,对于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()的假设进行,除非另有说明

相关问题 更多 >