我在哪里可以获得 Parks-McClellan 最优 FIR 滤波器设计算法的开源实现?

信息处理 过滤器 过滤器设计 有限脉冲响应 软件实现 帕克斯-麦克莱伦
2021-12-22 00:44:06

背景:我经常做某种需要独特滤波器的信号处理任务。通常此时我会去 MATLAB 并使用生成一个新的唯一过滤器。MATLAB函数实现了 Parks-McClellan 算法。现在我有一个过滤器,我将过滤器放入一个硬编码的数组中。但问题是我现在有一个硬编码过滤器,它只适用于一种场景。firpm()firpm()

问题:我现在可以解决我的信号处理问题了……但仅适用于非常特定的单个采样率或特定场景。

目标:我希望能够从 C 代码或其他语言调用并使我的信号处理代码更通用。我找不到 ! 的开源实现firpm()firpm()

我在哪里可以获得Parks-McClellan 最优 FIR 滤波器设计算法(在 MATLAB 中又名的开源实现?firpm()

  • PS我知道我可以使用窗口或其他方式设计不同的过滤器......随时在评论中提及这些。但这个问题的重点不是要问“其他滤波器设计技术是什么?” ... 或类似的开源实现。firpm()

  • PPS这个问题的目标之一是通过首先查看代码来了解 Parks-McClellan 算法的工作原理,然后我计划阅读一些背景理论。

4个回答

在 GNU Octave 中有一个 Parks-McClellan(也称为 Remez 交换算法)的开源实现,这是一个类似 MATLAB 环境的免费软件实现。该函数名为“remez”,包含在位于Octave-Forge的“signal”包中。如果您下载该软件包,您将找到“remez.cc”,这是该算法的 C++ 实现。

Octave 的一个优点是它几乎与 MATLAB 代码兼容,因此如果您愿意,您可以轻松地将代码移植到那里使用。这是深入了解 MATLAB 中以 MEX 形式提供的算法实现的好方法。

这是 Remez 交换算法的LGPL 版本八度码似乎是从中派生出来的。它是从维基百科页面Parks McClellan页面链接的。
原始的 Janovetz 代码可能更容易在您的项目中使用,因为它没有 octave 调用,但明智的做法是在octave-forge svn更改日志中挖掘有关 remez.cc 文件中的错误修复或加速的任何信息.

一个方便的版本可以在 Python 的scipy.signal.remez中找到。如果使用 numpy/scipy 很好。

这是 C 语言中 Parks McClellan 算法的另一个来源。此代码与上面提到的 SciPy 代码不同,它删除了原来的 69 个 goto 语句中的 61 个(SciPy 代码仍然有大约 37 个 goto)。它还修复了 3 个可能发生除以零的位置的代码,并且它有一些额外的代码来检查波段边缘值。

http://www.iowahills.com/A7ExampleCodePage.html