diff options
author | Daniil Cherednik <dan.cherednik@gmail.com> | 2024-07-09 21:55:23 +0000 |
---|---|---|
committer | Daniil Cherednik <dan.cherednik@gmail.com> | 2024-07-09 22:08:38 +0000 |
commit | f1c9056c40e22b6aea21da5281e469b93a334778 (patch) | |
tree | 8d6658c4fdbf4d25d3a593fba14b93ac158a4cd0 /src/lib | |
parent | 73619bbbcd1f0c3d6ff3cada2b06379031f856b7 (diff) | |
parent | c4b19af8391640f143aaf446658354dcf01432d1 (diff) | |
download | atracdenc-f1c9056c40e22b6aea21da5281e469b93a334778.tar.gz |
Merge branch 'master' into at3plus-dev
Diffstat (limited to 'src/lib')
-rw-r--r-- | src/lib/bitstream/bitstream.h | 3 | ||||
-rw-r--r-- | src/lib/fft/kissfft_impl/kiss_fft.h | 1 | ||||
-rw-r--r-- | src/lib/mdct/mdct_ut.cpp | 37 | ||||
-rw-r--r-- | src/lib/mdct/mdct_ut_common.h | 28 |
4 files changed, 56 insertions, 13 deletions
diff --git a/src/lib/bitstream/bitstream.h b/src/lib/bitstream/bitstream.h index cfba790..2e71c02 100644 --- a/src/lib/bitstream/bitstream.h +++ b/src/lib/bitstream/bitstream.h @@ -17,9 +17,10 @@ */ #pragma once -#include <vector> +#include <cstdint> #include <iostream> +#include <vector> namespace NBitStream { diff --git a/src/lib/fft/kissfft_impl/kiss_fft.h b/src/lib/fft/kissfft_impl/kiss_fft.h index 7786eb6..64c50f4 100644 --- a/src/lib/fft/kissfft_impl/kiss_fft.h +++ b/src/lib/fft/kissfft_impl/kiss_fft.h @@ -44,7 +44,6 @@ extern "C" { #else # ifndef kiss_fft_scalar /* default is float */ -# error "wrong type" # define kiss_fft_scalar float # endif #endif diff --git a/src/lib/mdct/mdct_ut.cpp b/src/lib/mdct/mdct_ut.cpp index 31f6f81..6f49b59 100644 --- a/src/lib/mdct/mdct_ut.cpp +++ b/src/lib/mdct/mdct_ut.cpp @@ -17,6 +17,7 @@ */ #include "mdct.h" +#include "mdct_ut_common.h" #include <gtest/gtest.h> #include <vector> @@ -35,7 +36,7 @@ static vector<TFloat> mdct(TFloat* x, int N) { res.push_back(sum); } return res; -} +} static vector<TFloat> midct(TFloat* x, int N) { vector<TFloat> res; @@ -59,8 +60,9 @@ TEST(TMdctTest, MDCT32) { const vector<TFloat> res1 = mdct(&src[0], N/2); const vector<TFloat> res2 = transform(&src[0]); EXPECT_EQ(res1.size(), res2.size()); + auto eps = CalcEps(N); for (int i = 0; i < res1.size(); i++) { - EXPECT_NEAR(res1[i], res2[i], 0.0000000001); + EXPECT_NEAR(res1[i], res2[i], eps); } } @@ -74,8 +76,9 @@ TEST(TMdctTest, MDCT64) { const vector<TFloat> res1 = mdct(&src[0], N/2); const vector<TFloat> res2 = transform(&src[0]); EXPECT_EQ(res1.size(), res2.size()); + auto eps = CalcEps(N); for (int i = 0; i < res1.size(); i++) { - EXPECT_NEAR(res1[i], res2[i], 0.0000000001); + EXPECT_NEAR(res1[i], res2[i], eps); } } @@ -89,8 +92,9 @@ TEST(TMdctTest, MDCT128) { const vector<TFloat> res1 = mdct(&src[0], N/2); const vector<TFloat> res2 = transform(&src[0]); EXPECT_EQ(res1.size(), res2.size()); + auto eps = CalcEps(N * 4); for (int i = 0; i < res1.size(); i++) { - EXPECT_NEAR(res1[i], res2[i], 0.0000000001); + EXPECT_NEAR(res1[i], res2[i], eps); } } @@ -104,8 +108,9 @@ TEST(TMdctTest, MDCT256) { const vector<TFloat> res1 = mdct(&src[0], N/2); const vector<TFloat> res2 = transform(&src[0]); EXPECT_EQ(res1.size(), res2.size()); + auto eps = CalcEps(N * 4); for (int i = 0; i < res1.size(); i++) { - EXPECT_NEAR(res1[i], res2[i], 0.00000001); + EXPECT_NEAR(res1[i], res2[i], eps); } } @@ -113,14 +118,17 @@ TEST(TMdctTest, MDCT256_RAND) { const int N = 256; TMDCT<N> transform(N); vector<TFloat> src(N); + TFloat m = 0.0; for (int i = 0; i < N; i++) { src[i] = rand(); + m = std::max(m, src[i]); } const vector<TFloat> res1 = mdct(&src[0], N/2); const vector<TFloat> res2 = transform(&src[0]); EXPECT_EQ(res1.size(), res2.size()); + auto eps = CalcEps(m * 8); for (int i = 0; i < res1.size(); i++) { - EXPECT_NEAR(res1[i], res2[i], 0.01); + EXPECT_NEAR(res1[i], res2[i], eps); } } @@ -134,8 +142,9 @@ TEST(TMdctTest, MIDCT32) { const vector<TFloat> res1 = midct(&src[0], N/2); const vector<TFloat> res2 = transform(&src[0]); EXPECT_EQ(res1.size(), res2.size()); + auto eps = CalcEps(N); for (int i = 0; i < N; i++) { - EXPECT_NEAR(res1[i], res2[i], 0.0000000001); + EXPECT_NEAR(res1[i], res2[i], eps); } } @@ -149,8 +158,9 @@ TEST(TMdctTest, MIDCT64) { const vector<TFloat> res1 = midct(&src[0], N/2); const vector<TFloat> res2 = transform(&src[0]); EXPECT_EQ(res1.size(), res2.size()); + auto eps = CalcEps(N); for (int i = 0; i < N; i++) { - EXPECT_NEAR(res1[i], res2[i], 0.0000000001); + EXPECT_NEAR(res1[i], res2[i], eps); } } @@ -164,8 +174,9 @@ TEST(TMdctTest, MIDCT128) { const vector<TFloat> res1 = midct(&src[0], N/2); const vector<TFloat> res2 = transform(&src[0]); EXPECT_EQ(res1.size(), res2.size()); + auto eps = CalcEps(N); for (int i = 0; i < N; i++) { - EXPECT_NEAR(res1[i], res2[i], 0.0000000001); + EXPECT_NEAR(res1[i], res2[i], eps); } } @@ -179,8 +190,9 @@ TEST(TMdctTest, MIDCT256) { const vector<TFloat> res1 = midct(&src[0], N/2); const vector<TFloat> res2 = transform(&src[0]); EXPECT_EQ(res1.size(), res2.size()); + auto eps = CalcEps(N * 2); for (int i = 0; i < N; i++) { - EXPECT_NEAR(res1[i], res2[i], 0.000000001); + EXPECT_NEAR(res1[i], res2[i], eps); } } @@ -188,13 +200,16 @@ TEST(TMdctTest, MIDCT256_RAND) { const int N = 256; TMIDCT<N> transform(N); vector<TFloat> src(N); + TFloat m = 0.0; for (int i = 0; i < N/2; i++) { src[i] = rand(); + m = std::max(m, src[i]); } const vector<TFloat> res1 = midct(&src[0], N/2); const vector<TFloat> res2 = transform(&src[0]); EXPECT_EQ(res1.size(), res2.size()); + auto eps = CalcEps(m * 4); for (int i = 0; i < N; i++) { - EXPECT_NEAR(res1[i], res2[i], 0.01); + EXPECT_NEAR(res1[i], res2[i], eps); } } diff --git a/src/lib/mdct/mdct_ut_common.h b/src/lib/mdct/mdct_ut_common.h new file mode 100644 index 0000000..5c1096c --- /dev/null +++ b/src/lib/mdct/mdct_ut_common.h @@ -0,0 +1,28 @@ +/* + * This file is part of AtracDEnc. + * + * AtracDEnc 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. + * + * AtracDEnc 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 AtracDEnc; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#pragma once + +#include "mdct.h" + +// Calculate value of error for given magnitude +inline TFloat CalcEps(TFloat magn) { + const float snr = (sizeof(TFloat) == 4) ? -114.0 : -240.0; + return magn * pow(10, (snr / 20.0)); +} + |