33 typedef typename compositor_t::function function_t;
35 const T sampling_rate = 1024.0;
36 const T N = 8 * sampling_rate;
38 std::vector<T> input (
static_cast<std::size_t
>(N),0.0);
39 std::vector<T> output(
static_cast<std::size_t
>(N),0.0);
43 symbol_table_t symbol_table;
44 symbol_table.add_vector (
"input" , input );
45 symbol_table.add_vector (
"output" , output );
46 symbol_table.add_function (
"println" , println );
47 symbol_table.add_constant (
"N" , N );
48 symbol_table.add_constant (
"sampling_rate", sampling_rate);
49 symbol_table.add_pi();
51 compositor_t compositor(symbol_table);
52 compositor.load_vectors(
true);
55 function_t(
"dft_1d_real")
59 " for (var k := 0; k < N; k += 1) "
61 " var k_real := 0.0; "
62 " var k_imag := 0.0; "
64 " for (var i := 0; i < N; i += 1) "
66 " var theta := 2pi * k * i / N; "
67 " k_real += input[i] * cos(theta); "
68 " k_imag -= input[i] * sin(theta); "
71 " output[k] := hypot(k_real,k_imag); "
75 const std::string dft_program =
78 " Generate an aggregate waveform comprised of three "
79 " sine waves of varying frequencies and amplitudes. "
81 " var frequencies[3] := { 100.0, 200.0, 300.0 }; /* Hz */ "
82 " var amplitudes [3] := { 10.0, 20.0, 30.0 }; /* Power */ "
84 " for (var i := 0; i < N; i += 1) "
86 " var time := i / sampling_rate; "
88 " for (var j := 0; j < frequencies[]; j += 1) "
90 " var frequency := frequencies[j]; "
91 " var amplitude := amplitudes [j]; "
92 " var theta := 2 * pi * frequency * time; "
94 " input[i] += amplitude * sin(theta); "
98 " dft_1d_real(input[]); "
100 " var freq_bin_size := sampling_rate / N; "
101 " var max_bin := ceil(N / 2); "
102 " var max_noise_level := 1e-5; "
104 " /* Normalise amplitudes */ "
105 " output /= max_bin; "
107 " println('1D Real DFT Frequencies'); "
109 " for (var k := 0; k < max_bin; k += 1) "
111 " if (output[k] > max_noise_level) "
113 " var freq_begin := k * freq_bin_size; "
114 " var freq_end := freq_begin + freq_bin_size; "
116 " println('Index: ', k,' ', "
117 " 'Freq. range: [', freq_begin, 'Hz, ', freq_end, 'Hz) ', "
118 " 'Amplitude: ', output[k]); "
123 expression_t expression;
124 expression.register_symbol_table(symbol_table);
127 parser.compile(dft_program,expression);