模板非类型参数常量限制过滤库

时间:2015-08-04 10:06:29

标签: c++ templates filtering signal-processing

我正在使用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,"%f\n",b);
    }

现在,如果我想在我的代码中使用这个库进行IIR过滤,以获得不同顺序的过滤器,如3,4,5等。我应该如何继续而不必重写整个代码?

因为order是编译时常量

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

是否有任何黑客可以为不同的订单编写此代码而无需重写所有内容?

谢谢,

3 个答案:

答案 0 :(得分:2)

似乎你想要模板功能:

kCMTimeZero

然后调用它:

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,"%f\n",b);
    }
}

答案 1 :(得分:1)

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

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?
    }
}

某些元编程可以自动,吃掉.eg的开关。一系列整数。但必须小心谨慎。您不希望将模板功能实例化十亿次......

答案 2 :(得分:0)

我在这里看到两个选项:

  • 将公共代码放在模板化函数中。它将在LowPass<order>类型;

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