1 // SPDX-License-Identifier: BSD-3-Clause
2 //
3 // Copyright(c) 2021 Intel Corporation. All rights reserved.
4 //
5 // Author: Shriram Shastry <malladi.sastry@linux.intel.com>
6 
7 #include <stdio.h>
8 #include <stdint.h>
9 #include <stdarg.h>
10 #include <stddef.h>
11 #include <setjmp.h>
12 #include <math.h>
13 #include <cmocka.h>
14 #include <string.h>
15 
16 #include <sof/math/log.h>
17 #include <sof/audio/format.h>
18 #include <rtos/string.h>
19 #include <sof/common.h>
20 #include "log2_tables.h"
21 /* 'Error[max] = 0.0000164133276926,THD(-dBc) = -95.6960671942683234' */
22 /* 'Error[max] = rms(log() - double(log_int32()))' */
23 /* 'THD = 20*log10(Error[max])' */
24 #define CMP_TOLERANCE 0.0000164133276926
25 
26 /* Natural logarithm loge(X) reference table generated by matlab/Octave */
27 /* UQ5.27 */
28 static const double natural_log_lookup_table[] = {
29 	0.0000000000000000,	 17.5855899268523359, 18.2787371074122831, 18.6842022155204468,
30 	18.9718842879722267, 19.1950278392864391, 19.3773493960803940, 19.5315000759076511,
31 	19.6650314685321739, 19.7828145041885577, 19.8881750198463827, 19.9834851996507084,
32 	20.0704965766403376, 20.1505392860869676, 20.2246472581140395, 20.2936401294912301,
33 	20.3581786505327571, 20.4188032722644479, 20.4759616860290699, 20.5300289072319480,
34 	20.5813222015588408, 20.6301123656733907, 20.6766323812583899, 20.7210841437836706,
35 	20.7636437581607112, 20.8044657526425461, 20.8436864657603671, 20.8814267937103786,
36 	20.9177944378507625, 20.9528857576336485, 20.9867873092828354, 21.0195771320810394,
37 	21.0513258303723845, 21.0820974890173112, 21.1119504521464485, 21.1409379890003279,
38 	21.1691088659487328, 21.1965078407425196, 21.2231760877918916, 21.2491515741640455,
39 	21.2744693821187845, 21.2991619946810467, 21.3232595462333343, 21.3467900436180038,
40 	21.3697795618183370, 21.3922524176471107, 21.4142313243436178, 21.4357375295432568,
41 	21.4567909387206548, 21.4774102259037889, 21.4976129332024932, 21.5174155604805932,
42 	21.5368336463203107, 21.5558818412742781, 21.5745739742703257, 21.5929231129229997,
43 	21.6109416184107097, 21.6286411954956677, 21.6460329381935921, 21.6631273715394208,
44 	21.6799344898427790, 21.6964637917813938, 21.7127243130127638, 21.7287246543415016,
45 	21.7444730112924880, 21.7599771978118319, 21.7752446699265008, 21.7902825472754031,
46 	21.8050976330453672, 21.8196964324517815, 21.8340851698895619, 21.8482698048676056,
47 	21.8622560468288185, 21.8760493689479993, 21.8896550209909755, 21.9030780413106569,
48 	21.9163232680485471, 21.9293953496040821, 21.9422987544284780, 21.9550377801946830,
49 	21.9676165623906030, 21.9800390823784895, 21.9923091749598925, 22.0044305354820757,
50 	22.0164067265188734, 22.0282411841561903, 22.0399372239099236, 22.0514980465667030,
51 	22.0629267423782807, 22.0742262976204415, 22.0853995982070579, 22.0964494343823858,
52 	22.1073785049035614, 22.1181894209970018, 22.1288847101032040, 22.1394668194234150,
53 	22.1499381192805984, 22.1603009063062437, 22.1705574064637361, 22.1807097776854185};
54 
55 /* testvector in Q32.0 */
56 static const uint32_t uv[100] = {
57 	1ULL,	 43383509ULL,	86767017ULL,   130150525ULL, 173534033ULL, 216917541ULL,
58 	260301049ULL, 303684557ULL,  347068065ULL,  390451573ULL, 433835081ULL, 477218589ULL,
59 	520602097ULL, 563985605ULL,  607369113ULL,  650752621ULL, 694136129ULL, 737519638ULL,
60 	780903146ULL, 824286654ULL,  867670162ULL,  911053670ULL, 954437178ULL, 997820686ULL,
61 	1041204194ULL, 1084587702ULL, 1127971210ULL, 1171354718ULL, 1214738226ULL, 1258121734ULL,
62 	1301505242ULL, 1344888750ULL, 1388272258ULL, 1431655766ULL, 1475039274ULL, 1518422782ULL,
63 	1561806290ULL, 1605189798ULL, 1648573306ULL, 1691956814ULL, 1735340322ULL, 1778723830ULL,
64 	1822107338ULL, 1865490846ULL, 1908874354ULL, 1952257862ULL, 1995641370ULL, 2039024878ULL,
65 	2082408386ULL, 2125791894ULL, 2169175403ULL, 2212558911ULL, 2255942419ULL, 2299325927ULL,
66 	2342709435ULL, 2386092943ULL, 2429476451ULL, 2472859959ULL, 2516243467ULL, 2559626975ULL,
67 	2603010483ULL, 2646393991ULL, 2689777499ULL, 2733161007ULL, 2776544515ULL, 2819928023ULL,
68 	2863311531ULL, 2906695039ULL, 2950078547ULL, 2993462055ULL, 3036845563ULL, 3080229071ULL,
69 	3123612579ULL, 3166996087ULL, 3210379595ULL, 3253763103ULL, 3297146611ULL, 3340530119ULL,
70 	3383913627ULL, 3427297135ULL, 3470680643ULL, 3514064151ULL, 3557447659ULL, 3600831168ULL,
71 	3644214676ULL, 3687598184ULL, 3730981692ULL, 3774365200ULL, 3817748708ULL, 3861132216ULL,
72 	3904515724ULL, 3947899232ULL, 3991282740ULL, 4034666248ULL, 4078049756ULL, 4121433264ULL,
73 	4164816772ULL, 4208200280ULL, 4251583788ULL, 4294967295ULL};
74 
test_math_arithmetic_base_e_log_fixed(void ** state)75 static void test_math_arithmetic_base_e_log_fixed(void **state)
76 {
77 	(void)state;
78 
79 	double logefxp;
80 	double diff;
81 	int i;
82 
83 	for (i = 0; i < ARRAY_SIZE(natural_log_lookup_table); i++) {
84 		logefxp = ln_int32(uv[i]);
85 		diff = fabs(natural_log_lookup_table[i] - (double)logefxp / (1 << 27));
86 
87 		if (diff > CMP_TOLERANCE) {
88 			printf("%s: diff for %.16f: value = %16d, log() = %.16f\n", __func__, diff,
89 			       uv[i], logefxp / (1 << 27));
90 			assert_true(diff <= CMP_TOLERANCE);
91 		}
92 	}
93 }
94 
main(void)95 int main(void)
96 {
97 	const struct CMUnitTest tests[] = {
98 		cmocka_unit_test(test_math_arithmetic_base_e_log_fixed)
99 	};
100 
101 	cmocka_set_message_output(CM_OUTPUT_TAP);
102 
103 	return cmocka_run_group_tests(tests, NULL, NULL);
104 }
105