</p> <!-- /wp:paragraph --> <!-- wp:code --> <pre class="wp-block-code"><code> #include <iostream> #include <fftw3.h> #include <cmath> #include <vector> #include <algorithm> int main() { int N = 8; std::vector<double> x = {0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0}; std::vector<double> y = {1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0}; fftw_complex *in, *out; in = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * N); out = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * N); for (int i = 0; i < N; i++) { in[i][0] = y[i]; in[i][1] = 0.0; } fftw_plan p = fftw_plan_dft_1d(N, in, out, FFTW_FORWARD, FFTW_ESTIMATE); fftw_execute(p); std::vector<double> power_spectrum(N); for (int i = 0; i < N; i++) { power_spectrum[i] = out[i][0] * out[i][0] + out[i][1] * out[i][1]; } int n = 3; std::vector<int> indices(N); for (int i = 0; i < N; i++) { indices[i] = i; } std::sort(indices.begin(), indices.end(), [&power_spectrum](int i1, int i2) { return power_spectrum[i1] > power_spectrum[i2]; }); std::vector<bool> keep(N, false); for (int i = 0; i < n; i++) { keep[indices[i]] = true; } for (int i = 0; i < N; i++) { if (!keep[i]) { out[i][0] = 0.0; out[i][1] = 0.0; } } fftw_plan p_inverse = fftw_plan_dft_1d(N, out, in, FFTW_BACKWARD, FFTW_ESTIMATE); fftw_execute(p_inverse); std::cout << "Filtered signal (real part):" << std::endl; for (int i = 0; i < N; i++) { std::cout << in[i][0] / N << std::endl; } fftw_destroy_plan(p); fftw_destroy_plan(p_inverse); fftw_free(in); fftw_free(out); return 0; } </code></pre> <!-- /wp:code --> <!-- wp:paragraph --> <p>