是否有任何通用形式的短时傅里叶变换,其中相应的逆变换内置于SciPy或NumPy或其他任何东西?
specgram在matplotlib中有pyplot 函数,它调用ax.specgram()哪些调用mlab.specgram()调用_spectral_helper():
Run Code Online (Sandbox Code Playgroud)#The checks for if y is x are so that we can use the same function to #implement the core of psd(), csd(), and spectrogram() without doing #extra calculations. We return the unaveraged Pxy, freqs, and t.
但
这是一个辅助函数,它实现了204#psd,csd和谱图之间的通用性.它 并不意味着在mlab之外使用
不过,我不确定这是否可以用来做STFT和ISTFT.还有什么,或者我应该翻译这些MATLAB函数吗?
我知道如何编写自己的临时实现; 我只是在寻找功能齐全的东西,它可以处理不同的窗口函数(但是有一个合理的默认值),完全可以与COLA windows(istft(stft(x))==x)完全颠倒,由多人测试,没有一个一个错误,处理结束和零填充,实际输入的快速RFFT实现等.
如何应用低通滤波器,截止频率随时间线性变化(或者线性比线性更一般),例如10000hz到200hz,numpy/scipy,可能没有其他库?
例:
以下是如何做一个简单的100hz低通:
from scipy.io import wavfile
import numpy as np
from scipy.signal import butter, lfilter
sr, x = wavfile.read('test.wav')
b, a = butter(2, 100.0 / sr, btype='low') # Butterworth
y = lfilter(b, a, x)
wavfile.write('out.wav', sr, np.asarray(y, dtype=np.int16))
Run Code Online (Sandbox Code Playgroud)
但如何使截止变化?
注意:我已经阅读过在Python中应用时变滤波器,但答案非常复杂(一般情况下它适用于多种滤波器).
我正在开发一个项目来查找Python中多分量音频信号的瞬时频率.我目前正在使用Butterworth带通滤波器结合scipy.signal.lfilter在我想要的频率范围内提取.然后我使用分析信号(from scipy.signal.hilbert)来获得瞬时相位,可以将其解包以提供频率.
作为信号处理的相对新手,我有两个主要问题:
我已经读过,在许多应用程序中,最好使用scipy.signal.filtfiltover scipy.signal.lfilter.当然,当我申请filtfilt我的数据时,我会得到一个非常平滑的瞬时频率信号.我想知道两者之间的主要区别,记住我希望得到一个尽可能接近"真实"瞬时频率的输出.
瞬时频率数据是非平稳的,这意味着在某些情况下我必须使用更宽的带通滤波器来捕获我所需的所有数据.这似乎会在我的信号中引入额外的噪音和偶尔的不稳定性.有没有办法处理这些问题,例如设计更好的过滤器?
编辑
作为对flebool的回应,下面是我正在查看的数据的一些图像.一,比较filt和filtfilt:

请注意,此图仅显示特定信号的子集.
二,增加巴特沃斯滤波器尺寸的效果:
这与图1中的数据子集相同.图例分别显示了过滤器的下限和上限(红色跟踪是filt图1中数据的版本).
虽然这里可能不清楚为什么我会使用更大的通带,但在某些情况下,数据可能位于例如600和800Hz之间的各个点.在这里,我需要更广泛的滤波器设计.随着滤波器变宽,您可以看到额外的噪声进入迹线; 我想知道是否有一种方法可以优化/改进我的滤波器设计.