Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions test/ztest/unit/math/advanced/functions/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -30,10 +30,16 @@ target_compile_definitions(app PRIVATE
target_sources(app PRIVATE
test_scalar_power_ztest.c
test_base2_logarithm_ztest.c
test_base10_logarithm_ztest.c
test_base_e_logarithm_ztest.c
test_exponential_ztest.c
test_square_root_ztest.c
${SOF_ROOT}/src/math/power.c
${SOF_ROOT}/src/math/base2log.c
${SOF_ROOT}/src/math/log_10.c
${SOF_ROOT}/src/math/log_e.c
${SOF_ROOT}/src/math/exp_fcn.c
${SOF_ROOT}/src/math/sqrt_int16.c
# Note: exp_fcn_hifi.c is conditionally compiled only for Xtensa HiFi platforms.
# TODO: Enable these tests on Xtensa platforms to also test HiFi-optimized code paths.
${SOF_ROOT}/src/math/exp_fcn_hifi.c
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
// SPDX-License-Identifier: BSD-3-Clause
//
// Copyright(c) 2026 Intel Corporation. All rights reserved.
//
// Converted from CMock to Ztest
//
// Original test from sof/test/cmocka/src/math/arithmetic/base_10_logarithm.c:
// Author: Shriram Shastry <malladi.sastry@linux.intel.com>

#include <zephyr/ztest.h>
#include <stdint.h>
#include <math.h>

#include <sof/math/log.h>

/* 'Error[max] = 0.0000071279028671,THD = -102.9407645424143993 ' */
/* 'Error[max] = rms(log10() - double(log10_int32()))' */
/* 'THD = 20*log10(Error[max])' */
#define CMP_TOLERANCE 0.0000071279028671

/* Natural logarithm log10(X) reference table generated by matlab/Octave */
/* UQ4.28 */
static const double common_log10_ref_table[] = {
0.0000000000000000, 7.6373246662453802, 7.9383546619093615, 8.1144459209650428,
8.2393846575733427, 8.3362946705813989, 8.4154759166290241, 8.4824227062596371,
8.5404146532373240, 8.5915671756847054, 8.6373246662453802, 8.6787173514036056,
8.7165059122930053, 8.7512680193222625, 8.7834527026386606, 8.8134159259684335,
8.8414446495269665, 8.8677735882125130, 8.8925971719048302, 8.9160782677250818,
8.9383546624098908, 8.9595439614559940, 8.9797473475226131, 8.9990525026982162,
9.0175359083740947, 9.0352646753178405, 9.0522980146012202, 9.0686884307751292,
9.0844826979451199, 9.0997226644895282, 9.1144459212987297, 9.1286863604025754,
9.1424746448781171, 9.1558386064266184, 9.1688035835820649, 9.1813927108816724,
9.1936271672907388, 9.2055263908534872, 9.2171082633890631, 9.2283892737852433,
9.2393846580738721, 9.2501085234534361, 9.2605739571199752, 9.2707931222905753,
9.2807773431865943, 9.2905371804656394, 9.3000824983621975, 9.3094225246070792,
9.3185659040380759, 9.3275207466824899, 9.3362946709818218, 9.3448948427358882,
9.3533280102652014, 9.3616005362239267, 9.3697184264391105, 9.3776873561036460,
9.3855126936091011, 9.3931995222691196, 9.4007526601535094, 9.4081766782268659,
9.4154759169627091, 9.4226545015843630, 9.4297163562280168, 9.4366652161756566,
9.4435046406985137, 9.4502380233502628, 9.4568686022422757, 9.4633994693944423,
9.4698335793932600, 9.4761737574178788, 9.4824227066886628, 9.4885830153874373,
9.4946571630937573, 9.5006475267772306, 9.5065563863821918, 9.5123859300375031,
9.5181382589213257, 9.5238153918078847, 9.5294192693208828, 9.5349517579159713,
9.5404146536127215, 9.5458096854947918, 9.5511385189953373, 9.5564027589832818,
9.5616039526647825, 9.5667435923129869, 9.5718231178381536, 9.5768439193242560,
9.5818073388505756, 9.5867146733402073, 9.5915671761296206, 9.5963660590064990,
9.6011124940261787, 9.6058076152298781, 9.6104525202710605, 9.6150482719557271,
9.6195958997020572, 9.6240964009244330, 9.6285507423464711, 9.6329598611462810};

/* testvector in Q32.0 */
static const uint32_t uv[100] = {
1ULL, 43383509ULL, 86767017ULL, 130150525ULL, 173534033ULL, 216917541ULL,
260301049ULL, 303684557ULL, 347068065ULL, 390451573ULL, 433835081ULL, 477218589ULL,
520602097ULL, 563985605ULL, 607369113ULL, 650752621ULL, 694136129ULL, 737519638ULL,
780903146ULL, 824286654ULL, 867670162ULL, 911053670ULL, 954437178ULL, 997820686ULL,
1041204194ULL, 1084587702ULL, 1127971210ULL, 1171354718ULL, 1214738226ULL, 1258121734ULL,
1301505242ULL, 1344888750ULL, 1388272258ULL, 1431655766ULL, 1475039274ULL, 1518422782ULL,
1561806290ULL, 1605189798ULL, 1648573306ULL, 1691956814ULL, 1735340322ULL, 1778723830ULL,
1822107338ULL, 1865490846ULL, 1908874354ULL, 1952257862ULL, 1995641370ULL, 2039024878ULL,
2082408386ULL, 2125791894ULL, 2169175403ULL, 2212558911ULL, 2255942419ULL, 2299325927ULL,
2342709435ULL, 2386092943ULL, 2429476451ULL, 2472859959ULL, 2516243467ULL, 2559626975ULL,
2603010483ULL, 2646393991ULL, 2689777499ULL, 2733161007ULL, 2776544515ULL, 2819928023ULL,
2863311531ULL, 2906695039ULL, 2950078547ULL, 2993462055ULL, 3036845563ULL, 3080229071ULL,
3123612579ULL, 3166996087ULL, 3210379595ULL, 3253763103ULL, 3297146611ULL, 3340530119ULL,
3383913627ULL, 3427297135ULL, 3470680643ULL, 3514064151ULL, 3557447659ULL, 3600831168ULL,
3644214676ULL, 3687598184ULL, 3730981692ULL, 3774365200ULL, 3817748708ULL, 3861132216ULL,
3904515724ULL, 3947899232ULL, 3991282740ULL, 4034666248ULL, 4078049756ULL, 4121433264ULL,
4164816772ULL, 4208200280ULL, 4251583788ULL, 4294967295ULL};

ZTEST(math_advanced_functions_suite, test_math_arithmetic_base10log_fixed)
{
double clogfxp;
double diff;
int i;

for (i = 0; i < ARRAY_SIZE(common_log10_ref_table); i++) {
clogfxp = log10_int32(uv[i]);
diff = fabs(common_log10_ref_table[i] - (double)clogfxp / (1 << 28));
Comment on lines +50 to +78

if (diff > CMP_TOLERANCE) {
zassert_true(diff <= CMP_TOLERANCE,
"log10_int32(%u): delta %.16f > tolerance (got %.16f)",
uv[i], diff, clogfxp / (1 << 28));
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
// SPDX-License-Identifier: BSD-3-Clause
//
// Copyright(c) 2026 Intel Corporation. All rights reserved.
//
// These contents may have been developed with support from one or more Intel-operated
// generative artificial intelligence solutions.
//
// Converted from CMock to Ztest
//
// Original test from sof/test/cmocka/src/math/arithmetic/base_e_logarithm.c
// Author: Shriram Shastry <malladi.sastry@linux.intel.com>

#include <zephyr/ztest.h>
#include <stdint.h>
#include <math.h>

#include <sof/math/log.h>

/* Test data tables from MATLAB-generated reference */
#include "log2_tables.h"

Comment on lines +19 to +21
/* 'Error[max] = 0.0000164133276926,THD(-dBc) = -95.6960671942683234' */
/* 'Error[max] = rms(log() - double(log_int32()))' */
/* 'THD = 20*log10(Error[max])' */
#define CMP_TOLERANCE 0.0000164133276926

/* Natural logarithm loge(X) reference table generated by matlab/Octave */
/* UQ5.27 */
static const double natural_log_lookup_table[] = {
0.0000000000000000, 17.5855899268523359, 18.2787371074122831, 18.6842022155204468,
18.9718842879722267, 19.1950278392864391, 19.3773493960803940, 19.5315000759076511,
19.6650314685321739, 19.7828145041885577, 19.8881750198463827, 19.9834851996507084,
20.0704965766403376, 20.1505392860869676, 20.2246472581140395, 20.2936401294912301,
20.3581786505327571, 20.4188032722644479, 20.4759616860290699, 20.5300289072319480,
20.5813222015588408, 20.6301123656733907, 20.6766323812583899, 20.7210841437836706,
20.7636437581607112, 20.8044657526425461, 20.8436864657603671, 20.8814267937103786,
20.9177944378507625, 20.9528857576336485, 20.9867873092828354, 21.0195771320810394,
21.0513258303723845, 21.0820974890173112, 21.1119504521464485, 21.1409379890003279,
21.1691088659487328, 21.1965078407425196, 21.2231760877918916, 21.2491515741640455,
21.2744693821187845, 21.2991619946810467, 21.3232595462333343, 21.3467900436180038,
21.3697795618183370, 21.3922524176471107, 21.4142313243436178, 21.4357375295432568,
21.4567909387206548, 21.4774102259037889, 21.4976129332024932, 21.5174155604805932,
21.5368336463203107, 21.5558818412742781, 21.5745739742703257, 21.5929231129229997,
21.6109416184107097, 21.6286411954956677, 21.6460329381935921, 21.6631273715394208,
21.6799344898427790, 21.6964637917813938, 21.7127243130127638, 21.7287246543415016,
21.7444730112924880, 21.7599771978118319, 21.7752446699265008, 21.7902825472754031,
21.8050976330453672, 21.8196964324517815, 21.8340851698895619, 21.8482698048676056,
21.8622560468288185, 21.8760493689479993, 21.8896550209909755, 21.9030780413106569,
21.9163232680485471, 21.9293953496040821, 21.9422987544284780, 21.9550377801946830,
21.9676165623906030, 21.9800390823784895, 21.9923091749598925, 22.0044305354820757,
22.0164067265188734, 22.0282411841561903, 22.0399372239099236, 22.0514980465667030,
22.0629267423782807, 22.0742262976204415, 22.0853995982070579, 22.0964494343823858,
22.1073785049035614, 22.1181894209970018, 22.1288847101032040, 22.1394668194234150,
22.1499381192805984, 22.1603009063062437, 22.1705574064637361, 22.1807097776854185};

/* testvector in Q32.0 */
static const uint32_t uv[100] = {
1ULL, 43383509ULL, 86767017ULL, 130150525ULL, 173534033ULL, 216917541ULL,
260301049ULL, 303684557ULL, 347068065ULL, 390451573ULL, 433835081ULL, 477218589ULL,
520602097ULL, 563985605ULL, 607369113ULL, 650752621ULL, 694136129ULL, 737519638ULL,
780903146ULL, 824286654ULL, 867670162ULL, 911053670ULL, 954437178ULL, 997820686ULL,
1041204194ULL, 1084587702ULL, 1127971210ULL, 1171354718ULL, 1214738226ULL, 1258121734ULL,
1301505242ULL, 1344888750ULL, 1388272258ULL, 1431655766ULL, 1475039274ULL, 1518422782ULL,
1561806290ULL, 1605189798ULL, 1648573306ULL, 1691956814ULL, 1735340322ULL, 1778723830ULL,
1822107338ULL, 1865490846ULL, 1908874354ULL, 1952257862ULL, 1995641370ULL, 2039024878ULL,
2082408386ULL, 2125791894ULL, 2169175403ULL, 2212558911ULL, 2255942419ULL, 2299325927ULL,
2342709435ULL, 2386092943ULL, 2429476451ULL, 2472859959ULL, 2516243467ULL, 2559626975ULL,
2603010483ULL, 2646393991ULL, 2689777499ULL, 2733161007ULL, 2776544515ULL, 2819928023ULL,
2863311531ULL, 2906695039ULL, 2950078547ULL, 2993462055ULL, 3036845563ULL, 3080229071ULL,
3123612579ULL, 3166996087ULL, 3210379595ULL, 3253763103ULL, 3297146611ULL, 3340530119ULL,
3383913627ULL, 3427297135ULL, 3470680643ULL, 3514064151ULL, 3557447659ULL, 3600831168ULL,
3644214676ULL, 3687598184ULL, 3730981692ULL, 3774365200ULL, 3817748708ULL, 3861132216ULL,
3904515724ULL, 3947899232ULL, 3991282740ULL, 4034666248ULL, 4078049756ULL, 4121433264ULL,
4164816772ULL, 4208200280ULL, 4251583788ULL, 4294967295ULL};

/**
* @brief Test natural (base-e) logarithm function with fixed-point arithmetic
*
* This test validates the ln_int32() function against MATLAB-generated reference
* values. It tests 100 uniformly distributed input values across the full uint32_t
* range, checking that the fixed-point logarithm calculation stays within acceptable
* tolerance.
*
* Input values: Q32.0 format (unsigned 32-bit integers)
* Result: UQ5.27 fixed-point format
* Reference: MATLAB log() function results
*/
ZTEST(math_advanced_functions_suite, test_math_arithmetic_base_e_log_fixed)
{
int i;

BUILD_ASSERT(ARRAY_SIZE(uv) == ARRAY_SIZE(natural_log_lookup_table),
"Test vector size must match reference table size");

for (i = 0; i < ARRAY_SIZE(uv); i++) {
double logefxp = ln_int32(uv[i]);
double diff = fabs(natural_log_lookup_table[i] - logefxp / (1 << 27));

zassert_true(diff <= CMP_TOLERANCE,
"ln_int32(%u): diff %.16f > tolerance (expected %.16f, got %.16f)",
uv[i], diff, natural_log_lookup_table[i], logefxp / (1 << 27));
}
}
Loading
Loading