最小相位 FIR 方法

信息处理 过滤器设计 有限脉冲响应 阶段 数字滤波器 最小相位
2022-01-29 06:14:19

我正在尝试根据以下步骤制作最小相位滤波器(在 wxMaxima 中):

  • 首先创建一个“正常” FIR(一个简单的 sinc,wc=0.4,随机示例,但在图片中使用 Octave 的 remez)

  • 计算零点(allroots() 函数)

  • 删除单位圆外的零点(任何>1/0.98,公差&co)

  • 删除单位圆上一半的零(共轭对,0.98 < x < 1/0.98)

  • 重构多项式 => 系数。

据我了解,这些是要遵循的正确步骤,但这就是我得到的:

脉冲响应频率响应

只有当我不删除一半的零时如果我这样做,无论我如何排序、选择等,我都会得到虚假的结果。这是实现最小阶段的正确方法吗?如果需要,我可以提供 wxMaxima 方法(我首先测试了它是否可以重建原始脉冲并且我可以做到,因此获得系数不是问题,而是如何获得)。


我想在那天晚些时候添加这个,但很忙。这是一张显示四个滤波器的频率响应的图表,忽略衰减的明显丑陋,它只是一个例子。第 2 个是通过零反转(和加倍),第 3 个是通过频谱分解,第 4 个类似于第 3 个,仅通过相邻零之间的几何平均值完成,以避免手动调整将 DC 偏移添加到 h[M/2] :

4 个滤波器的频率响应

这里是零:

四种类型的零

几何平均值的想法是在意识到等波纹的响应不是完全等波纹之后出现的,所以添加δ2到 h[M/2] 很棘手(你可以看到绿色的零点不太重叠)。这也给了我一个想法,即我也可以将它与非 equiripple 一起使用(pdf 意味着该方法只能在那里应用)。果然,结果如下:

非等波纹

当然,应该有必要使用 Kaiser(Dolph-Chebyshev,或指数,或 cosh)窗口来补偿阻带。这是一个带有汉明窗的简单示例:

非等波纹,汉明窗

我认为几何平均值(z1z2) 是一个很好的选择,只要零点的间距相当均匀,否则在不重叠的零点(见绿色零点)之间进行选择会导致远离它们的中心。

在此之后,我得出结论,如果您需要最小相位 FIR,那么为了减少计算能力,使用逆切比雪夫 IIR 是安全的。就延迟而言,半阶最小相位可能是值得的,但与幅度匹配是一种痛苦。以下是 LTspice 的一些结果,显示了 N=64、线性和最小相位的两个 FIR,以及 N=11 和匹配衰减的逆切比雪夫 IIR(不是 Cauer,选择响应平坦度和相似性):

黑色 - 线性 FIR,红色 - 最小值  博士。 FIR 相同的 N,蓝色 - inv。 切布。 N=11 作为=55

而且,为了比较起见,这里是 min.-ph 的阶段。FIR和inv。切布。IIR:

红色 - min.-ph。 FIR,蓝色-inv。 切布。 IIR

...以及所有三个的步骤响应:

黑色 - lin.-ph。 FIR,红色 - min.-ph。 FIR,蓝色-inv。 切布。 IIR

1个回答

您制作了一个最小相位滤波器,但幅度响应与原始线性相位滤波器不同。为了保持大小不变​​,您必须做的是将单位圆外的零点反映到圆中。由于对于线性相位滤波器,零点相对于单位圆(或在圆上)是对称的,因此您只需将单位圆内的每个零加倍并保持圆上的零点不变。除了将圆圈内的每个零加倍之外,您还需要应用比例因子1/zi对于每个被反映的零(其中zi是零的位置)。

所以线性相位滤波器的每一对零点(假设|zi|<1)

(1ziz1)(1z1/zi)

需要用以下缩放的双零替换:

1|zi|(1ziz1)2

这将保持幅度不变,同时将线性相位函数转换为最小相位函数。