如何设计非常窄带、非常锐利的低通滤波器——只需要 DC?

信息处理 低通滤波器 抽取 有限脉冲响应
2022-02-05 20:30:40

我正在使用 DSP 处理器对 108kHz 的信号进行采样,我只想从中取出直流部分。使用如此高的采样率是因为我想使用过采样来减少量化噪声。

将设计两个过滤器:

  • 一种具有 10Hz 阻带频率;每 0.1 秒读取一次新数据;
  • 一种具有 0.1Hz 阻带频率;每 10 秒读取一次新数据;

我做了什么

我使用了几个阶段的抽取并将信号下采样到 300Hz。然后我使用 FIR 过滤信号:

  • 对于 10Hz 带宽:使用 128 级滤波器
  • 对于 0.1Hz 带宽:使用 768 级滤波器。

我的问题

性能对我来说最重要:低通滤波器越清晰越好。

  • 我可以就实施这样的过滤器征求建议吗?
  • 是否可以设计一个 0.01Hz 的低通滤波器?如果是这样,可以每 100 秒读取一次新数据吗?
  • 我听说使用 IIR 可能是一种解决方案,是吗?

非常感谢你!

平均是最好的直流滤波器吗?

我试图与matlab进行比较:

设置 1: %使用 Matlab fir1 函数

大小 = 1080000;h = fir1(大小,0.00000000001);fvtool(h) FIR1

设置 2:%建立平均 FIR

大小 = 1080000;h = 个(1,大小);h = h *1/尺寸;fvtool(h) 平均的

理论上应该是两种设置都具有相似的性能。然而,fir1 的阻带似乎比简单平均滤波器窄。似乎平均直流滤波器将包含更多噪声。

4个回答

的傅立叶变换的定义x(t)

X(f)x(t)ej2πftdt

评估你会看到f=0

X(0)=x(t)dt

如您所见,DC 处的值等于函数的面积。

的函数的定积分等于原点的变换。X(0)

如果您没有流数据,这可能会对您有所帮助。无需使用尖锐的低通滤波器或进行傅立叶变换并提取,只需整合您的数据,结果就相当于获得X(0)X(0)

如果您要做的只是估计数据的直流分量,那么您可以简单地获得单位时间内信号的平均值。这可以通过查看用于计算“f=0”(直流分量)的傅立叶系数的表达式来轻松显示。

最简单的方法是通过移动平均过滤器(http://en.wikipedia.org/wiki/Moving_average),它可以在缓冲区上工作。

就 FIR 滤波器而言,这看起来像 'h = one(1,Nbuff)./Nbuff'(因此,对于 2 个样本缓冲区,'h=[0.5,0.5]')。'Nbuff' 代表过滤器的顺序。这可以通过处理器命令集提供的卷积函数直接应用于您从 CODEC 获得的缓冲区。

您还可以使用“在线算法”(本质上是 IIR 滤波器),它在每个样本的基础上保持对信号平均值的更新估计。为此,请参阅:http ://en.wikipedia.org/wiki/Algorithms_for_calculating_variance#Online_algorithm您还可以设计一个“典型”IIR 滤波器,只要您的处理器和采样周期能够适应需要计算。

(当然,您可以在框架工作和单个样本工作之间进行调整)

请注意,我有一种感觉,您正在为群延迟的概念而苦苦挣扎。过滤器的截止频率并不完全意味着“每 100 秒可以读取一次新数据”。新数据将以系统的采样率不断地馈送到您的滤波器,但系统输入和输出之间信号的每个谐波分量引起的相位延迟可能会有所不同。这如何变化取决于系统的类型(无论是 FIR / IIR)及其形式。这是一个起点:http ://en.wikipedia.org/wiki/Group_delay_and_phase_delay

希望这可以帮助。

) 的低通滤波器都是 DC 提取滤波器的候选者。这种“获得直流”滤波器问题与“直流阻塞滤波器”问题非常等效和互补H(1)=1

我不明白你为什么不为你的 LPF 使用低得多的 IIR 滤波器。使用 IIR 滤波器,您无需 768 个抽头(以及大概 768 个乘法累加指令)就可以变得清晰。

排除(目前)滤波器的成本,权衡是在稳定的 DC 输出和 DC 值实际发生变化时的响应能力之间。当输入中的实际直流发生变化时,您需要多快的直流滤波器来适应?

那么,一个简单的一阶、1 极点 IIR 滤波器有什么问题,您对接近 1 的系数有点小心?

y[n]=(1p)x[n]+py[n1]

其中p=cos(ω0)=cos(π0.154000)

而不是来表达整个事情1pp

y[n]=(1p)x[n]+py[n1]=y[n1]+(1p)(x[n]y[n1])=y[n1]+2sin2(ω02)(x[n]y[n1])

其中或任何在同一邻域。ω01π