高通滤波器的方程式是什么?

6

我使用matlab制作了自己的低通滤波器,通过对信号数据进行移动平均来实现。但是如果移动平均创建了一个低通滤波器,那么如何设计高通滤波器的方程呢?我理解使用平均值作为低通滤波器的基础(高频将平均为零,但低频将平均为接近信号值的数字)。

但是是否有任何用于高通滤波器的方程式呢?


1
我在这里提供了一些低通和高通滤波器的示例,它们比简单移动平均类型的滤波器更具选择性:http://blog.bjornroche.com/2012/08/basic-audio-eqs.html - Bjorn Roche
2个回答

9
有很多方程式可以用来描述这个!也许最简单的一个是单样本延迟差分函数,
y[n] = x[n] - x[n-1]

或者,对其进行Z变换
H(z) = 1 - z^-1

“其中 H(z) = Y(z) / X(z) 是该滤波器的系统方程式。
使用 MatPlotLib(Python)和 AudioLazy,您可以输入以下内容来查看此高通滤波器的频率响应图。(免责声明:我是 AudioLazy 的作者)”
from audiolazy import z
(1 - z ** -1).plot().show()

简单高通滤波器
您可以将其应用于信号。
from audiolazy import z, Stream
filt = 1 - z ** -1
sig = Stream(1, 3, 1, -1, -3, -1) # Periodic signal
filt(sig).take(7)

导致前7个样本的结果:
[1.0, 2, -2, -2, -2, 2, 2]

可以在GNU Octave(或MatLab)中执行相同的操作:
filter([1, -1], [1], [1, 3, 1, -1, -3, -1, 1])

这句话的意思是“返回什么”。
[1, 2, -2, -2, -2, 2, 2]

这是一个FIR滤波器在6个采样周期的信号中,从[-3;3]幅度范围衰减到[-2;2]范围的示例。如果您使用12个样本的信号(更低的频率)进行尝试:
filt = 1 - z ** -1
sig = Stream(1, 2, 3, 2, 1, 0, -1, -2, -3, -2, -1, 0)
filt(sig).take(13)

现在的结果是另一个方波,但在[-1;1]范围内。您应该尝试使用正弦波进行相同的操作,这对于频率响应是有意义的,并且应该保持另一个具有相同频率的正弦波作为滤波器的输出。
您还可以在奈奎斯特频率处使用共振器,从而得到一个IIR滤波器。有几种其他的滤波器设计可以实现此目的(例如Butterworth、Chebyshev、Elliptical),以满足不同的需求。最小相位、线性相位、滤波器稳定性和最小化波动幅度是您在设计滤波器时可能具有的一些设计目标(或约束)。

1
很好的描述... diff 去除了直流基线! - Buck Thorn

9

一个非常简单的高通滤波器可以通过从原始数据中减去低通滤波器来构建。通过减去低能量内容,您将得到高能量内容,从而创建一个高通滤波器。希望这很直观。

data = %some data here
low_pass_data = %calc low pass here
high_pass_data = data - low_pass_data

请注意,@H.D.的答案更为详细,但可能对发帖者过于复杂。

3
如果低通滤波器没有延迟信号,那么这将起到不错的作用。 - Bjorn Roche
@BjornRoche 没错,OP提到使用移动平均LFP滤波器,不会引入延迟。 - PeterM
2
一个移动平均滤波器 (1 + z^-1 + ... + z^-(M-1))/M 需要知道它正在取平均值的 M 个样本的“前半部分”和“后半部分”,因此我们需要 M/2 个样本的滞后,使其成为因果性且居中于其正在计算平均值的位置,并需要延迟达到 z^-(M-1) - H.D.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接