
用于Linux,Mac OSX和Windows的无限冲动响应(IIR)滤波器库,该库实现了Butterworth,RBJ,Chebychev滤波器,并且可以轻松导入Python(Scipy)生成的系数。
过滤器通过样品处理数据样本以进行实时处理。
它使用模板分配所需的内存,以便可以在没有任何malloc / new命令的情况下运行。记忆是在编译时间分配的,因此永远不会有内存泄漏的风险。
所有实时过滤器代码都在标题文件中,该文件保证有效地集成到主程序中,并且编译器可以同时优化过滤器代码和主程序。
将以下内容添加到您的代码中:
#include "Iir.h"
一般的编码方法是,首先是实例化指定其顺序,然后使用函数setup设置参数,然后通过示例实时过滤将其用于示例。
这个想法是用模板参数在编译时间分配过滤器的内存,以避免任何新命令。这样可以防止内存泄漏,并且可以在编译时进行优化。提供给模板的order (例如,在这里使用低通滤波器):
Iir::Butterworth::LowPass<order> f;
由以下setup命令用作默认顺序,但如果需要,可以被较低顺序覆盖。
setup所有过滤器均以低通,高通,带通和带挡/凹槽过滤器的形式使用。 Butterworth/Chebyshev还提供具有指定的Pastband增益和0DB增益的低/高/带扣。
这些频率可以是模拟速率的模拟率,也可以是0..1/2之间的归一化率,其中1/2是奈奎斯特频率。请注意,归一化频率仅为F = f/fs,并且以1/样本为单位。在内部,库使用归一化频率,如果给出了设置命令,则简单地除以采样率。选择:
setup :采样率和模拟截止频率setupN :f = 0..1/2之间的1/样品中的归一化频率其中1/2 = nyquist。默认情况下, setup使用模板参数提供的顺序,但可以被较低的过滤器订单覆盖。
请参阅iir中的标题文件或有关setup命令参数的文档。
下面的示例是低通滤波器:
Butterworth.h标准过滤器适用于大多数应用。单调响应。 const int order = 4; // 4th order (=2 biquads)
Iir::Butterworth::LowPass<order> f;
const float samplingrate = 1000; // Hz
const float cutoff_frequency = 5; // Hz
f.setup (samplingrate, cutoff_frequency);
或指定0..1/2之间的归一化频率:
f.setupN(norm_cutoff_frequency);
ChebyshevI.h ,允许的Passband Ripple在DB中。 Iir::ChebyshevI::LowPass<order> f;
const float passband_ripple_in_db = 5;
f.setup (samplingrate,
cutoff_frequency,
passband_ripple_in_dB);
或指定0..1/2之间的归一化频率:
f.setupN(norm_cutoff_frequency,passband_ripple_in_dB);
ChebyshevII.h ,DB中最允许的停止带拒绝。 Iir::ChebyshevII::LowPass<order> f;
double stopband_ripple_in_dB = 20;
f.setup (samplingrate,
cutoff_frequency,
stopband_ripple_in_dB);
或指定0..1/2之间的归一化频率:
f.setupN(norm_cutoff_frequency,stopband_ripple_in_dB);
RBJ.h第二订单过滤器具有截止和Q因子。 Iir::RBJ::LowPass f;
const float cutoff_frequency = 100;
const float Q_factor = 5;
f.setup (samplingrate, cutoff_frequency, Q_factor);
或指定0..1/2之间的归一化频率:
f.setupN(norm_cutoff_frequency, Q_factor);
Custom.h ########
# Python
# See "elliptic_design.py" for the complete code.
from scipy import signal
order = 4
sos = signal.ellip(order, 5, 40, 0.2, 'low', output='sos')
print(sos) # copy/paste the coefficients over & replace [] with {}
///////
// C++
// part of "iirdemo.cpp"
const double coeff[][6] = {
{1.665623674062209972e-02,
-3.924801366970616552e-03,
1.665623674062210319e-02,
1.000000000000000000e+00,
-1.715403014004022175e+00,
8.100474793174089472e-01},
{1.000000000000000000e+00,
-1.369778997100624895e+00,
1.000000000000000222e+00,
1.000000000000000000e+00,
-1.605878925999785656e+00,
9.538657786383895054e-01}
};
const int nSOS = sizeof(coeff) / sizeof(coeff[0]); // here: nSOS = 2 = order / 2
Iir::Custom::SOSCascade<nSOS> cust(coeff);
样品被一个一个处理。在下面的示例中,样品x用过filter命令处理,然后保存在y中。 x和y的类型可以是浮动或双重的(也允许整数,但仍在内部处理为浮点):
y = f.filter(x);
然后,对于循环或事件处理程序中的每个传入样本,对此进行重复。
提供给setup()无效值将引发异常。提供给setup()参数,导致系数为NAN也将引发异常。
您可以通过CMAKE或您的程序中定义IIR1_NO_EXCEPTIONS来关闭Exection处理。
如果您使用cmake作为构建系统,则只需添加到您的CMakeLists.txt中的Dynamic Library以下几行:
find_package(iir)
target_link_libraries(... iir::iir)
或静态一个:
find_package(iir)
target_link_libraries(... iir::iir_static)
将其链接到动态库(UNIX/Mac: -liir ,Windows: iir.lib )或静态库(unix/mac: libiir_static.a ,Windows: libiir_static.lib )。
如果您正在使用Ubuntu LTS,则可以将此库作为预编译包装安装。
将此存储库添加到您的系统中:
sudo add-apt-repository ppa:berndporr/dsp
然后安装软件包:
sudo apt install iir1sudo apt install iir1-dev它可用于64位Intel和32,64位臂(Raspberry Pi等)。开发程序包和示例程序的文档在:
/usr/share/doc/iir1-dev/
构建工具是cmake ,它为不同平台生成制作或项目文件。 cmake可用于Linux,Windows和Mac。它还直接在覆盆子Pi上编译。
跑步
cmake .
生成makefile。然后运行:
make
sudo make install
在/usr/local/lib和/usr/local/include下安装它。
GCC和Clang均已测试。
cmake -G "Visual Studio 16 2019" -A x64 .
有关不同的建筑选择,请参见cmake 。以上是64位构建。然后开始视觉C ++并打开解决方案。这将创建DLL和LIB文件。在Windows下,强烈建议使用静态库并将其链接到应用程序程序。
通过键入make test或仅仅是ctest来运行单元测试。这些测试如果在三角洲脉冲后所有过滤器放松到零,则它们的输出永远不会变成NAN,并且直接形式I和II过滤器通过通过Scipy sosfilt的输出所产生的结果进行比较来计算预期序列。
您可以通过将IIR1_BUILD_TESTING设置为OFF来禁用测试的生成。
最简单的学习方法是从demo目录中的示例中。 Delta脉冲作为测试信号发送到不同的过滤器中并保存在文件中。使用Python脚本plot_impulse_fresponse.py ,您可以绘制频率响应。
您可以通过将IIR1_BUILD_DEMO设置为OFF来禁用演示的汇编。
此外,包含单元测试的目录还提供了每种过滤器类型的示例。
所有类,方法和特别setup功能的PDF都在docs/pdf目录中。
在线文档在这里:http://berndporr.github.io/iir1
这些响应是由iirdemo.cpp在/demo/ Directory中生成的,然后用plot_impulse_fresponse.py绘制。







该图书馆是从Vinnie Falco的出色原始作品中进一步开发的,可以在这里找到:
https://github.com/vinniefalco/dspfilters
虽然原始库处理音频阵列,但该库已改编成通过示例进行快速的实时处理示例。 setup命令不需要过滤顺序,而是从模板参数中记住它。类结构已简化,并记录了Doxygen的所有功能。如果参数是错误的,则不用让essert()语句抛出异常。任何需要优化的过滤器设计(例如椭圆滤波器)已被删除,而添加了一个函数,可以轻松从Scipy导入系数。
Bernd Porr -http://www.berndporr.me.uk