上下文:
我正在尝试创建一个低通滤波器来截止声音文件中 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 : int
滤波器的阶数。
Wn : array_like
临界频率或频率。对于低通和 高通滤波器,Wn 是标量;对于带通和带阻滤波器, Wn 是一个长度为 2 的序列。
起初我认为
Wn
(被描述为“临界频率”)是滤波器的截止/阈值。但是,将其设置为超过 1 的任何值都会导致错误,告诉我该值必须介于 0 和 1 之间。
这是我的工作/研究:
-
谷歌搜索“低通滤波器临界频率”会产生很多有关的结果 截止频率 和 角频率 ,这确实看起来像我最初的“截止点”想法。
-
我还找到了一些计算截止频率的公式基于滤波器的“传递函数”,但显然低通滤波器有很多种类型,每种滤波器都可能具有不同的传递函数。
-
此 相关问题 谈论用于计算|的奈奎斯特频率| ||。我知道奈奎斯特采样率是多少,这显然是不同的。维基百科文章完全避免谈论奈奎斯特频率的概念。
Wn
我的问题:
显然,除了我正在学习的知识之外,我对信号处理几乎一无所知。请像我 5 岁一样解释一下:
的前两个参数是什么
-
更改这些参数如何在功能上改变过滤器?
signal.butter()
- 我如何计算它们?
- How do I calculate them?
当然,让我们来分析一下巴特沃斯滤波器及其在
scipy.signal.butter()
中的应用。
想象一下这种情况: 你有一台播放各种频率声音的收音机。你只想听到低音,而不是那些尖锐的高音。这里就需要用到低通滤波器了。
-
截止频率(Wn): 这个参数就像在收音机上设定一个旋钮,告诉滤波器你想保留哪些频率。它表示“截止”点,高于此频率的声音会被衰减。在
scipy.signal.butter()
中,你需要以 数字频率 的形式提供截止频率,其范围在 0 到 1 之间(我们将稍后解释这一点)。 -
滤波器阶数(N): 现在,我们的收音机旋钮不像一个完美的、突然的截止点。它更像是一个逐渐减小的旋钮。阶数控制着“截止”的陡峭程度。
- 阶数低(例如,1 或 2): 截止点比较平缓。一些高于你设定的截止频率的声音仍然可以通过,但音量会更低。
- 阶数高(例如,5 或 10): 截止点非常陡峭。几乎所有高于截止频率的声音都被有效地阻挡了。
数字频率(快速解释):
你可能想知道为什么截止频率是从 0 到 1 而不是以赫兹(Hz)为单位?这是因为在数字信号处理中,我们使用 数字频率 ,它是相对于信号采样率的归一化频率。你可以把它想象成信号中可能出现的最高频率的比例。归一化公式为:
数字频率 = 模拟频率 / 采样率
例如,如果你想在 10kHz 的采样率下截止 5kHz,那么你的数字截止频率将是 5000 Hz / 10000 Hz = 0.5。
如何选择参数:
-
确定截止频率(以赫兹为单位): 在你处理音频的情况下,这将是你想保留的最高音频频率。例如,对于 10kHz 的截止频率,你将使用这个值。
-
将截止频率转换为数字频率: 将截止频率除以音频文件的采样率。例如,如果你的音频是 44.1kHz,而你的截止频率是 10kHz,那么你的数字频率将是 10000 Hz / 44100 Hz ≈ 0.23。
-
选择阶数:
- 对于简单应用和较平滑的截止,从较低的阶数(例如,3 或 5)开始。
- 如果你需要一个非常陡峭的截止,请增加阶数。但请注意,阶数越高,计算量越大,并且可能会引入更多的失真。
在你的代码中:
-
你需要更正
Wn
以反映计算出的数字截止频率(如上所述)。 - 从较低的阶数开始进行试验,然后根据需要进行调整,直到你对你音频输出的截止陡峭程度感到满意为止。
请记住,设计滤波器通常需要反复试验才能找到最佳参数。在你的情况下,从低阶数开始,并逐渐增加,直到你对你音频的 10kHz 截止频率感到满意为止。祝你好运,享受音频处理吧!
标签:python,scipy,signal-processing,librosa From: 63320705