我正在使用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;
是否有任何黑客可以为不同的订单编写此代码而无需重写所有内容?
谢谢,
答案 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/