|
| 1 | +// SPDX-License-Identifier: BSD-3-Clause |
| 2 | +// |
| 3 | +// Copyright(c) 2026 Intel Corporation. All rights reserved. |
| 4 | +// |
| 5 | +// These contents may have been developed with support from one or more Intel-operated |
| 6 | +// generative artificial intelligence solutions. |
| 7 | +// |
| 8 | +// Converted from CMock to Ztest |
| 9 | +// |
| 10 | +// Original test from sof/test/cmocka/src/math/arithmetic/base_e_logarithm.c |
| 11 | +// Author: Shriram Shastry <malladi.sastry@linux.intel.com> |
| 12 | + |
| 13 | +#include <zephyr/ztest.h> |
| 14 | +#include <stdint.h> |
| 15 | +#include <math.h> |
| 16 | + |
| 17 | +#include <sof/math/log.h> |
| 18 | + |
| 19 | +/* 'Error[max] = 0.0000164133276926,THD(-dBc) = -95.6960671942683234' */ |
| 20 | +/* 'Error[max] = rms(log() - double(log_int32()))' */ |
| 21 | +/* 'THD = 20*log10(Error[max])' */ |
| 22 | +#define CMP_TOLERANCE 0.0000164133276926 |
| 23 | + |
| 24 | +/* Natural logarithm loge(X) reference table generated by matlab/Octave */ |
| 25 | +/* UQ5.27 */ |
| 26 | +static const double natural_log_lookup_table[] = { |
| 27 | + 0.0000000000000000, 17.5855899268523359, 18.2787371074122831, 18.6842022155204468, |
| 28 | + 18.9718842879722267, 19.1950278392864391, 19.3773493960803940, 19.5315000759076511, |
| 29 | + 19.6650314685321739, 19.7828145041885577, 19.8881750198463827, 19.9834851996507084, |
| 30 | + 20.0704965766403376, 20.1505392860869676, 20.2246472581140395, 20.2936401294912301, |
| 31 | + 20.3581786505327571, 20.4188032722644479, 20.4759616860290699, 20.5300289072319480, |
| 32 | + 20.5813222015588408, 20.6301123656733907, 20.6766323812583899, 20.7210841437836706, |
| 33 | + 20.7636437581607112, 20.8044657526425461, 20.8436864657603671, 20.8814267937103786, |
| 34 | + 20.9177944378507625, 20.9528857576336485, 20.9867873092828354, 21.0195771320810394, |
| 35 | + 21.0513258303723845, 21.0820974890173112, 21.1119504521464485, 21.1409379890003279, |
| 36 | + 21.1691088659487328, 21.1965078407425196, 21.2231760877918916, 21.2491515741640455, |
| 37 | + 21.2744693821187845, 21.2991619946810467, 21.3232595462333343, 21.3467900436180038, |
| 38 | + 21.3697795618183370, 21.3922524176471107, 21.4142313243436178, 21.4357375295432568, |
| 39 | + 21.4567909387206548, 21.4774102259037889, 21.4976129332024932, 21.5174155604805932, |
| 40 | + 21.5368336463203107, 21.5558818412742781, 21.5745739742703257, 21.5929231129229997, |
| 41 | + 21.6109416184107097, 21.6286411954956677, 21.6460329381935921, 21.6631273715394208, |
| 42 | + 21.6799344898427790, 21.6964637917813938, 21.7127243130127638, 21.7287246543415016, |
| 43 | + 21.7444730112924880, 21.7599771978118319, 21.7752446699265008, 21.7902825472754031, |
| 44 | + 21.8050976330453672, 21.8196964324517815, 21.8340851698895619, 21.8482698048676056, |
| 45 | + 21.8622560468288185, 21.8760493689479993, 21.8896550209909755, 21.9030780413106569, |
| 46 | + 21.9163232680485471, 21.9293953496040821, 21.9422987544284780, 21.9550377801946830, |
| 47 | + 21.9676165623906030, 21.9800390823784895, 21.9923091749598925, 22.0044305354820757, |
| 48 | + 22.0164067265188734, 22.0282411841561903, 22.0399372239099236, 22.0514980465667030, |
| 49 | + 22.0629267423782807, 22.0742262976204415, 22.0853995982070579, 22.0964494343823858, |
| 50 | + 22.1073785049035614, 22.1181894209970018, 22.1288847101032040, 22.1394668194234150, |
| 51 | + 22.1499381192805984, 22.1603009063062437, 22.1705574064637361, 22.1807097776854185}; |
| 52 | + |
| 53 | +/* testvector in Q32.0 */ |
| 54 | +static const uint32_t uv[100] = { |
| 55 | + 1ULL, 43383509ULL, 86767017ULL, 130150525ULL, 173534033ULL, 216917541ULL, |
| 56 | + 260301049ULL, 303684557ULL, 347068065ULL, 390451573ULL, 433835081ULL, 477218589ULL, |
| 57 | + 520602097ULL, 563985605ULL, 607369113ULL, 650752621ULL, 694136129ULL, 737519638ULL, |
| 58 | + 780903146ULL, 824286654ULL, 867670162ULL, 911053670ULL, 954437178ULL, 997820686ULL, |
| 59 | + 1041204194ULL, 1084587702ULL, 1127971210ULL, 1171354718ULL, 1214738226ULL, 1258121734ULL, |
| 60 | + 1301505242ULL, 1344888750ULL, 1388272258ULL, 1431655766ULL, 1475039274ULL, 1518422782ULL, |
| 61 | + 1561806290ULL, 1605189798ULL, 1648573306ULL, 1691956814ULL, 1735340322ULL, 1778723830ULL, |
| 62 | + 1822107338ULL, 1865490846ULL, 1908874354ULL, 1952257862ULL, 1995641370ULL, 2039024878ULL, |
| 63 | + 2082408386ULL, 2125791894ULL, 2169175403ULL, 2212558911ULL, 2255942419ULL, 2299325927ULL, |
| 64 | + 2342709435ULL, 2386092943ULL, 2429476451ULL, 2472859959ULL, 2516243467ULL, 2559626975ULL, |
| 65 | + 2603010483ULL, 2646393991ULL, 2689777499ULL, 2733161007ULL, 2776544515ULL, 2819928023ULL, |
| 66 | + 2863311531ULL, 2906695039ULL, 2950078547ULL, 2993462055ULL, 3036845563ULL, 3080229071ULL, |
| 67 | + 3123612579ULL, 3166996087ULL, 3210379595ULL, 3253763103ULL, 3297146611ULL, 3340530119ULL, |
| 68 | + 3383913627ULL, 3427297135ULL, 3470680643ULL, 3514064151ULL, 3557447659ULL, 3600831168ULL, |
| 69 | + 3644214676ULL, 3687598184ULL, 3730981692ULL, 3774365200ULL, 3817748708ULL, 3861132216ULL, |
| 70 | + 3904515724ULL, 3947899232ULL, 3991282740ULL, 4034666248ULL, 4078049756ULL, 4121433264ULL, |
| 71 | + 4164816772ULL, 4208200280ULL, 4251583788ULL, 4294967295ULL}; |
| 72 | + |
| 73 | +/** |
| 74 | + * @brief Test natural (base-e) logarithm function with fixed-point arithmetic |
| 75 | + * |
| 76 | + * This test validates the ln_int32() function against MATLAB-generated reference |
| 77 | + * values. It tests 100 uniformly distributed input values across the full uint32_t |
| 78 | + * range, checking that the fixed-point logarithm calculation stays within acceptable |
| 79 | + * tolerance. |
| 80 | + * |
| 81 | + * Input values: Q32.0 format (unsigned 32-bit integers) |
| 82 | + * Result: UQ5.27 fixed-point format |
| 83 | + * Reference: MATLAB log() function results |
| 84 | + */ |
| 85 | +ZTEST(math_advanced_functions_suite, test_math_arithmetic_base_e_log_fixed) |
| 86 | +{ |
| 87 | + int i; |
| 88 | + |
| 89 | + BUILD_ASSERT(ARRAY_SIZE(uv) == ARRAY_SIZE(natural_log_lookup_table), |
| 90 | + "Test vector size must match reference table size"); |
| 91 | + |
| 92 | + for (i = 0; i < ARRAY_SIZE(uv); i++) { |
| 93 | + double logefxp = ln_int32(uv[i]); |
| 94 | + double diff = fabs(natural_log_lookup_table[i] - logefxp / (1 << 27)); |
| 95 | + |
| 96 | + zassert_true(diff <= CMP_TOLERANCE, |
| 97 | + "ln_int32(%u): diff %.16f > tolerance (expected %.16f, got %.16f)", |
| 98 | + uv[i], diff, natural_log_lookup_table[i], logefxp / (1 << 27)); |
| 99 | + } |
| 100 | +} |
0 commit comments