blob: 0e3decb47748746e2f8be376156481b32d7bdf85 [file] [log] [blame]
// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "garnet/bin/media/audio_core/mixer/test/audio_result.h"
#include <cstdio>
#include <string>
#include "garnet/bin/media/audio_core/mixer/test/mixer_tests_shared.h"
namespace media::audio::test {
// See audio_result.h for in-depth descriptions of these class members/consts.
//
// In summary, however:
// * For all TOLERANCE measurements, smaller is better (tighter tolerance).
// Measured results must be WITHIN the tolerance.
// * For ALL other measurements (frequency response, SINAD, level, noise floor),
// larger results are better (e.g. frequency response closer to 0, higher
// noise floor or SINAD).
//
//
// Input
//
double AudioResult::LevelToleranceSource8 = 0.0;
double AudioResult::LevelToleranceSource16 = 0.0;
double AudioResult::LevelToleranceSource24 = 0.0;
double AudioResult::LevelToleranceSourceFloat = 0.0;
constexpr double AudioResult::kPrevLevelToleranceSource8;
constexpr double AudioResult::kPrevLevelToleranceSource16;
constexpr double AudioResult::kPrevLevelToleranceSource24;
constexpr double AudioResult::kPrevLevelToleranceSourceFloat;
double AudioResult::LevelSource8 = -INFINITY;
double AudioResult::LevelSource16 = -INFINITY;
double AudioResult::LevelSource24 = -INFINITY;
double AudioResult::LevelSourceFloat = -INFINITY;
double AudioResult::FloorSource8 = -INFINITY;
double AudioResult::FloorSource16 = -INFINITY;
double AudioResult::FloorSource24 = -INFINITY;
double AudioResult::FloorSourceFloat = -INFINITY;
constexpr double AudioResult::kPrevFloorSource8;
constexpr double AudioResult::kPrevFloorSource16;
constexpr double AudioResult::kPrevFloorSource24;
constexpr double AudioResult::kPrevFloorSourceFloat;
//
//
// Rechannel
//
double AudioResult::LevelToleranceStereoMono = 0.0;
constexpr double AudioResult::kPrevLevelToleranceStereoMono;
double AudioResult::LevelStereoMono = -INFINITY;
constexpr double AudioResult::kPrevLevelStereoMono;
double AudioResult::FloorStereoMono = -INFINITY;
constexpr double AudioResult::kPrevFloorStereoMono;
//
//
// Interpolate
//
double AudioResult::LevelToleranceInterpolation = 0.0;
constexpr double AudioResult::kPrevLevelToleranceInterpolation;
std::array<double, FrequencySet::kNumReferenceFreqs>
AudioResult::FreqRespPointUnity = {NAN};
std::array<double, FrequencySet::kNumReferenceFreqs>
AudioResult::FreqRespPointDown1 = {NAN};
std::array<double, FrequencySet::kNumReferenceFreqs>
AudioResult::FreqRespPointDown2 = {NAN};
std::array<double, FrequencySet::kNumReferenceFreqs>
AudioResult::FreqRespPointUp1 = {NAN};
std::array<double, FrequencySet::kNumReferenceFreqs>
AudioResult::FreqRespPointUp2 = {NAN};
std::array<double, FrequencySet::kNumReferenceFreqs>
AudioResult::FreqRespPointMicro = {NAN};
std::array<double, FrequencySet::kNumReferenceFreqs>
AudioResult::FreqRespLinearUnity = {NAN};
std::array<double, FrequencySet::kNumReferenceFreqs>
AudioResult::FreqRespLinearDown1 = {NAN};
std::array<double, FrequencySet::kNumReferenceFreqs>
AudioResult::FreqRespLinearDown2 = {NAN};
std::array<double, FrequencySet::kNumReferenceFreqs>
AudioResult::FreqRespLinearUp1 = {NAN};
std::array<double, FrequencySet::kNumReferenceFreqs>
AudioResult::FreqRespLinearUp2 = {NAN};
std::array<double, FrequencySet::kNumReferenceFreqs>
AudioResult::FreqRespLinearMicro = {NAN};
std::array<double, FrequencySet::kNumReferenceFreqs>
AudioResult::FreqRespPointNxN = {NAN};
std::array<double, FrequencySet::kNumReferenceFreqs>
AudioResult::FreqRespLinearNxN = {NAN};
// We test our interpolation fidelity across these six rate-conversion ratios:
// - 1:1 (referred to in these variables and constants as Unity)
// - 2:1, which equates to 96k -> 48k (referred to as Down1)
// - 294:160, which equates to 88.2k -> 48k (Down2)
// - 147:160, which equates to 44.1k -> 48k (Up1)
// - 1:2, which equates to 24k -> 48k, or 48k -> 96k (Up2)
// - 47999:48000, representing small adjustment for multi-device sync (Micro)
//
// For Frequency Response, values closer to 0 (flatter response) are desired.
// Below you see that for 1:1 and 2:1, our response is near-ideal. For all other
// rates, our response drops off at higher frequencies.
//
// clang-format off
const std::array<double, FrequencySet::kNumReferenceFreqs>
AudioResult::kPrevFreqRespPointUnity = {
0.0000000e+00, -1.9772600e-09, -5.3325766e-10, -5.3325381e-10, -1.9772590e-09, -5.3325670e-10,
-5.3325188e-10, -5.3325574e-10, -5.3324995e-10, -5.3324802e-10, -5.3326249e-10, -5.3325477e-10,
-5.3324513e-10, -5.3045726e-10, -5.3043797e-10, -5.3318245e-10, -5.3304358e-10, -5.3029525e-10,
-5.3021232e-10, -5.2741866e-10, -5.3282082e-10, -5.2770507e-10, -5.2953150e-10, -5.2982369e-10,
-5.2636369e-10, -5.3142834e-10, -5.2545818e-10, -5.2888540e-10, -5.2436078e-10, -5.2107724e-10,
-5.0774735e-10, -5.2798954e-10, -4.9616384e-10, -5.1692003e-10, -5.2461536e-10, -5.1789786e-10,
-5.2736370e-10, -5.2348999e-10, -4.9876946e-10, 0.0000000e+00, -INFINITY, -INFINITY,
-INFINITY, -INFINITY, -INFINITY, -INFINITY, -INFINITY };
const std::array<double, FrequencySet::kNumReferenceFreqs>
AudioResult::kPrevFreqRespPointDown1 = {
0.0000000e+00, -1.9772600e-09, -5.3325766e-10, -5.3325381e-10, -1.9772590e-09, -5.3325670e-10,
-5.3325188e-10, -5.3325574e-10, -5.3324995e-10, -5.3324802e-10, -5.3326249e-10, -5.3325477e-10,
-5.3324513e-10, -5.3045726e-10, -5.3043797e-10, -5.3318245e-10, -5.3304358e-10, -5.3029525e-10,
-5.3021232e-10, -5.2741866e-10, -5.3282082e-10, -5.2770507e-10, -5.2953150e-10, -5.2982369e-10,
-5.2636369e-10, -5.3142834e-10, -5.2545818e-10, -5.2888540e-10, -5.2436078e-10, -5.2107724e-10,
-5.0774735e-10, -5.2798954e-10, -4.9616384e-10, -5.1692003e-10, -5.2461536e-10, -5.1789786e-10,
-5.2736370e-10, -5.2348999e-10, -4.9876946e-10, 0.0000000e+00, -5.2786707e-10, -5.0713018e-10,
-5.0078008e-10, -4.8733832e-10, -5.3374176e-10, -4.9920340e-10, -4.8059960e-10 };
const std::array<double, FrequencySet::kNumReferenceFreqs>
AudioResult::kPrevFreqRespPointDown2 = {
0.0000000e+00, -6.2545361e-07, -5.5337752e-07, -5.9509624e-07, -1.7323314e-06, -1.6037873e-06,
-3.0242621e-06, -5.1639610e-06, -7.5432833e-06, -1.0690382e-05, -1.8359708e-05, -2.7993350e-05,
-4.6269320e-05, -6.6792744e-05, -1.1673195e-04, -1.7596492e-04, -2.8496660e-04, -4.5818400e-04,
-7.2568652e-04, -1.2862017e-03, -1.6838537e-03, -2.8753928e-03, -4.7381167e-03, -7.3740357e-03,
-1.1445448e-02, -1.8281240e-02, -2.9394615e-02, -4.5931335e-02, -7.3039982e-02, -1.1760136e-01,
-1.8453367e-01, -2.6597450e-01, -4.7499921e-01, -7.0966159e-01, -7.4733762e-01, -7.8600795e-01,
-8.2548394e-01, -9.1173457e-01, -1.0299529e+00, -4.7423029e+00, -1.1794782e+00, -1.9052524e+00,
-3.1731802e+00, -3.9023798e+00, -3.9231171e+00, -INFINITY, -INFINITY };
const std::array<double, FrequencySet::kNumReferenceFreqs>
AudioResult::kPrevFreqRespPointUp1 = {
0.0000000e+00, -1.5830899e-06, -2.1161810e-06, -2.7498435e-06, -5.1479358e-06, -6.5713715e-06,
-1.1325548e-05, -1.8430984e-05, -2.8895663e-05, -4.5804027e-05, -7.3830086e-05, -1.1240271e-04,
-1.9061557e-04, -2.8384470e-04, -4.6039436e-04, -7.2498443e-04, -1.1499948e-03, -1.8369315e-03,
-2.9066219e-03, -4.8039066e-03, -7.1766122e-03, -1.1449341e-02, -1.8828932e-02, -2.9401894e-02,
-4.5919063e-02, -7.3063787e-02, -1.1783325e-01, -1.8441857e-01, -2.9363624e-01, -4.7507418e-01,
-7.4719465e-01, -1.0844209e+00, -1.9687874e+00, -2.9991557e+00, -3.1678429e+00, -3.3408237e+00,
-3.5233291e+00, -3.9220669e+00, -INFINITY, -INFINITY, -INFINITY, -INFINITY,
-INFINITY, -INFINITY, -INFINITY, -INFINITY, -INFINITY };
const std::array<double, FrequencySet::kNumReferenceFreqs>
AudioResult::kPrevFreqRespPointUp2 = {
0.0000000e+00, -3.2376516e-06, -5.2813212e-06, -7.2772930e-06, -1.1540895e-05, -1.6778123e-05,
-2.8035418e-05, -4.4801620e-05, -7.2106624e-05, -1.1857317e-04, -1.8731521e-04, -2.8503972e-04,
-4.8743716e-04, -7.3295307e-04, -1.1605211e-03, -1.8540016e-03, -2.9212432e-03, -4.6563262e-03,
-7.3660288e-03, -1.1884252e-02, -1.8553473e-02, -2.8975872e-02, -4.7645944e-02, -7.4537346e-02,
-1.1677339e-01, -1.8593632e-01, -3.0108726e-01, -4.7368842e-01, -7.6056343e-01, -1.2489868e+00,
-2.0099216e+00, -3.0090511e+00, -INFINITY, -INFINITY, -INFINITY, -INFINITY,
-INFINITY, -INFINITY, -INFINITY, -INFINITY, -INFINITY, -INFINITY,
-INFINITY, -INFINITY, -INFINITY, -INFINITY, -INFINITY };
const std::array<double, FrequencySet::kNumReferenceFreqs>
AudioResult::kPrevFreqRespPointMicro = {
0.0000000e+00, 0.0000000e+00, 0.0000000e+00, 0.0000000e+00, 0.0000000e+00, 0.0000000e+00,
0.0000000e+00, 0.0000000e+00, 0.0000000e+00, 0.0000000e+00, 0.0000000e+00, -2.8743631e-05,
-9.6197753e-05, -1.7804341e-04, -3.2055780e-04, -5.5169658e-04, -9.0739160e-04, -1.4856181e-03,
-2.3885189e-03, -3.8937031e-03, -6.1146992e-03, -9.5837630e-03, -1.5792483e-02, -2.4722667e-02,
-3.8718694e-02, -6.1558903e-02, -9.9369401e-02, -1.5553763e-01, -2.4755260e-01, -4.0038119e-01,
-6.2894158e-01, -9.1168067e-01, -1.6491708e+00, -2.5007446e+00, -2.6397050e+00, -2.7827859e+00,
-2.9309201e+00, -3.2560185e+00, -3.7067765e+00, -INFINITY, -INFINITY, -INFINITY,
-INFINITY, -INFINITY, -INFINITY, -INFINITY, -INFINITY };
const std::array<double, FrequencySet::kNumReferenceFreqs>
AudioResult::kPrevFreqRespLinearUnity = {
0.0000000e+00, -1.9772600e-09, -5.3325766e-10, -5.3325381e-10, -1.9772590e-09, -5.3325670e-10,
-5.3325188e-10, -5.3325574e-10, -5.3324995e-10, -5.3324802e-10, -5.3326249e-10, -5.3325477e-10,
-5.3324513e-10, -5.3045726e-10, -5.3043797e-10, -5.3318245e-10, -5.3304358e-10, -5.3029525e-10,
-5.3021232e-10, -5.2741866e-10, -5.3282082e-10, -5.2770507e-10, -5.2953150e-10, -5.2982369e-10,
-5.2636369e-10, -5.3142834e-10, -5.2545818e-10, -5.2888540e-10, -5.2436078e-10, -5.2107724e-10,
-5.0774735e-10, -5.2798954e-10, -4.9616384e-10, -5.1692003e-10, -5.2461536e-10, -5.1789786e-10,
-5.2736370e-10, -5.2348999e-10, -4.9876946e-10, 0.0000000e+00, -INFINITY, -INFINITY,
-INFINITY, -INFINITY, -INFINITY, -INFINITY, -INFINITY };
const std::array<double, FrequencySet::kNumReferenceFreqs>
AudioResult::kPrevFreqRespLinearDown1 = {
0.0000000e+00, -1.9772600e-09, -5.3325766e-10, -5.3325381e-10, -1.9772590e-09, -5.3325670e-10,
-5.3325188e-10, -5.3325574e-10, -5.3324995e-10, -5.3324802e-10, -5.3326249e-10, -5.3325477e-10,
-5.3324513e-10, -5.3045726e-10, -5.3043797e-10, -5.3318245e-10, -5.3304358e-10, -5.3029525e-10,
-5.3021232e-10, -5.2741866e-10, -5.3282082e-10, -5.2770507e-10, -5.2953150e-10, -5.2982369e-10,
-5.2636369e-10, -5.3142834e-10, -5.2545818e-10, -5.2888540e-10, -5.2436078e-10, -5.2107724e-10,
-5.0774735e-10, -5.2798954e-10, -4.9616384e-10, -5.1692003e-10, -5.2461536e-10, -5.1789786e-10,
-5.2736370e-10, -5.2348999e-10, -4.9876946e-10, 0.0000000e+00, -5.2786707e-10, -5.0713018e-10,
-5.0078008e-10, -4.8733832e-10, -5.3374176e-10, -4.9920340e-10, -4.8059960e-10 };
const std::array<double, FrequencySet::kNumReferenceFreqs>
AudioResult::kPrevFreqRespLinearDown2 = {
0.0000000e+00, -6.3822570e-07, -1.0395043e-06, -1.4355155e-06, -2.2783814e-06, -3.3105243e-06,
-5.5342438e-06, -8.8452921e-06, -1.4234833e-05, -2.3412091e-05, -3.6983731e-05, -5.6277393e-05,
-9.6239638e-05, -1.4471410e-04, -2.2913233e-04, -3.6604707e-04, -5.7673735e-04, -9.1923731e-04,
-1.4540329e-03, -2.3455347e-03, -3.6609235e-03, -5.7152998e-03, -9.3915140e-03, -1.4677821e-02,
-2.2959819e-02, -3.6467196e-02, -5.8805719e-02, -9.1939220e-02, -1.4608711e-01, -2.3565981e-01,
-3.6877127e-01, -5.3202083e-01, -9.5038397e-01, -1.4198462e+00, -1.4950525e+00, -1.5720769e+00,
-1.6513831e+00, -1.8238856e+00, -2.0601325e+00, -2.1699023e+00, -2.3597079e+00, -3.8111231e+00,
-6.3355155e+00, -7.8050468e+00, -7.8442180e+00, -INFINITY, -INFINITY };
const std::array<double, FrequencySet::kNumReferenceFreqs>
AudioResult::kPrevFreqRespLinearUp1 = {
0.0000000e+00, -2.5516310e-06, -4.1678491e-06, -5.7439283e-06, -9.1112253e-06, -1.3248613e-05,
-2.2139066e-05, -3.5381715e-05, -5.6948304e-05, -9.3646159e-05, -1.4793727e-04, -2.2511883e-04,
-3.8496865e-04, -5.7887223e-04, -9.1654360e-04, -1.4642074e-03, -2.3069974e-03, -3.6770605e-03,
-5.8164285e-03, -9.3829067e-03, -1.4645559e-02, -2.2865714e-02, -3.7578247e-02, -5.8741085e-02,
-9.1912259e-02, -1.4605310e-01, -2.3570309e-01, -3.6893407e-01, -5.8733496e-01, -9.5047204e-01,
-1.4944954e+00, -2.1690869e+00, -3.9376310e+00, -5.9976308e+00, -6.3357708e+00, -6.6845975e+00,
-7.0464553e+00, -7.8433525e+00, -INFINITY, -INFINITY, -INFINITY, -INFINITY,
-INFINITY, -INFINITY, -INFINITY, -INFINITY, -INFINITY };
const std::array<double, FrequencySet::kNumReferenceFreqs>
AudioResult::kPrevFreqRespLinearUp2 = {
0.0000000e+00, -6.4749325e-06, -1.0563305e-05, -1.4552500e-05, -2.3077789e-05, -3.3551619e-05,
-5.6066745e-05, -8.9601458e-05, -1.4421078e-04, -2.3714242e-04, -3.7462855e-04, -5.7008073e-04,
-9.7487178e-04, -1.4659017e-03, -2.3210368e-03, -3.7080022e-03, -5.8424840e-03, -9.3126509e-03,
-1.4732055e-02, -2.3768503e-02, -3.7106945e-02, -5.7951740e-02, -9.5291884e-02, -1.4907470e-01,
-2.3354677e-01, -3.7187263e-01, -6.0217451e-01, -9.4737683e-01, -1.5211269e+00, -2.4979735e+00,
-4.0198431e+00, -6.0181021e+00, -INFINITY, -INFINITY, -INFINITY, -INFINITY,
-INFINITY, -INFINITY, -INFINITY, -INFINITY, -INFINITY, -INFINITY,
-INFINITY, -INFINITY, -INFINITY, -INFINITY, -INFINITY };
const std::array<double, FrequencySet::kNumReferenceFreqs>
AudioResult::kPrevFreqRespLinearMicro = {
0.0000000e+00, -2.1585212e-06, -3.5194082e-06, -4.8526388e-06, -7.6796668e-06, -1.1183720e-05,
-1.8689826e-05, -2.9866062e-05, -4.8053723e-05, -7.9048246e-05, -1.2487796e-04, -1.9002901e-04,
-3.2495089e-04, -4.8863930e-04, -7.7367595e-04, -1.2359665e-03, -1.9473794e-03, -3.1038664e-03,
-4.9097245e-03, -7.9201843e-03, -1.2362313e-02, -1.9300655e-02, -3.1718474e-02, -4.9579395e-02,
-7.7572320e-02, -1.2325418e-01, -1.9887759e-01, -3.1121774e-01, -4.9525403e-01, -8.0092262e-01,
-1.2580628e+00, -1.8235695e+00, -3.2986619e+00, -5.0020980e+00, -5.2801039e+00, -5.5663757e+00,
-5.8628714e+00, -6.5135504e+00, -7.4187285e+00, -INFINITY, -INFINITY, -INFINITY,
-INFINITY, -INFINITY, -INFINITY, -INFINITY, -INFINITY };
// clang-format on
std::array<double, FrequencySet::kNumReferenceFreqs>
AudioResult::SinadPointUnity = {NAN};
std::array<double, FrequencySet::kNumReferenceFreqs>
AudioResult::SinadPointDown1 = {NAN};
std::array<double, FrequencySet::kNumReferenceFreqs>
AudioResult::SinadPointDown2 = {NAN};
std::array<double, FrequencySet::kNumReferenceFreqs>
AudioResult::SinadPointUp1 = {NAN};
std::array<double, FrequencySet::kNumReferenceFreqs>
AudioResult::SinadPointUp2 = {NAN};
std::array<double, FrequencySet::kNumReferenceFreqs>
AudioResult::SinadPointMicro = {NAN};
std::array<double, FrequencySet::kNumReferenceFreqs>
AudioResult::SinadLinearUnity = {NAN};
std::array<double, FrequencySet::kNumReferenceFreqs>
AudioResult::SinadLinearDown1 = {NAN};
std::array<double, FrequencySet::kNumReferenceFreqs>
AudioResult::SinadLinearDown2 = {NAN};
std::array<double, FrequencySet::kNumReferenceFreqs>
AudioResult::SinadLinearUp1 = {NAN};
std::array<double, FrequencySet::kNumReferenceFreqs>
AudioResult::SinadLinearUp2 = {NAN};
std::array<double, FrequencySet::kNumReferenceFreqs>
AudioResult::SinadLinearMicro = {NAN};
std::array<double, FrequencySet::kNumReferenceFreqs>
AudioResult::SinadPointNxN = {-INFINITY};
std::array<double, FrequencySet::kNumReferenceFreqs>
AudioResult::SinadLinearNxN = {-INFINITY};
// We test our interpolation fidelity across these six rate-conversion ratios:
// - 1:1 (referred to in these variables and constants as Unity)
// - 2:1, which equates to 96k -> 48k (referred to as Down1)
// - 294:160, which equates to 88.2k -> 48k (Down2)
// - 147:160, which equates to 44.1k -> 48k (Up1)
// - 1:2, which equates to 24k -> 48k, or 48k -> 96k (Up2)
// - 47999:48000, representing small adjustment for multi-device sync (Micro)
//
// For SINAD, higher values (lower noise/artifacts vs. signal) are desired.
// Below you see that for 1:1 and 2:1, our SINAD is near-ideal. For all other
// rates, our performance drops off (lower values) at higher frequencies.
//
// clang-format off
const std::array<double, FrequencySet::kNumReferenceFreqs>
AudioResult::kPrevSinadPointUnity = {
160.0, 153.71437, 153.74509, 153.74509, 153.71437, 153.74509,
153.74509, 153.74509, 153.74509, 153.74509, 153.74509, 153.74509,
153.74509, 153.74509, 153.74509, 153.74509, 153.74509, 153.74509,
153.74509, 153.74509, 153.74509, 153.74509, 153.74509, 153.74509,
153.74509, 153.74509, 153.74509, 153.74509, 153.74509, 153.74509,
153.74509, 153.74509, 153.74509, 153.74509, 153.74509, 153.74509,
153.74509, 153.74509, 153.74509, 153.74509, -INFINITY, -INFINITY,
-INFINITY, -INFINITY, -INFINITY, -INFINITY, -INFINITY };
const std::array<double, FrequencySet::kNumReferenceFreqs>
AudioResult::kPrevSinadPointDown1 = {
160.0, 153.71437, 153.74509, 153.74509, 153.71437, 153.74509,
153.74509, 153.74509, 153.74509, 153.74509, 153.74509, 153.74509,
153.74509, 153.74509, 153.74509, 153.74509, 153.74509, 153.74509,
153.74509, 153.74509, 153.74509, 153.74509, 153.74509, 153.74509,
153.74509, 153.74509, 153.74509, 153.74509, 153.74509, 153.74509,
153.74509, 153.74509, 153.74509, 153.74509, 153.74509, 153.74509,
153.74509, 153.74509, 153.74509, 160.0, -0.00001, -0.00001,
0.0, 0.0, 0.0, 0.0, 0.0 };
const std::array<double, FrequencySet::kNumReferenceFreqs>
AudioResult::kPrevSinadPointDown2 = {
160.0, 71.336877, 69.207771, 67.815057, 65.812750, 64.186654,
61.956811, 59.920832, 57.853947, 55.693796, 53.707909, 51.884581,
49.554461, 47.782913, 45.787171, 43.752690, 41.778220, 39.753644,
37.762035, 35.684914, 33.751618, 31.816288, 29.658355, 27.717787,
25.772785, 23.759904, 21.679253, 19.730206, 17.705458, 15.606694,
13.627759, 11.995243, 9.3697669, 7.5064406, 7.2628203, 7.0245187,
6.7906798, 6.3146193, 5.7241998, 1.3009572, -1.1796846, -1.9053601,
-3.1726329, -3.9023801, -3.9231171, -INFINITY, -INFINITY };
const std::array<double, FrequencySet::kNumReferenceFreqs>
AudioResult::kPrevSinadPointUp1 = {
160.0, 65.316279, 63.187172, 61.794455, 59.792148, 58.166050,
55.936206, 53.900223, 51.833335, 49.673175, 47.687276, 45.863930,
43.533774, 41.762183, 39.766365, 37.731761, 35.757101, 33.732217,
31.740126, 29.662201, 27.727717, 25.790544, 23.629300, 21.683967,
19.731484, 17.706396, 15.605467, 13.626191, 11.551686, 9.3692819,
7.2643203, 5.4720562, 2.4143111, 0.022407171, -0.30957862, -0.6378681,
-0.9717976, -1.6649323, -INFINITY, -INFINITY, -INFINITY, -INFINITY,
-INFINITY, -INFINITY, -INFINITY, -INFINITY, -INFINITY };
const std::array<double, FrequencySet::kNumReferenceFreqs>
AudioResult::kPrevSinadPointUp2 = {
160.0, 61.281148, 59.152040, 57.759321, 55.757015, 54.130912,
51.901065, 49.865075, 47.798174, 45.637992, 43.652064, 41.828677,
39.498430, 37.726726, 35.730739, 33.695819, 31.720708, 29.695082,
27.701826, 25.622181, 23.684311, 21.742982, 19.573739, 17.616782,
15.645886, 13.590901, 11.439506, 9.3839187, 7.1806586, 4.7728152,
2.3024022, 0.0024982, -INFINITY, -INFINITY, -INFINITY, -INFINITY,
-INFINITY, -INFINITY, -INFINITY, -INFINITY, -INFINITY, -INFINITY,
-INFINITY, -INFINITY, -INFINITY, -INFINITY, -INFINITY };
const std::array<double, FrequencySet::kNumReferenceFreqs>
AudioResult::kPrevSinadPointMicro = {
160.0, 66.059499, 63.927625, 62.533706, 60.530232, 58.903508,
56.673112, 54.636824, 52.569740, 50.409454, 48.423487, 46.600103,
44.269918, 42.498312, 40.502514, 38.467909, 36.493292, 34.468473,
32.476480, 30.398944, 28.464189, 26.527730, 24.367222, 22.422864,
20.471802, 18.449412, 16.352608, 14.379604, 12.315608, 10.150625,
8.0729832, 6.3152540, 3.3543294, 1.0867921, 0.77564379, 0.4674690,
0.16010267, -0.4784014, -1.2966582, -INFINITY, -INFINITY, -INFINITY,
-INFINITY, -INFINITY, -INFINITY, -INFINITY, -INFINITY };
const std::array<double, FrequencySet::kNumReferenceFreqs>
AudioResult::kPrevSinadLinearUnity = {
160.0, 153.71437, 153.74509, 153.74509, 153.71437, 153.74509,
153.74509, 153.74509, 153.74509, 153.74509, 153.74509, 153.74509,
153.74509, 153.74509, 153.74509, 153.74509, 153.74509, 153.74509,
153.74509, 153.74509, 153.74509, 153.74509, 153.74509, 153.74509,
153.74509, 153.74509, 153.74509, 153.74509, 153.74509, 153.74509,
153.74509, 153.74509, 153.74509, 153.74509, 153.74509, 153.74509,
153.74509, 153.74509, 153.74509, 160.0, -INFINITY, -INFINITY,
-INFINITY, -INFINITY, -INFINITY, -INFINITY, -INFINITY };
const std::array<double, FrequencySet::kNumReferenceFreqs>
AudioResult::kPrevSinadLinearDown1 = {
160.0, 153.71437, 153.74509, 153.74509, 153.71437, 153.74509,
153.74509, 153.74509, 153.74509, 153.74509, 153.74509, 153.74509,
153.74509, 153.74509, 153.74509, 153.74509, 153.74509, 153.74509,
153.74509, 153.74509, 153.74509, 153.74509, 153.74509, 153.74509,
153.74509, 153.74509, 153.74509, 153.74509, 153.74509, 153.74509,
153.74509, 153.74509, 153.74509, 153.74509, 153.74509, 153.74509,
153.74509, 153.74509, 153.74509, 160.0, -0.00001, -0.00001,
0.0, 0.0, 0.0, 0.0, 0.0 };
const std::array<double, FrequencySet::kNumReferenceFreqs>
AudioResult::kPrevSinadLinearDown2 = {
160.0, 145.49338, 142.76626, 140.72251, 137.37211, 134.53647,
130.42254, 126.53508, 122.51076, 118.26515, 114.33387, 110.71175,
106.07058, 102.53716, 98.552405, 94.487585, 90.541183, 86.493364,
82.510726, 78.356875, 74.488568, 70.617160, 66.298521, 62.413089,
58.516039, 54.479521, 50.299693, 46.374454, 42.281300, 38.011435,
33.951159, 30.561504, 25.008837, 20.969144, 20.434310, 19.909878,
19.392276, 18.335140, 17.015322, 14.389380, -0.1204279, -0.4278153,
-1.7444607, -3.0339471, -3.0730057, -INFINITY, -INFINITY };
const std::array<double, FrequencySet::kNumReferenceFreqs>
AudioResult::kPrevSinadLinearUp1 = {
160.0, 136.51568, 132.67958, 130.09359, 126.26617, 123.11086,
118.73707, 114.71235, 110.60724, 106.30681, 102.34528, 98.704938,
94.049636, 90.508733, 86.518686, 82.450120, 78.500792, 74.450330,
70.464653, 66.306477, 62.432229, 58.551831, 54.217369, 50.309328,
46.377035, 42.283366, 38.009784, 33.947118, 29.633297, 25.007929,
20.438188, 16.448403, 9.4409550, 3.8414434, 3.0592776, 2.2816549,
1.5032161, -0.1228125, -INFINITY, -INFINITY, -INFINITY, -INFINITY,
-INFINITY, -INFINITY, -INFINITY, -INFINITY, -INFINITY };
const std::array<double, FrequencySet::kNumReferenceFreqs>
AudioResult::kPrevSinadLinearUp2 = {
160.0, 122.55223, 118.30004, 115.51772, 111.51357, 108.26232,
103.80239, 99.730105, 95.596368, 91.276051, 87.304125, 83.657303,
78.996866, 75.453467, 71.461492, 67.391637, 63.441417, 59.390164,
55.403653, 51.244363, 47.368622, 43.485964, 39.147478, 35.233563,
31.291773, 27.181802, 22.879012, 18.767837, 14.361317, 9.5456304,
4.6048044, 0.0049964955, -INFINITY, -INFINITY, -INFINITY, -INFINITY,
-INFINITY, -INFINITY, -INFINITY, -INFINITY, -INFINITY, -INFINITY,
-INFINITY, -INFINITY, -INFINITY, -INFINITY, -INFINITY };
const std::array<double, FrequencySet::kNumReferenceFreqs>
AudioResult::kPrevSinadLinearMicro = {
160.0, 137.77543, 134.01803, 131.46589, 127.68128, 124.54800,
120.18252, 116.16993, 112.07004, 107.77290, 103.81385, 100.17442,
95.520355, 91.979876, 87.990125, 83.921932, 79.972951, 75.922907,
71.937750, 67.780410, 63.907352, 60.028788, 55.697592, 51.794229,
47.869227, 43.787357, 39.533082, 35.498577, 31.229654, 26.675984,
22.207908, 18.336999, 11.618540, 6.3382417, 5.6081329, 4.8842446,
4.1617533, 2.6594494, 0.72947217, -INFINITY, -INFINITY, -INFINITY,
-INFINITY, -INFINITY, -INFINITY, -INFINITY, -INFINITY, };
// clang-format on
//
//
// Scale
//
Gain::AScale AudioResult::ScaleEpsilon = 0;
constexpr float AudioResult::kMaxGainDbNonUnity;
Gain::AScale AudioResult::MinScaleNonZero = 0;
constexpr float AudioResult::kMinGainDbNonMute;
double AudioResult::DynRangeTolerance = 0.0;
constexpr double AudioResult::kPrevDynRangeTolerance;
double AudioResult::LevelEpsilonDown = -INFINITY;
constexpr double AudioResult::kPrevLevelEpsilonDown;
double AudioResult::SinadEpsilonDown = -INFINITY;
constexpr double AudioResult::kPrevSinadEpsilonDown;
double AudioResult::Level30Down = -INFINITY;
double AudioResult::Level60Down = -INFINITY;
double AudioResult::Level90Down = -INFINITY;
double AudioResult::Sinad30Down = -INFINITY;
constexpr double AudioResult::kPrevSinad30Down;
double AudioResult::Sinad60Down = -INFINITY;
constexpr double AudioResult::kPrevSinad60Down;
double AudioResult::Sinad90Down = -INFINITY;
constexpr double AudioResult::kPrevSinad90Down;
//
//
// Sum
//
double AudioResult::LevelToleranceMix8 = 0.0;
double AudioResult::LevelToleranceMix16 = 0.0;
double AudioResult::LevelToleranceMix24 = 0.0;
double AudioResult::LevelToleranceMixFloat = 0.0;
constexpr double AudioResult::kPrevLevelToleranceMix8;
constexpr double AudioResult::kPrevLevelToleranceMix16;
constexpr double AudioResult::kPrevLevelToleranceMix24;
constexpr double AudioResult::kPrevLevelToleranceMixFloat;
double AudioResult::LevelMix8 = -INFINITY;
double AudioResult::LevelMix16 = -INFINITY;
double AudioResult::LevelMix24 = -INFINITY;
double AudioResult::LevelMixFloat = -INFINITY;
constexpr double AudioResult::kPrevLevelMix8;
constexpr double AudioResult::kPrevLevelMix16;
constexpr double AudioResult::kPrevLevelMix24;
constexpr double AudioResult::kPrevLevelMixFloat;
double AudioResult::FloorMix8 = -INFINITY;
double AudioResult::FloorMix16 = -INFINITY;
double AudioResult::FloorMix24 = -INFINITY;
double AudioResult::FloorMixFloat = -INFINITY;
constexpr double AudioResult::kPrevFloorMix8;
constexpr double AudioResult::kPrevFloorMix16;
constexpr double AudioResult::kPrevFloorMix24;
constexpr double AudioResult::kPrevFloorMixFloat;
//
//
// Output
//
double AudioResult::LevelToleranceOutput8 = -INFINITY;
double AudioResult::LevelToleranceOutput16 = -INFINITY;
double AudioResult::LevelToleranceOutput24 = -INFINITY;
double AudioResult::LevelToleranceOutputFloat = -INFINITY;
constexpr double AudioResult::kPrevLevelToleranceOutput8;
constexpr double AudioResult::kPrevLevelToleranceOutput16;
constexpr double AudioResult::kPrevLevelToleranceOutput24;
constexpr double AudioResult::kPrevLevelToleranceOutputFloat;
double AudioResult::LevelOutput8 = -INFINITY;
double AudioResult::LevelOutput16 = -INFINITY;
double AudioResult::LevelOutput24 = -INFINITY;
double AudioResult::LevelOutputFloat = -INFINITY;
constexpr double AudioResult::kPrevLevelOutput8;
constexpr double AudioResult::kPrevLevelOutput16;
constexpr double AudioResult::kPrevLevelOutput24;
constexpr double AudioResult::kPrevLevelOutputFloat;
double AudioResult::FloorOutput8 = -INFINITY;
double AudioResult::FloorOutput16 = -INFINITY;
double AudioResult::FloorOutput24 = -INFINITY;
double AudioResult::FloorOutputFloat = -INFINITY;
constexpr double AudioResult::kPrevFloorOutput8;
constexpr double AudioResult::kPrevFloorOutput16;
constexpr double AudioResult::kPrevFloorOutput24;
constexpr double AudioResult::kPrevFloorOutputFloat;
//
// The subsequent methods are used when updating the kPrev threshold arrays.
// They display the current run's results in an easily-imported format.
//
void AudioResult::DumpThresholdValues() {
DumpFreqRespValues(AudioResult::FreqRespPointUnity.data(), "FR-PointUnity");
DumpFreqRespValues(AudioResult::FreqRespPointDown1.data(), "FR-PointDown1");
DumpFreqRespValues(AudioResult::FreqRespPointDown2.data(), "FR-PointDown2");
DumpFreqRespValues(AudioResult::FreqRespPointUp1.data(), "FR-PointUp1");
DumpFreqRespValues(AudioResult::FreqRespPointUp2.data(), "FR-PointUp2");
DumpFreqRespValues(AudioResult::FreqRespPointMicro.data(), "FR-PointMicro");
DumpFreqRespValues(AudioResult::FreqRespLinearUnity.data(), "FR-LinearUnity");
DumpFreqRespValues(AudioResult::FreqRespLinearDown1.data(), "FR-LinearDown1");
DumpFreqRespValues(AudioResult::FreqRespLinearDown2.data(), "FR-LinearDown2");
DumpFreqRespValues(AudioResult::FreqRespLinearUp1.data(), "FR-LinearUp1");
DumpFreqRespValues(AudioResult::FreqRespLinearUp2.data(), "FR-LinearUp2");
DumpFreqRespValues(AudioResult::FreqRespLinearMicro.data(), "FR-LinearMicro");
DumpFreqRespValues(AudioResult::FreqRespPointNxN.data(), "FR-PointNxN");
DumpFreqRespValues(AudioResult::FreqRespLinearNxN.data(), "FR-LinearNxN");
DumpSinadValues(AudioResult::SinadPointUnity.data(), "SinadPointUnity");
DumpSinadValues(AudioResult::SinadPointDown1.data(), "SinadPointDown1");
DumpSinadValues(AudioResult::SinadPointDown2.data(), "SinadPointDown2");
DumpSinadValues(AudioResult::SinadPointUp1.data(), "SinadPointUp1");
DumpSinadValues(AudioResult::SinadPointUp2.data(), "SinadPointUp2");
DumpSinadValues(AudioResult::SinadPointMicro.data(), "SinadPointMicro");
DumpSinadValues(AudioResult::SinadLinearUnity.data(), "SinadLinearUnity");
DumpSinadValues(AudioResult::SinadLinearDown1.data(), "SinadLinearDown1");
DumpSinadValues(AudioResult::SinadLinearDown2.data(), "SinadLinearDown2");
DumpSinadValues(AudioResult::SinadLinearUp1.data(), "SinadLinearUp1");
DumpSinadValues(AudioResult::SinadLinearUp2.data(), "SinadLinearUp2");
DumpSinadValues(AudioResult::SinadLinearMicro.data(), "SinadLinearMicro");
DumpSinadValues(AudioResult::SinadPointNxN.data(), "SinadPointNxN");
DumpSinadValues(AudioResult::SinadLinearNxN.data(), "SinadLinearNxN");
DumpLevelValues();
DumpLevelToleranceValues();
DumpNoiseFloorValues();
DumpDynamicRangeValues();
printf("\n\n");
}
// Display a single frequency response results array, for import and processing.
void AudioResult::DumpFreqRespValues(double* freq_resp_vals,
std::string arr_name) {
printf("\n\n %s", arr_name.c_str());
for (size_t freq = 0; freq < FrequencySet::kReferenceFreqs.size(); ++freq) {
if (freq % 6 == 0) {
printf("\n\t\t");
}
printf(" %14.7le,", freq_resp_vals[freq]);
}
}
// Display a single sinad results array, for import and processing.
void AudioResult::DumpSinadValues(double* sinad_vals, std::string arr_name) {
printf("\n\n %s", arr_name.c_str());
for (size_t freq = 0; freq < FrequencySet::kReferenceFreqs.size(); ++freq) {
if (freq % 6 == 0) {
printf("\n\t\t");
}
printf(" %11.7lf,", sinad_vals[freq]);
}
}
void AudioResult::DumpLevelValues() {
printf("\n\n Level");
printf("\n 8-bit: Source %15.8le Mix %15.8le Output %15.8le",
AudioResult::LevelSource8, AudioResult::LevelMix8,
AudioResult::LevelOutput8);
printf("\n 16-bit: Source %15.8le Mix %15.8le Output %15.8le",
AudioResult::LevelSource16, AudioResult::LevelMix16,
AudioResult::LevelOutput16);
printf("\n 24-bit: Source %15.8le Mix %15.8le Output %15.8le",
AudioResult::LevelSource24, AudioResult::LevelMix24,
AudioResult::LevelOutput24);
printf("\n Float: Source %15.8le Mix %15.8le Output %15.8le",
AudioResult::LevelSourceFloat, AudioResult::LevelMixFloat,
AudioResult::LevelOutputFloat);
printf("\n Stereo-to-Mono: %15.8le", AudioResult::LevelStereoMono);
}
void AudioResult::DumpLevelToleranceValues() {
printf("\n\n Level Tolerance");
printf("\n 8-bit: Source %15.8le Mix %15.8le Output %15.8le",
AudioResult::LevelToleranceSource8, AudioResult::LevelToleranceMix8,
AudioResult::LevelToleranceOutput8);
printf("\n 16-bit: Source %15.8le Mix %15.8le Output %15.8le",
AudioResult::LevelToleranceSource16, AudioResult::LevelToleranceMix16,
AudioResult::LevelToleranceOutput16);
printf("\n 24-bit: Source %15.8le Mix %15.8le Output %15.8le",
AudioResult::LevelToleranceSource24, AudioResult::LevelToleranceMix24,
AudioResult::LevelToleranceOutput24);
printf("\n Float: Source %15.8le Mix %15.8le Output %15.8le",
AudioResult::LevelToleranceSourceFloat,
AudioResult::LevelToleranceMixFloat,
AudioResult::LevelToleranceOutputFloat);
printf("\n Stereo-to-Mono: %15.8le ",
AudioResult::LevelToleranceStereoMono);
printf("Interpolation: %15.8le", LevelToleranceInterpolation);
}
void AudioResult::DumpNoiseFloorValues() {
printf("\n\n Noise Floor");
printf("\n 8-bit: Source %11.7lf Mix %11.7lf Output %11.7lf",
AudioResult::FloorSource8, AudioResult::FloorMix8,
AudioResult::FloorOutput8);
printf("\n 16-bit: Source %11.7lf Mix %11.7lf Output %11.7lf",
AudioResult::FloorSource16, AudioResult::FloorMix16,
AudioResult::FloorOutput16);
printf("\n 24-bit: Source %11.7lf Mix %11.7lf Output %11.7lf",
AudioResult::FloorSource24, AudioResult::FloorMix24,
AudioResult::FloorOutput24);
printf("\n Float: Source %11.7lf Mix %11.7lf Output %11.7lf",
AudioResult::FloorSourceFloat, AudioResult::FloorMixFloat,
AudioResult::FloorOutputFloat);
printf("\n Stereo-to-Mono: %11.7lf", AudioResult::FloorStereoMono);
}
void AudioResult::DumpDynamicRangeValues() {
printf("\n\n Dynamic Range");
printf("\n Epsilon: %10.8f (%13.6le dB)", AudioResult::ScaleEpsilon,
Gain::ScaleToDb(AudioResult::ScaleEpsilon));
printf(" Level: %12.8lf dB Sinad: %10.6lf dB",
AudioResult::LevelEpsilonDown, AudioResult::SinadEpsilonDown);
printf("\n -30 dB down: ");
printf(" Level: %12.8lf dB Sinad: %10.6lf dB", AudioResult::Level30Down,
AudioResult::Sinad30Down);
printf("\n -60 dB down: ");
printf(" Level: %12.8lf dB Sinad: %10.6lf dB", AudioResult::Level60Down,
AudioResult::Sinad60Down);
printf("\n -90 dB down: ");
printf(" Level: %12.8lf dB Sinad: %10.6lf dB", AudioResult::Level90Down,
AudioResult::Sinad90Down);
printf("\n Gain Accuracy: +/- %12.6le dB",
AudioResult::DynRangeTolerance);
printf("\n MinScale: %10.8f (%11.8f dB)", AudioResult::MinScaleNonZero,
Gain::ScaleToDb(AudioResult::MinScaleNonZero));
}
} // namespace media::audio::test