通过对信号数据进行移动平均,我在 matlab 中制作了自己的低通滤波器。但是,如果移动平均线创建了一个低通滤波器,那么究竟如何设计一个高通滤波器的方程呢?我理解关于使用平均值进行低通的直觉(高频将平均为零,但低频将平均为接近信号值的数字)。
但是有没有用于高通滤波器的方程?
通过对信号数据进行移动平均,我在 matlab 中制作了自己的低通滤波器。但是,如果移动平均线创建了一个低通滤波器,那么究竟如何设计一个高通滤波器的方程呢?我理解关于使用平均值进行低通的直觉(高频将平均为零,但低频将平均为接近信号值的数字)。
但是有没有用于高通滤波器的方程?
有很多方程式!也许最简单的一种是单样本延迟差分函数,
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]
这是 6 个样本周期信号中的 FIR 滤波器,在此示例中从[-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),以满足不同的需求。最小相位、线性相位、滤波器稳定性和最小化纹波幅度是您在设计滤波器时可以拥有的一些可能的设计目标(或约束)。
通过从原始数据中减去低通滤波器,可以构造一个非常简单的高通滤波器。通过减去低能量含量,您就得到了高能量含量,从而创建了一个高通滤波器。希望这是直观的。
data = %some data here
low_pass_data = %calc low pass here
high_pass_data = data - low_pass_data
请注意,@HD 有一个更广泛的答案,但认为它对于 OP 来说可能太复杂了。