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