kfr

Fast, modern C++ DSP framework, FFT, Sample Rate Conversion, FIR/IIR/Biquad Filters (SSE, AVX, AVX-512, ARM NEON)
Log | Files | Refs | README

conversion.cpp (2585B)


      1 /**
      2  * KFR (https://www.kfrlib.com)
      3  * Copyright (C) 2016-2023 Dan Cazarin
      4  * See LICENSE.txt for details
      5  */
      6 
      7 #include <kfr/base/conversion.hpp>
      8 
      9 #include <kfr/base/basic_expressions.hpp>
     10 #include <kfr/base/simd_expressions.hpp>
     11 
     12 #include <kfr/base/reduce.hpp>
     13 
     14 namespace kfr
     15 {
     16 inline namespace CMT_ARCH_NAME
     17 {
     18 
     19 TEST(sample_conversion)
     20 {
     21     CHECK(convert_sample<float>(static_cast<i8>(-127)) == -1.f);
     22     CHECK(convert_sample<float>(static_cast<i8>(0)) == 0.f);
     23     CHECK(convert_sample<float>(static_cast<i8>(127)) == 1.f);
     24 
     25     CHECK(convert_sample<float>(static_cast<i16>(-32767)) == -1.f);
     26     CHECK(convert_sample<float>(static_cast<i16>(0)) == 0.f);
     27     CHECK(convert_sample<float>(static_cast<i16>(32767)) == 1.f);
     28 
     29     CHECK(convert_sample<float>(static_cast<i24>(-8388607)) == -1.f);
     30     CHECK(convert_sample<float>(static_cast<i24>(0)) == 0.f);
     31     CHECK(convert_sample<float>(static_cast<i24>(8388607)) == 1.f);
     32 
     33     CHECK(convert_sample<float>(static_cast<i32>(-2147483647)) == -1.f);
     34     CHECK(convert_sample<float>(static_cast<i32>(0)) == 0.f);
     35     CHECK(convert_sample<float>(static_cast<i32>(2147483647)) == 1.f);
     36 
     37     CHECK(convert_sample<i8>(-1.f) == -127);
     38     CHECK(convert_sample<i8>(0.f) == 0);
     39     CHECK(convert_sample<i8>(1.f) == 127);
     40 
     41     CHECK(convert_sample<i16>(-1.f) == -32767);
     42     CHECK(convert_sample<i16>(0.f) == 0);
     43     CHECK(convert_sample<i16>(1.f) == 32767);
     44 
     45     CHECK(convert_sample<i24>(-1.f) == -8388607);
     46     CHECK(convert_sample<i24>(0.f) == 0);
     47     CHECK(convert_sample<i24>(1.f) == 8388607);
     48 
     49     CHECK(convert_sample<i32>(-1.f) == -2147483647);
     50     CHECK(convert_sample<i32>(0.f) == 0);
     51     CHECK(convert_sample<i32>(1.f) == 2147483647);
     52 }
     53 
     54 TEST(sample_interleave_deinterleave)
     55 {
     56     const size_t size = 50;
     57     univector2d<float> in;
     58     in.push_back(truncate(counter() * 3.f + 0.f, size));
     59     in.push_back(truncate(counter() * 3.f + 1.f, size));
     60     in.push_back(truncate(counter() * 3.f + 2.f, size));
     61     univector<float> out(size * 3);
     62     interleave(out.data(), std::array<const float*, 3>{ in[0].data(), in[1].data(), in[2].data() }.data(), 3,
     63                size);
     64     CHECK(maxof(out - render(counter() * 1.f, out.size())) == 0);
     65 
     66     deinterleave(std::array<float*, 3>{ in[0].data(), in[1].data(), in[2].data() }.data(), out.data(), 3,
     67                  size);
     68 
     69     CHECK(absmaxof(in[0] - render(counter() * 3.f + 0.f, size)) == 0);
     70     CHECK(absmaxof(in[1] - render(counter() * 3.f + 1.f, size)) == 0);
     71     CHECK(absmaxof(in[2] - render(counter() * 3.f + 2.f, size)) == 0);
     72 }
     73 } // namespace CMT_ARCH_NAME
     74 } // namespace kfr