模板非类型参数常量限制筛选器库

Template non-type argument constant restriction Filter library

本文关键字:筛选 常量 类型参数      更新时间:2023-10-16

我正在使用DSP滤波器库http://www.linux-usb-daq.co.uk/howto2/filter/

使用模板非类型参数初始化筛选器对象。这就是创建和使用过滤器对象的方式。

    const int order = 3;
    Iir::Butterworth::LowPass<order> f;
    const float samplingrate = 1000; // Hz
    const float cutoff_frequency = 50; // Hz
    f.setup (order, samplingrate, cutoff_frequency);
    f.reset ();
    FILE *fimpulse = fopen("lp.dat","wt");
// let's generate an input signal and filter it
    // instantly!
    for(int i=0;i<1000;i++) 
    {
            float a=0;
            if (i==10) a = 1; // delta pulse at t=10
            float b = f.filter(a);
            fprintf(fimpulse,"%fn",b);
    }

现在,如果我想在我的代码中使用这个库来对不同顺序的过滤器进行IIR过滤,如3、4、5等。我应该如何在不重写整个代码的情况下继续?

因为order是一个编译时间常数

const int order = 3;
Iir::Butterworth::LowPass<order> f;

有没有什么破解方法可以让我在不重写所有东西的情况下为不同的订单编写代码?

谢谢,

您似乎想要模板函数:

template <int order>
void filter_demo(/*args*/)
{
    Iir::Butterworth::LowPass<order> f;
    const float samplingrate = 1000; // Hz
    const float cutoff_frequency = 50; // Hz
    f.setup (order, samplingrate, cutoff_frequency);
    f.reset ();
    FILE *fimpulse = fopen("lp.dat","wt");
    // let's generate an input signal and filter it
    // instantly!
    for(int i=0;i<1000;i++) 
    {
            float a=0;
            if (i==10) a = 1; // delta pulse at t=10
            float b = f.filter(a);
            fprintf(fimpulse,"%fn",b);
    }
}

然后称之为:

filter_demo<3>();
filter_demo<4>();

如果我正确理解了你的问题,你需要两件事:像这样的模板函数

template <int order>
void my_filtering_function(...)
{
    Iir::Butterworth::LowPass<order> f;
    const float samplingrate = 1000; // Hz
...
}

可能还有一些运行时选择,比如这个

void exec_filter(int order)
{
    switch (order)
    {
    case 3: my_filtering_function<3>() ;
            break ;
    case 4: my_filtering_function<4>() ;
            break ;
     // othr cases?
    }
}

有些元编程可以自动切换,例如一系列整数。但必须小心行事。你不想安装你的模板功能十亿次。。。

我在这里看到两个选项:

  • 将通用代码放入模板化函数中。它将在LowPass<order>类型上进行参数化;

  • 如果通用代码无法进入模板化函数,则可以使用类型擦除技术。但是,您将承担虚拟函数调用的成本。看见http://www.cplusplus.com/articles/oz18T05o/