31 template <
typename TestTraits>
32 FrequencyTimeTester<TestTraits>::FrequencyTimeTester()
36 template <
typename TestTraits>
37 FrequencyTimeTester<TestTraits>::~FrequencyTimeTester()
41 template <
typename TestTraits>
42 void FrequencyTimeTester<TestTraits>::SetUp()
46 template <
typename TestTraits>
47 void FrequencyTimeTester<TestTraits>::TearDown()
51 ALGORITHM_TYPED_TEST_P(FrequencyTimeTester, test_dimensions)
54 typedef typename TypeParam::DataType DataType;
55 data::DimensionSize<data::Time> number_of_spectra(10);
56 data::DimensionSize<data::Frequency> number_of_channels(10);
57 DataType ft_1(number_of_channels, number_of_spectra);
58 DataType ft_2(number_of_spectra, number_of_channels);
60 ASSERT_EQ(ft_1.number_of_channels(), number_of_channels);
61 ASSERT_EQ(ft_2.number_of_channels(), number_of_channels);
62 ASSERT_EQ(ft_1.number_of_spectra(), number_of_spectra);
63 ASSERT_EQ(ft_2.number_of_spectra(), number_of_spectra);
66 ALGORITHM_TYPED_TEST_P(FrequencyTimeTester, test_samples)
69 typedef typename TypeParam::DataType DataType;
70 data::DimensionSize<data::Time> number_of_spectra(10U);
71 data::DimensionSize<data::Frequency> number_of_channels(5U);
73 DataType ft(number_of_spectra, number_of_channels);
74 ASSERT_EQ(static_cast<std::size_t>(number_of_spectra), ft.number_of_spectra());
75 ASSERT_EQ(static_cast<std::size_t>(number_of_channels), ft.number_of_channels());
77 for(
unsigned sample_number=0; sample_number < ft.number_of_spectra(); ++sample_number) {
78 SCOPED_TRACE(
"sample = " + std::to_string(sample_number));
79 typename DataType::Spectra it = ft.spectrum(sample_number);
80 unsigned channel_count = 0U;
81 auto channel_it = it.begin();
82 while(channel_it != it.end()) {
86 ASSERT_EQ(static_cast<std::size_t>(number_of_channels), channel_count);
90 ALGORITHM_TYPED_TEST_P(FrequencyTimeTester, test_channel_frequencies_start_end)
93 data::DimensionSize<data::Time> number_of_spectra(1U);
94 data::DimensionSize<data::Frequency> number_of_channels(0);
95 typedef typename TypeParam::DataType DataType;
97 for(; number_of_channels < data::DimensionSize<data::Frequency>(5U); ++number_of_channels) {
98 DataType ft(number_of_spectra, number_of_channels);
99 auto f1 = 5.0 * boost::units::si::mega * boost::units::si::hertz;
100 auto delta = 1.0 * boost::units::si::mega * boost::units::si::hertz;
101 auto f2 = 12.0 * delta - f1;
103 ft.set_channel_frequencies_const_width( f1, delta );
105 auto generated = ft.channel_frequencies();
106 ASSERT_EQ(generated.size(), number_of_channels);
108 for(std::size_t i = 0U; i < number_of_channels; ++i) {
109 auto dif = (double)i * delta;
110 ASSERT_TRUE( f1 + dif == generated[i]) <<
"element " << i <<
" dif=" << dif <<
" generated=" << generated[i];
113 ft.set_channel_frequencies_const_width( f2, -1.0 * delta );
116 auto generated = ft.channel_frequencies();
117 ASSERT_EQ(generated.size(), number_of_channels);
118 for(std::size_t i = 0U; i < number_of_channels; ++i) {
119 ASSERT_TRUE( f2 - (
double)i * delta == generated[i]) <<
"element " << i;
125 ALGORITHM_TYPED_TEST_P(FrequencyTimeTester, test_low_high_freq)
128 typedef typename TypeParam::DataType DataType;
129 data::DimensionSize<data::Time> number_of_spectra(4U);
130 data::DimensionSize<data::Frequency> number_of_channels(10U);
132 DataType ft(number_of_spectra, number_of_channels);
133 typedef std::pair<typename DataType::FrequencyType, typename DataType::FrequencyType> ReturnType;
136 ReturnType r = ft.low_high_frequencies();
137 ASSERT_EQ(0.0, r.first.value());
138 ASSERT_EQ(0.0, r.second.value());
140 auto f1 =
typename DataType::FrequencyType(10.0 * boost::units::si::hertz);
141 auto f2 =
typename DataType::FrequencyType(20.0 * boost::units::si::hertz);
142 auto delta = (f2 - f1)/ (
double)(number_of_channels-1);
145 ft.set_channel_frequencies_const_width( f1, delta );
146 ASSERT_EQ(ft.channel_frequencies().size(), number_of_channels);
147 r = ft.low_high_frequencies();
148 ASSERT_EQ(f1, r.first);
149 ASSERT_EQ(f2, r.second);
152 ft.set_channel_frequencies_const_width( f2, -1.0 *delta );
153 ASSERT_EQ(ft.channel_frequencies().size(), number_of_channels);
154 r = ft.low_high_frequencies();
155 ASSERT_EQ(f1, r.first);
156 ASSERT_EQ(f2, r.second);
160 ALGORITHM_TYPED_TEST_P(FrequencyTimeTester, set_channel)
163 typedef typename TypeParam::DataType DataType;
165 data::DimensionSize<data::Time> number_of_spectra(3U);
166 data::DimensionSize<data::Frequency> number_of_channels(5U);
168 for(
unsigned set_channel=0; set_channel<number_of_channels; ++set_channel)
170 SCOPED_TRACE(set_channel);
171 DataType ft(number_of_spectra, number_of_channels);
172 ASSERT_EQ(ft.number_of_channels(), number_of_channels);
173 ASSERT_EQ(ft.number_of_spectra(), number_of_spectra);
175 ft.set_channel(set_channel, 1.0);
176 for(
unsigned channel_num=0; channel_num<number_of_channels; ++channel_num) {
177 SCOPED_TRACE(channel_num);
178 auto channel=ft.channel(channel_num);
179 auto channel_it = channel.begin();
180 ASSERT_EQ(channel.template dimension<data::Time>(), number_of_spectra);
181 ASSERT_EQ(channel.template dimension<data::Frequency>(), DimensionSize<data::Frequency>(1));
182 unsigned sample_count=0U;
183 while(channel_it != channel.end()) {
185 if(channel_num != set_channel) {
186 ASSERT_EQ(0.0, *channel_it);
189 ASSERT_EQ(1.0, *channel_it);
193 ASSERT_EQ(static_cast<std::size_t>(number_of_spectra), sample_count);
198 ALGORITHM_TYPED_TEST_P(FrequencyTimeTester, test_start_time_offset)
201 typedef typename TypeParam::DataType DataType;
203 data::DimensionSize<data::Time> number_of_spectra(100U);
204 data::DimensionSize<data::Frequency> number_of_channels(1U);
206 DataType ft(number_of_spectra, number_of_channels);
207 typename utils::ModifiedJulianClock::time_point epoch(utils::julian_day(50000.0));
208 typename DataType::TimeType interval(1.0 * boost::units::si::milli * boost::units::si::seconds);
209 ft.sample_interval(interval);
210 ft.start_time(epoch);
211 epoch += std::chrono::duration<double>(ft.sample_interval().value()*std::size_t(12));
212 ASSERT_EQ(ft.start_time(12L), epoch);
216 ALGORITHM_TYPED_TEST_P(FrequencyTimeTester, test_transpose)
219 typedef typename TypeParam::DataType DataType;
220 typedef data::TimeFrequency<Cpu, typename DataType::NumericalRep> TfDataType;
221 typedef data::FrequencyTime<Cpu, typename DataType::NumericalRep> FtDataType;
222 data::DimensionSize<data::Time> number_of_spectra(1024U);
223 data::DimensionSize<data::Frequency> number_of_channels(512U);
225 TfDataType tf(number_of_spectra, number_of_channels);
228 std::generate(tf.begin(), tf.end(), [&]() {
return val++; });
230 auto f1 =
typename data::TimeFrequency<Cpu, typename DataType::NumericalRep>::FrequencyType(100.0 * boost::units::si::hertz);
231 auto f2 =
typename data::TimeFrequency<Cpu, typename DataType::NumericalRep>::FrequencyType(200.0 * boost::units::si::hertz);
232 typename utils::ModifiedJulianClock::time_point epoch(utils::julian_day(50000.0));
233 auto delta = (f2 - f1)/ (
double)(number_of_channels-1);
235 tf.set_channel_frequencies_const_width( f1, delta);
236 tf.start_time(epoch);
240 ASSERT_EQ(tf.number_of_channels(), ft.number_of_channels());
241 ASSERT_EQ(tf.number_of_spectra(), ft.number_of_spectra());
242 ASSERT_EQ(tf.number_of_spectra(), ft.number_of_spectra());
243 ASSERT_EQ(tf.start_time(), ft.start_time());
245 for(std::size_t i = 0U; i < ft.channel_frequencies().size(); ++i) {
246 ASSERT_EQ(ft.channel_frequencies()[i], ft.channel_frequencies()[i]);
249 for(
unsigned i=0; i < tf.number_of_spectra(); ++i)
252 typename TfDataType::Spectra tf_spectrum = tf.spectrum(i);
253 auto tf_channel_it = tf_spectrum.begin();
254 typename FtDataType::Spectra ft_spectrum = ft.spectrum(i);
255 auto ft_channel_it = ft_spectrum.begin();
256 while(tf_channel_it != tf_spectrum.end())
258 ASSERT_EQ(*tf_channel_it, *ft_channel_it);
267 REGISTER_TYPED_TEST_CASE_P(FrequencyTimeTester, test_dimensions, test_samples, test_channel_frequencies_start_end, test_low_high_freq, set_channel, test_start_time_offset, test_transpose);
Some limits and constants for FLDO.