35 const std::string sgfilter_program =
43 " if (v_in[] >= weight[]) "
45 " const var lower_bound := trunc(weight[] / 2); "
46 " const var upper_bound := v_in[] - lower_bound; "
50 " for (var i := lower_bound; i < upper_bound; i += 1) "
52 " for (var j := -lower_bound; j <= lower_bound; j += 1) "
54 " v_out[i] += weight[j + lower_bound] * v_in[i + j]; "
58 " v_out /= sum(weight); "
61 const std::size_t n = 1024;
66 const T
pi = T(3.141592653589793238462643383279502);
68 srand(
static_cast<unsigned int>(time(0)));
71 for (T t = T(-5); t <= T(+5); t += T(10.0 / n))
73 const T noise = T(0.5 * (rand() / (RAND_MAX + 1.0) - 0.5));
74 v_in.push_back(sin(2.0 *
pi * t) + noise);
77 v_out.resize(v_in.size());
79 symbol_table_t symbol_table;
80 symbol_table.add_vector(
"v_in" , v_in );
81 symbol_table.add_vector(
"v_out", v_out);
83 expression_t expression;
84 expression.register_symbol_table(symbol_table);
87 parser.compile(sgfilter_program,expression);
91 for (std::size_t i = 0; i < v_out.size(); ++i)
93 printf(
"%10.6f\t%10.6f\n", v_in[i], v_out[i]);