2015-08-04 3 views
0

Я работаю с 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); 
    } 

Теперь, если я хочу использовать эту библиотеку в моем коде для фильтрации БЕЙ для различных порядков фильтра, как 3,4,5 и т.д. Как мне действовать без необходимости переписывать весь код?

Поскольку порядок компиляции постоянного время

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

Есть ли хак, с помощью которого я могу написать этот код для разных порядков, не переписывая каждую вещь?

Спасибо,

+0

Просто измените значение заказа – Marcel

ответ

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

Кажется, что вы хотите шаблон функции:

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); 
    } 
} 

затем вызвать его:

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

Я вижу два варианта здесь:

  • Помещенный общий код в шаблоне functio п. Он будет параметризован по типу LowPass<order>;

  • Если общий код не может войти в шаблонную функцию, вы можете использовать методы стирания типов. Но тогда вы понесете стоимость виртуального вызова функции. См http://www.cplusplus.com/articles/oz18T05o/

Смежные вопросы