使用`scipy.signal.butter()`创建低通滤波器时,“阶次”和“临界频率”是什么

岩石

内容:

我正在尝试创建一个低通滤波器,以切断声音文件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之间。

这是我的工作/研究内容:

  1. 谷歌搜索“低通滤波器临界频率”会得出许多有关截止频率转折频率的结果,这些结果似乎确实与我最初的“截止点”想法相似。

  2. 我还发现了一些基于滤波器的“传递函数”来计算截止频率的公式,但是显然有很多类型的低通滤波器,并且每个滤波器可能具有不同的传递函数。

  3. 这个相关问题讨论了用于计算的奈奎斯特频率Wn我知道奈奎斯特采样率是多少,这显然是不同的。Wikipedia文章完全避免谈论概念上的奈奎斯特频率。

我的问题:

显然,除了我正在动态学习的内容之外,我几乎对信号处理一无所知。像我五岁一样解释一下:

  1. 的前两个参数是什么 signal.butter()
  2. 更改这些参数在功能上如何改变过滤器?
  3. 我该如何计算?
侦探眼

临界频率参数(Wn

Wn与截止频率相对应的印象是正确的。但是,单位很重要,如文档中所示:

对于数字滤波器,Wnfs的单位相同默认情况下,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))))

N = 10,Wn = 11时的频率响应

为了更好地可视化参数的效果Wn,我绘制了Wn(任意sr=8000)的各种值的响应

N = 10,Wn = 500,1500和2500时的频率响应

过滤器顺序参数(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):

N = 3、5、11和Wn = 1000时的频率响应

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在scipy.signal中制作一个低通滤波器?

来自分类Dev

在Python中使用scipy.signal时的过滤增益问题

来自分类Dev

scipy.signal.lombscargle的使用

来自分类Dev

在SciPy中创建低通滤波器-了解方法和单位

来自分类Dev

Python scipy.signal.remez高通滤波器设计产生奇怪的传递函数

来自分类Dev

关于在Matlab中使用'butter'功能的低通滤波器的问题

来自分类Dev

如何为scipy.signal.lfilter使用Python的scipy.signal.remez输出?

来自分类Dev

在音频上使用低通滤波器

来自分类Dev

使用fft的Matlab低通滤波器

来自分类Dev

为什么scipy.signal.cont2discrete返回dt?

来自分类Dev

使用scipy.signal.welch无法找到正确的能量

来自分类Dev

如何使用scipy.signal.spectogram找到正确的幅度

来自分类Dev

无法同时使用SIGNAL和INSERT

来自分类Dev

为什么“ scipy.signal.stft()”中的采样频率数量与跳数有关?

来自分类Dev

pyinstaller --onefile在导入scipy或scipy.signal时警告pyconfig.h

来自分类Dev

低通滤波器和采样频率

来自分类Dev

为什么在mlab和scipy.signal中交叉谱不同?

来自分类Dev

Matlab-在系统上使用低通滤波器

来自分类Dev

将SOX低通滤波器与插孔配合使用

来自分类Dev

使用Pulseaudio在LFE上进行低通滤波器

来自分类Dev

scipy.signal.resample表现异常

来自分类Dev

限制scipy.signal.correlate的范围

来自分类Dev

scipy.signal.step如何计算时间

来自分类Dev

了解 scipy.signal.spectrogram() 的输出

来自分类Dev

如何使用Python将scipy.signal.spectrogram反转为音频?

来自分类Dev

使用日期时间数据绘制scipy.signal.find_peaks图

来自分类Dev

MySQL:无法在触发器中使用SIGNAL

来自分类Dev

MySQL:无法在触发器中使用SIGNAL

来自分类Dev

如何将python的scipy.signal.remez输出用于scipy.signal.lfilter?

Related 相关文章

  1. 1

    如何在scipy.signal中制作一个低通滤波器?

  2. 2

    在Python中使用scipy.signal时的过滤增益问题

  3. 3

    scipy.signal.lombscargle的使用

  4. 4

    在SciPy中创建低通滤波器-了解方法和单位

  5. 5

    Python scipy.signal.remez高通滤波器设计产生奇怪的传递函数

  6. 6

    关于在Matlab中使用'butter'功能的低通滤波器的问题

  7. 7

    如何为scipy.signal.lfilter使用Python的scipy.signal.remez输出?

  8. 8

    在音频上使用低通滤波器

  9. 9

    使用fft的Matlab低通滤波器

  10. 10

    为什么scipy.signal.cont2discrete返回dt?

  11. 11

    使用scipy.signal.welch无法找到正确的能量

  12. 12

    如何使用scipy.signal.spectogram找到正确的幅度

  13. 13

    无法同时使用SIGNAL和INSERT

  14. 14

    为什么“ scipy.signal.stft()”中的采样频率数量与跳数有关?

  15. 15

    pyinstaller --onefile在导入scipy或scipy.signal时警告pyconfig.h

  16. 16

    低通滤波器和采样频率

  17. 17

    为什么在mlab和scipy.signal中交叉谱不同?

  18. 18

    Matlab-在系统上使用低通滤波器

  19. 19

    将SOX低通滤波器与插孔配合使用

  20. 20

    使用Pulseaudio在LFE上进行低通滤波器

  21. 21

    scipy.signal.resample表现异常

  22. 22

    限制scipy.signal.correlate的范围

  23. 23

    scipy.signal.step如何计算时间

  24. 24

    了解 scipy.signal.spectrogram() 的输出

  25. 25

    如何使用Python将scipy.signal.spectrogram反转为音频?

  26. 26

    使用日期时间数据绘制scipy.signal.find_peaks图

  27. 27

    MySQL:无法在触发器中使用SIGNAL

  28. 28

    MySQL:无法在触发器中使用SIGNAL

  29. 29

    如何将python的scipy.signal.remez输出用于scipy.signal.lfilter?

热门标签

归档