如何实现由该等式给出的带通滤波器?
Posted
技术标签:
【中文标题】如何实现由该等式给出的带通滤波器?【英文标题】:How do I implement a bandpass filter given by this equation? 【发布时间】:2011-12-01 09:13:32 【问题描述】:我在搞乱一些音频的东西,而我试图实现的算法调用公式给出的带通二阶 FIR 滤波器
H(z) = z - z^(-1)
如何在 C 中实现这样的带通滤波器?
我有原始音频数据以及可用的该音频数据的 FFT,但我仍然不确定如何实现此过滤器,也不确定方程式的确切含义。
在下图中,我正在尝试实现 HF3:
【问题讨论】:
什么是 z?浮点数?你的意思是^作为力量吗? (z 次方 -1) @Donotalo:不 - 这是一个 Z 变换,用于离散时间信号处理 - 请参阅:en.wikipedia.org/wiki/Z-transform 在算法中,函数用 ^ 作为幂(例如 z 减(z 到 -1 的幂)。 该算法似乎并没有说明它是否是时域滤波..确切的词是“典型的频率滤波技术被定义为”然后我在上面的问题中提到的方程给出。还有一点——方程实际上写成 Hf(z),而不是 H(z)。这是否意味着它建议进行频率滤波? @ch3rryc0ke:阅读上面关于 Z 变换的 Wikipedia 文章的链接 -H(z)
是离散时域滤波器的 Z 变换,即它使用差异在频域中实现滤波器离散时域中的方程。
【参考方案1】:
z^-1
是一个单位(一个样本)延迟,z
是未来一个样本。所以你在样本i
的滤波器输出取决于i-1
和i+1
的输入样本。 (一般你可以认为z^-n
是一个 n 样本延迟。)
如果您在输入缓冲区 x[]
中有时域样本,并且您希望将这些样本过滤到输出缓冲区 y[]
,那么您可以像这样实现给定的传递函数:
y[i] = x[i+1] - x[i-1]
例如在 C 中,您可能会像这样处理 N 个样本的缓冲区:
for (i = 1; i < N - 1; ++i)
y[i] = x[i + 1] - x[i - 1];
这是一个非常简单的一阶非递归高通滤波器 - 它在 +1 和 -1 处为零,因此幅度响应在 DC (0) 和 Nyquist (Fs / 2) 处为零,并且它峰值在 Fs / 4。所以它是一个非常宽的带通滤波器。
【讨论】:
我想得越多,我认为这个方程是在描述频率滤波,因为你提出的答案是一个高通滤波器,而算法需要一个带通滤波器。你的答案会如何变化那案子? @Paul R - 我认为这是一个带通。如果你把它写成 H(z) = 1-z^-2 (吸收偏移),它在 +/- 1 处有零。看看我的 bandpass-y。 @mtrw:我的错 - 是的,我想你可以把它看作一个带通滤波器,但它是一个非常广泛的 - 从 0 到 fs / 4 这几乎就是我所说的,一个差异化因素或高通滤波器,但响应在 fs / 4 处达到峰值,然后在 fs / 2 处降至 0。我会更新我的答案。 这张图片有帮助吗?它显示了 3 个潜在的过滤器及其图表,我正在尝试在这里实现 HF3 i43.tinypic.com/29202di.jpg @ch3rryc0ke - Paul R 上面的回答实现了 HF3。你应该很高兴。【参考方案2】:FIR 滤波器乘以系数并为每个输出数据样本累积一堆相邻的输入数据样本。系数的数量将与 Z 变换的正确大小上的 z 项的数量相同。
请注意,带通 FIR 滤波器通常需要更多项或系数,大致与所需的带通转换的陡度成正比,因此 2 个抽头可能对于任何有用的带通滤波来说都太短了。
【讨论】:
以上是关于如何实现由该等式给出的带通滤波器?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Scipy.signal.butter 实现带通巴特沃斯滤波器
STM32H7的DSP教程第39章 STM32H7的FIR带通滤波器实现(支持逐个数据的实时滤波)