From ac8cb1b7c34e90a469e4b4b3a319198c3eb2b65b Mon Sep 17 00:00:00 2001 From: Federico Lolli <federico.lolli@skywarder.eu> Date: Tue, 19 Sep 2023 10:41:46 +0200 Subject: [PATCH] [FFT] improved fftfreq --- src/shared/algorithms/FFT.h | 10 ++++++---- src/tests/algorithms/FFT/test-fft-data.h | 12 ++++++------ src/tests/algorithms/FFT/test-fft.cpp | 2 +- 3 files changed, 13 insertions(+), 11 deletions(-) diff --git a/src/shared/algorithms/FFT.h b/src/shared/algorithms/FFT.h index 6b6228918..73fada1d8 100644 --- a/src/shared/algorithms/FFT.h +++ b/src/shared/algorithms/FFT.h @@ -40,7 +40,6 @@ template <int N_size> class FFT { public: - using VectorHF = Eigen::Vector<float, N_size / 2>; using VectorF = Eigen::Vector<float, N_size>; using VectorCF = Eigen::Vector<std::complex<float>, N_size>; @@ -90,18 +89,21 @@ public: /** * @brief Get the frequency used in the FFT - * (only the first half, useful for real input functions) * * @param sample_rate in Hertz * @return Eigen::Vector<std::complex<float>, N_size> */ - static const VectorHF fftfreq(float sample_rate) + static const VectorF fftfreq(float sample_rate) { - VectorHF bins = VectorHF::Zero(); + VectorF bins = VectorF::Zero(); for (int i = 0; i < N_size / 2; i++) { bins(i) = (float)i * sample_rate / (float)N_size; } + for (int i = N_size / 2; i < N_size; i++) + { + bins(i) = (float)(i - N_size) * sample_rate / (float)N_size; + } return bins; } diff --git a/src/tests/algorithms/FFT/test-fft-data.h b/src/tests/algorithms/FFT/test-fft-data.h index 3da338d51..b94fe266c 100644 --- a/src/tests/algorithms/FFT/test-fft-data.h +++ b/src/tests/algorithms/FFT/test-fft-data.h @@ -55,11 +55,11 @@ static const std::vector<float> INTENSITY{ 0.000000, 0.000000, 0.000000, 0.000000}; static const std::vector<float> FREQUENCY{ - 0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, - 12.0, 13.0, 14.0, 15.0, 16.0, 17.0, 18.0, 19.0, 20.0, 21.0, 22.0, 23.0, - 24.0, 25.0, 26.0, 27.0, 28.0, 29.0, 30.0, 31.0, 32.0, 31.0, 32.0, 33.0, - 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 41.0, 42.0, 43.0, 44.0, 45.0, - 46.0, 47.0, 48.0, 47.0, 48.0, 49.0, 50.0, 51.0, 52.0, 53.0, 54.0, 55.0, - 56.0, 57.0, 58.0, 59.0, 60.0, 61.0, 62.0, 63.0}; + 0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, + 12.0, 13.0, 14.0, 15.0, 16.0, 17.0, 18.0, 19.0, 20.0, 21.0, 22.0, 23.0, + 24.0, 25.0, 26.0, 27.0, 28.0, 29.0, 30.0, 31.0, -32.0, -31.0, -30.0, -29.0, + -28.0, -27.0, -26.0, -25.0, -24.0, -23.0, -22.0, -21.0, -20.0, -19.0, -18.0, + -17.0, -16.0, -15.0, -14.0, -13.0, -12.0, -11.0, -10.0, -9.0, -8.0, -7.0, + -6.0, -5.0, -4.0, -3.0, -2.0, -1.0}; } // namespace Boardcore diff --git a/src/tests/algorithms/FFT/test-fft.cpp b/src/tests/algorithms/FFT/test-fft.cpp index 1e4768573..369587860 100644 --- a/src/tests/algorithms/FFT/test-fft.cpp +++ b/src/tests/algorithms/FFT/test-fft.cpp @@ -44,7 +44,7 @@ int main() Vector<std::complex<float>, SAMPLES> fft_result = FFT<SAMPLES>::fft(signal_vector); - Vector<float, SAMPLES / 2> fft_freq = FFT<SAMPLES>::fftfreq(SAMPLE_RATE); + Vector<float, SAMPLES> fft_freq = FFT<SAMPLES>::fftfreq(SAMPLE_RATE); for (int i = 0; i < fft_result.size() / 2; i++) { -- GitLab