我正在尝试根据以下步骤制作最小相位滤波器(在 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] :
这里是零:
几何平均值的想法是在意识到等波纹的响应不是完全等波纹之后出现的,所以添加到 h[M/2] 很棘手(你可以看到绿色的零点不太重叠)。这也给了我一个想法,即我也可以将它与非 equiripple 一起使用(pdf 意味着该方法只能在那里应用)。果然,结果如下:
当然,应该有必要使用 Kaiser(Dolph-Chebyshev,或指数,或 cosh)窗口来补偿阻带。这是一个带有汉明窗的简单示例:
我认为几何平均值() 是一个很好的选择,只要零点的间距相当均匀,否则在不重叠的零点(见绿色零点)之间进行选择会导致远离它们的中心。
在此之后,我得出结论,如果您需要最小相位 FIR,那么为了减少计算能力,使用逆切比雪夫 IIR 是安全的。就延迟而言,半阶最小相位可能是值得的,但与幅度匹配是一种痛苦。以下是 LTspice 的一些结果,显示了 N=64、线性和最小相位的两个 FIR,以及 N=11 和匹配衰减的逆切比雪夫 IIR(不是 Cauer,选择响应平坦度和相似性):
而且,为了比较起见,这里是 min.-ph 的阶段。FIR和inv。切布。IIR:
...以及所有三个的步骤响应: