我最近根据这里的建议实施了一个数字状态滤波器。我已经测试了该滤波器作为具有有限系数量化精度的非常低截止低通滤波器的性能,并且它完全按预期工作。但是,我只在时域中对其进行了测试。我还想根据它的频率响应来描述它。我使用Mason 的增益公式得出以下传递函数:
其中和是选择的常数(请参阅此链接)。根据该链接,是截止频率,是采样率,。这是滤波器的框图(取自 Microprocessors 的音乐应用程序)以供参考:
但是,当我绘制响应()时,它看起来并不像我预期的那样。这是用于绘图的 Python 代码:
import numpy as np
import matplotlib.pyplot as plt
fc = 1e1
fsample = 500e3
fnyquist = fsample / 2
q = 1 / np.sqrt(2)
Fc = 2 * np.sin(np.pi * fc / fsample)
Q = 1 / q
def tf(f):
w = 2 * np.pi * f
z = np.exp(-1 * 1j * w)
return (
Fc ** 2
* z
/ (1 - z * (2 - Q * Fc - Fc ** 2) + z ** 2 * (1 - Q * Fc))
)
freq = np.logspace(-10, np.log10(fnyquist), int(1e5))
resp = [20 * np.log10(abs(tf(f))) for f in freq]
_, ax = plt.subplots()
ax.plot(freq, resp)
ax.grid(b=True, which="major")
ax.set_ylim(-120, 10)
ax.set_xscale("log")
plt.show()
这是绘制的频率响应
形状如我所料(低通和低 q 值,12dB/oct. 滚降)。但是,截止频率大约是远低于我设置的。此外,我对频率响应中的尖峰有些不安,这是我没想到的。我是否错误地设置了这个滤波器,或者错误地计算了频率响应?这是我第一次使用 Mason 的增益公式,所以我可能做错了。为什么我在的增益?如何获得正确的截止频率?这些“尖峰”是否值得关注?为什么它们会出现,我该如何移除它们?