| 25 | |
| 26 | template <typename T> |
| 27 | void real_1d_discrete_fourier_transform() |
| 28 | { |
| 29 | typedef exprtk::symbol_table<T> symbol_table_t; |
| 30 | typedef exprtk::expression<T> expression_t; |
| 31 | typedef exprtk::parser<T> parser_t; |
| 32 | typedef exprtk::function_compositor<T> compositor_t; |
| 33 | typedef typename compositor_t::function function_t; |
| 34 | |
| 35 | const T sampling_rate = 1024.0; // ~1KHz |
| 36 | const T N = 8 * sampling_rate; // 8 seconds worth of samples |
| 37 | |
| 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); |
| 40 | |
| 41 | exprtk::rtl::io::println<T> println; |
| 42 | |
| 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(); |
| 50 | |
| 51 | compositor_t compositor(symbol_table); |
| 52 | compositor.load_vectors(true); |
| 53 | |
| 54 | compositor.add( |
| 55 | function_t("dft_1d_real") |
| 56 | .var("N") |
| 57 | .expression |
| 58 | ( |
| 59 | " for (var k := 0; k < N; k += 1) " |
| 60 | " { " |
| 61 | " var k_real := 0.0; " |
| 62 | " var k_imag := 0.0; " |
| 63 | " " |
| 64 | " for (var i := 0; i < N; i += 1) " |
| 65 | " { " |
| 66 | " var theta := 2pi * k * i / N; " |
| 67 | " k_real += input[i] * cos(theta); " |
| 68 | " k_imag -= input[i] * sin(theta); " |
| 69 | " }; " |
| 70 | " " |
| 71 | " output[k] := hypot(k_real,k_imag); " |
| 72 | " } " |
| 73 | )); |
| 74 | |
| 75 | const std::string dft_program = |
| 76 | " " |
| 77 | " /* " |
| 78 | " Generate an aggregate waveform comprised of three " |
| 79 | " sine waves of varying frequencies and amplitudes. " |
| 80 | " */ " |
| 81 | " var frequencies[3] := { 100.0, 200.0, 300.0 }; /* Hz */ " |
| 82 | " var amplitudes [3] := { 10.0, 20.0, 30.0 }; /* Power */ " |
| 83 | " " |
| 84 | " for (var i := 0; i < N; i += 1) " |