diff options
Diffstat (limited to 'demos/spectrum/fftreal/TestSpeed.hpp')
-rw-r--r-- | demos/spectrum/fftreal/TestSpeed.hpp | 223 |
1 files changed, 223 insertions, 0 deletions
diff --git a/demos/spectrum/fftreal/TestSpeed.hpp b/demos/spectrum/fftreal/TestSpeed.hpp new file mode 100644 index 0000000..e716b2a --- /dev/null +++ b/demos/spectrum/fftreal/TestSpeed.hpp @@ -0,0 +1,223 @@ +/***************************************************************************** + + TestSpeed.hpp + Copyright (c) 2005 Laurent de Soras + +--- Legal stuff --- + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; either +version 2.1 of the License, or (at your option) any later version. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*Tab=3***********************************************************************/ + + + +#if defined (TestSpeed_CURRENT_CODEHEADER) + #error Recursive inclusion of TestSpeed code header. +#endif +#define TestSpeed_CURRENT_CODEHEADER + +#if ! defined (TestSpeed_CODEHEADER_INCLUDED) +#define TestSpeed_CODEHEADER_INCLUDED + + + +/*\\\ INCLUDE FILES \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ + +#include "test_fnc.h" +#include "stopwatch/StopWatch.h" +#include "TestWhiteNoiseGen.h" + +#include <typeinfo> + +#include <cstdio> + + + +/*\\\ PUBLIC \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ + + + +template <class FO> +int TestSpeed <FO>::perform_test_single_object (FO &fft) +{ + assert (&fft != 0); + + int ret_val = 0; + + const std::type_info & ti = typeid (fft); + const char * class_name_0 = ti.name (); + + if (ret_val == 0) + { + perform_test_d (fft, class_name_0); + } + if (ret_val == 0) + { + perform_test_i (fft, class_name_0); + } + if (ret_val == 0) + { + perform_test_di (fft, class_name_0); + } + + if (ret_val == 0) + { + printf ("\n"); + } + + return (ret_val); +} + + + +template <class FO> +int TestSpeed <FO>::perform_test_d (FO &fft, const char *class_name_0) +{ + assert (&fft != 0); + assert (class_name_0 != 0); + + const long len = fft.get_length (); + const long nbr_tests = limit ( + static_cast <long> (NBR_SPD_TESTS / len / len), + 1L, + static_cast <long> (MAX_NBR_TESTS) + ); + + TestWhiteNoiseGen <DataType> noise; + std::vector <DataType> x (len, 0); + std::vector <DataType> s (len); + noise.generate (&x [0], len); + + printf ( + "%s::do_fft () speed test [%ld samples]... ", + class_name_0, + len + ); + fflush (stdout); + + stopwatch::StopWatch chrono; + chrono.start (); + for (long test = 0; test < nbr_tests; ++ test) + { + fft.do_fft (&s [0], &x [0]); + chrono.stop_lap (); + } + + printf ("%.1f clocks/sample\n", chrono.get_time_best_lap (len)); + + return (0); +} + + + +template <class FO> +int TestSpeed <FO>::perform_test_i (FO &fft, const char *class_name_0) +{ + assert (&fft != 0); + assert (class_name_0 != 0); + + const long len = fft.get_length (); + const long nbr_tests = limit ( + static_cast <long> (NBR_SPD_TESTS / len / len), + 1L, + static_cast <long> (MAX_NBR_TESTS) + ); + + TestWhiteNoiseGen <DataType> noise; + std::vector <DataType> x (len); + std::vector <DataType> s (len, 0); + noise.generate (&s [0], len); + + printf ( + "%s::do_ifft () speed test [%ld samples]... ", + class_name_0, + len + ); + fflush (stdout); + + stopwatch::StopWatch chrono; + chrono.start (); + for (long test = 0; test < nbr_tests; ++ test) + { + fft.do_ifft (&s [0], &x [0]); + chrono.stop_lap (); + } + + printf ("%.1f clocks/sample\n", chrono.get_time_best_lap (len)); + + return (0); +} + + + +template <class FO> +int TestSpeed <FO>::perform_test_di (FO &fft, const char *class_name_0) +{ + assert (&fft != 0); + assert (class_name_0 != 0); + + const long len = fft.get_length (); + const long nbr_tests = limit ( + static_cast <long> (NBR_SPD_TESTS / len / len), + 1L, + static_cast <long> (MAX_NBR_TESTS) + ); + + TestWhiteNoiseGen <DataType> noise; + std::vector <DataType> x (len, 0); + std::vector <DataType> s (len); + std::vector <DataType> y (len); + noise.generate (&x [0], len); + + printf ( + "%s::do_fft () / do_ifft () / rescale () speed test [%ld samples]... ", + class_name_0, + len + ); + fflush (stdout); + + stopwatch::StopWatch chrono; + + chrono.start (); + for (long test = 0; test < nbr_tests; ++ test) + { + fft.do_fft (&s [0], &x [0]); + fft.do_ifft (&s [0], &y [0]); + fft.rescale (&y [0]); + chrono.stop_lap (); + } + + printf ("%.1f clocks/sample\n", chrono.get_time_best_lap (len)); + + return (0); +} + + + +/*\\\ PROTECTED \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ + + + +/*\\\ PRIVATE \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ + + + +#endif // TestSpeed_CODEHEADER_INCLUDED + +#undef TestSpeed_CURRENT_CODEHEADER + + + +/*\\\ EOF \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ |