内容:
我正在尝试创建一个低通滤波器,以切断声音文件10khz以上的频率。
import librosa
import scipy.signal as sig
import numpy as np
import matplotlib.pyplot as plt
filename = librosa.example('nutcracker')
y, sr = librosa.load(filename)
# modeled after example in scipy.signal docs:
sos = sig.butter(10, 11, btype='lowpass', analog=False, output='sos')
filtered = sig.sosfilt(sos, y)
现在,我知道低通滤波器的作用,但不知道其作用或背后的数学原理。因此,前两个参数scipy.signal.butter(N, Wn, ... )
对我来说有点神秘:
N:整数
过滤器的顺序。
Wn:类似array_like
临界频率。对于低通和高通滤波器,Wn是一个标量;对于带通和带阻滤波器,Wn是长度为2的序列。
起初我以为Wn
,“临界频率”是滤波器的截止/阈值。但是,将其设置为大于1的任何值都会导致错误,告诉我该值必须在0到1之间。
这是我的工作/研究内容:
谷歌搜索“低通滤波器临界频率”会得出许多有关截止频率和转折频率的结果,这些结果似乎确实与我最初的“截止点”想法相似。
我还发现了一些基于滤波器的“传递函数”来计算截止频率的公式,但是显然有很多类型的低通滤波器,并且每个滤波器可能具有不同的传递函数。
这个相关问题讨论了用于计算的奈奎斯特频率Wn
。我知道奈奎斯特采样率是多少,这显然是不同的。Wikipedia文章完全避免谈论概念上的奈奎斯特频率。
我的问题:
显然,除了我正在动态学习的内容之外,我几乎对信号处理一无所知。像我五岁一样解释一下:
signal.butter()
临界频率参数(Wn
)
您Wn
与截止频率相对应的印象是正确的。但是,单位很重要,如文档中所示:
对于数字滤波器,Wn与fs的单位相同。默认情况下,fs是2个半周期/样本,因此将它们从0标准化为1,其中1是奈奎斯特频率。(因此,Wn为半周期/样本。)
因此,处理指定的最简单方法Wn
是也指定采样率fs
。在您的情况下,您可以从sr
返回的变量中获取此采样率librosa.load
。
sos = sig.butter(10, 11, fs=sr, btype='lowpass', analog=False, output='sos')
为了验证您的滤波器,您可以使用scipy.signal.sosfreqz
和绘制其频率响应pyplot
:
import scipy.signal as sig
import matplotlib.pyplot as plt
sos = sig.butter(10, 11, fs=sr, btype='lowpass', analog=False, output='sos')
w,H = sig.sosfreqz(sos, fs=sr)
plt.plot(w, 20*np.log10(np.maximum(1e-10, np.abs(H))))
为了更好地可视化参数的效果Wn
,我绘制了Wn
(任意sr=8000
)的各种值的响应:
过滤器顺序参数(N
)
This parameters controls the complexity of the filter. More complex filters can have sharper freqency responses, which can be usefull when trying to separate frequencies that are close to each other. On the other hand, it also requires more processing power (either more CPU cycles when implemented in software, or bigger circuits when implemented in hardware).
Again to visualize the effects of the parameter N
, I've plotted the response for various values of N
(for an arbitrary sr=8000
):
How to compute those parameters
由于您提到要使滤波器截止10kHz以上的频率,因此应设置Wn=10000
。只要您的采样率sr
至少为20kHz,这将起作用。就N
您而言,您想选择满足您要求的最小值。如果您知道要实现多少,一个便捷函数可以计算所需的滤波器阶数scipy.signal.buttord
。例如,如果您希望滤波器在10kHz以下具有不超过3dB的衰减,而在12kHz以上具有至少60dB的衰减,则可以使用:
N,Wn = sig.buttord(10000, 12000, gpass=3, gstop=60, fs=sr)
否则,您也可以尝试获得满足您要求的过滤器订单。您可以从1开始并增加直到获得所需的衰减。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句