模板非类型参数常量限制筛选器库
Template non-type argument constant restriction Filter library
我正在使用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/
相关文章:
- #定义c-预处理器常量..我做错了什么
- 用C++中的一个变量定义一个常量
- 什么时候在C++中返回常量引用是个好主意
- 代理对象的常量正确性
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 通过多个头文件使用常量变量
- 在cuda线程之间共享大量常量数据
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 是默认情况下分配给char数组常量的值
- 私有类型的静态常量成员
- 类似枚举的计算常量
- 递归模板化函数不能分配给具有常量限定类型"const tt &"的变量"state"
- 为什么我可以通过引用修改常量返回
- 如何创建长度由常量参数指定的数组
- 当一个值是非常量但用常量表达式初始化时使用constexpr
- 返回常量对象引用 (getter) 和仅返回字符串有什么区别?
- 创建指向成员函数的非常量指针,以便进行 SDL 事件筛选
- 将 boost::log 严重性筛选器设置为调用函数,而不是使用常量严重性
- 模板非类型参数常量限制筛选器库