diff --git a/psrdada_cpp/effelsberg/edd/test/SpectralKurtosisTester.hpp b/psrdada_cpp/effelsberg/edd/test/SpectralKurtosisTester.hpp index 9b4e0d08f9d576475ee8b49eeff10d247b281699..39f303abbafabf036260bdd719b94f0b41718f5c 100644 --- a/psrdada_cpp/effelsberg/edd/test/SpectralKurtosisTester.hpp +++ b/psrdada_cpp/effelsberg/edd/test/SpectralKurtosisTester.hpp @@ -1,6 +1,7 @@ #include "psrdada_cpp/common.hpp" -#include "psrdada_cpp/effelsberg/edd/test/SKTestVector.hpp" +#include "psrdada_cpp/effelsberg/edd/SKRfiReplacement.hpp" #include "psrdada_cpp/effelsberg/edd/SpectralKurtosis.hpp" +#include "psrdada_cpp/effelsberg/edd/test/SKTestVector.hpp" #include <gtest/gtest.h> namespace psrdada_cpp { @@ -13,7 +14,20 @@ class SpectralKurtosisTester: public ::testing::Test public: SpectralKurtosisTester(); ~SpectralKurtosisTester(); - + /** + * @brief creates SKTestVector class instance and generates test vector + * + */ + void test_vector_generation(std::size_t sample_size, std::size_t window_size, bool with_rfi, + float rfi_freq, float rfi_amp, const std::vector<int> &rfi_window_indices, + std::vector<std::complex<float>> &samples); + /** + * @brief creates SpectralKurtosis class instance and computes spectral kurtosis + * + */ + void sk_computation(std::size_t nch,std::size_t window_size, + const std::vector<std::complex<float>> &samples, + RFIStatistics &stat); protected: void SetUp() override; void TearDown() override; diff --git a/psrdada_cpp/effelsberg/edd/test/src/SpectralKurtosisTester.cpp b/psrdada_cpp/effelsberg/edd/test/src/SpectralKurtosisTester.cpp index 9296db1fc04c9bcb80267efd0a5dab020a7b1b7f..a6901b5570452131fe42e9f3d25a926cfe46ce97 100644 --- a/psrdada_cpp/effelsberg/edd/test/src/SpectralKurtosisTester.cpp +++ b/psrdada_cpp/effelsberg/edd/test/src/SpectralKurtosisTester.cpp @@ -22,66 +22,101 @@ void SpectralKurtosisTester::TearDown() { } -TEST_F(SpectralKurtosisTester, sk_window_size_chk) +void SpectralKurtosisTester::test_vector_generation(std::size_t sample_size, std::size_t window_size, + bool with_rfi, float rfi_freq, float rfi_amp, + const std::vector<int> &rfi_window_indices, + std::vector<std::complex<float>> &samples) { - bool with_rfi = 0; - std::size_t sample_size = 2000; - std::size_t window_size = 150; - SKTestVector tv(sample_size, window_size, with_rfi); - std::vector<int> rfi_ind{}; + SKTestVector tv(sample_size, window_size, with_rfi, rfi_freq, rfi_amp); + tv.generate_test_vector(rfi_window_indices, samples); +} + +void SpectralKurtosisTester::sk_computation(std::size_t nch, std::size_t window_size, + const std::vector<std::complex<float>> &samples, + RFIStatistics &stat) +{ + float sk_min = 0.8; + float sk_max = 1.2; + SpectralKurtosis sk(nch, window_size, sk_min, sk_max); + sk.compute_sk(samples, stat); +} + +TEST_F(SpectralKurtosisTester, sk_window_size_check) +{ + std::vector<int> rfi_window_indices{}; std::vector<std::complex<float>> samples; - tv.generate_test_vector(rfi_ind, samples); - - std::size_t nch = 1; - SpectralKurtosis sk(nch, window_size); + test_vector_generation(4000, 150, 0, 0, 0, rfi_window_indices, samples); + RFIStatistics stat; - sk.compute_sk(samples, stat); + try{ + sk_computation(1, 150, samples, stat); + FAIL() << "Expected std::runtime_error\n"; + } + catch(std::runtime_error const & err){ + EXPECT_EQ(err.what(), std::string("sample size is not a multiple of window_size. Give different window size\n")); + } } + TEST_F(SpectralKurtosisTester, sk_withoutRFI) { - bool with_rfi = 0; - std::size_t sample_size = 20000; - std::size_t window_size = 200; - SKTestVector tv(sample_size, window_size, with_rfi); - std::vector<int> rfi_ind{}; + std::vector<int> rfi_window_indices{}; std::vector<std::complex<float>> samples; - tv.generate_test_vector(rfi_ind, samples); //generate test vector - - std::size_t nch = 1; - float sk_min = 0.8; - float sk_max = 1.2; - SpectralKurtosis sk(nch, window_size, sk_min, sk_max); + test_vector_generation(40000, 400, 0, 0, 0, rfi_window_indices, samples); + RFIStatistics stat; - sk.compute_sk(samples, stat); //computing SK + sk_computation(1, 400, samples, stat); + float expected_rfi_fraction = 0; + EXPECT_EQ(expected_rfi_fraction, stat.rfi_fraction); } TEST_F(SpectralKurtosisTester, sk_withRFI) { + std::vector<int> rfi_window_indices{3, 4, 6, 7, 8, 20, 30, 40}; + std::vector<std::complex<float>> samples; + test_vector_generation(40000, 400, 1, 10, 1, rfi_window_indices, samples); + + RFIStatistics stat; + sk_computation(1, 400, samples, stat); + float expected_rfi_fraction = rfi_window_indices.size()/float(40000/400); + EXPECT_EQ(expected_rfi_fraction, stat.rfi_fraction); +} + +TEST_F(SpectralKurtosisTester, sk_replacement) +{ + //Test vector bool with_rfi = 1; std::size_t sample_size = 40000; std::size_t window_size = 400; - SKTestVector tv(sample_size, window_size, with_rfi); - std::vector<int> rfi_ind{1, 2, 5, 7, 9, 20, 30, 40}; + float rfi_freq = 10; + float rfi_amp = 1; + SKTestVector tv(sample_size, window_size, with_rfi, rfi_freq, rfi_amp); + std::vector<int> rfi_window_indices{1, 2, 3, 4, 6, 7, 8, 9, 20, 30, 40}; std::vector<std::complex<float>> samples; - tv.generate_test_vector(rfi_ind, samples); //generating test vector - + tv.generate_test_vector(rfi_window_indices, samples); //generating test vector + + //SK std::size_t nch = 1; float sk_min = 0.8; float sk_max = 1.2; - SpectralKurtosis sk(nch, window_size, sk_min, sk_max); RFIStatistics stat; + SpectralKurtosis sk(nch, window_size, sk_min, sk_max); sk.compute_sk(samples, stat); //computing SK - BOOST_LOG_TRIVIAL(info) <<"RFI status: "; - for(int ii = 0; ii< 10; ii++){ - printf("RFI[%d] = %d\n", ii, stat.rfi_status[ii]); - } + float expected_rfi_fraction = rfi_window_indices.size()/float(40000/400); + EXPECT_EQ(expected_rfi_fraction, stat.rfi_fraction); + + //RFI replacement + BOOST_LOG_TRIVIAL(info) <<"RFI replacement \n"; + SKRfiReplacement rr(samples, stat.rfi_status); + rr.replace_rfi_data(samples); + + //SK computation after RFI replacement + BOOST_LOG_TRIVIAL(info) <<"computing SK after RFI replacement.. \n"; + sk.compute_sk(samples, stat); //computing SK + float expected_val_after_rfi_replacement = 0; + EXPECT_EQ(expected_val_after_rfi_replacement, stat.rfi_fraction); } } //test } //edd } //effelsberg } //psrdada_cpp - - - -