1 #include "../hrtf/mysofa.h"
2 #include "../hrtf/tools.h"
3 #include "tests.h"
4 #include <assert.h>
5 #include <float.h>
6 #include <math.h>
7 #include <stdio.h>
8 #include <string.h>
9 
test_resample()10 void test_resample() {
11   struct MYSOFA_HRTF *hrtf;
12   int err = 0, i;
13   float *backupIr;
14   float *backupDelays;
15   int resampFactor = 2;    // integer, >= 1
16   int num_ir_to_test = 10; // number of filters to test in the IR, to avoid
17                            // going through all potential positions / channels
18   float irPeakValue = 0.0;
19 
20   // hrtf = mysofa_load("tests/Pulse.sofa", &err);
21   hrtf = mysofa_load("tests/CIPIC_subject_003_hrir_final_itdInDelayField.sofa",
22                      &err);
23   if (!hrtf) {
24     CU_FAIL_FATAL("Error reading file.");
25     return;
26   }
27 
28   // backup (non resampled) IR
29   backupIr = malloc(sizeof(float) * hrtf->N * num_ir_to_test);
30   if (!backupIr) {
31     CU_FAIL_FATAL("No memory, N (IR) is too large.");
32     mysofa_free(hrtf);
33     return;
34   }
35 
36   for (i = 0; i < hrtf->N * num_ir_to_test; i++) {
37     backupIr[i] = hrtf->DataIR.values[i];
38     irPeakValue = fmax(irPeakValue, backupIr[i]);
39   }
40 
41   // backup (non resampled) Delays
42   backupDelays = malloc(sizeof(float) * hrtf->DataDelay.elements);
43   if (!backupDelays) {
44     CU_FAIL_FATAL("No memory, N (Delay) is too large.");
45     mysofa_free(hrtf);
46     return;
47   }
48 
49   for (i = 0; i < hrtf->DataDelay.elements; i++) {
50     backupDelays[i] = hrtf->DataDelay.values[i];
51   }
52 
53   float fsOld = hrtf->DataSamplingRate.values[0];
54   float fsNew = resampFactor * fsOld;
55   err = mysofa_resample(hrtf, fsNew);
56   CU_ASSERT_FATAL(err == MYSOFA_OK);
57 
58   // loop over delays (in samples), check resampling factor correctly applied
59   float delayThresh = 0.001; // in samples, maximum acceptable error threshold
60   for (i = 0; i < hrtf->DataDelay.elements; i += 2 * resampFactor) {
61 #ifdef VDEBUG
62     printf("%f %f ", backupDelays[i] / fsOld,
63            hrtf->DataDelay.values[i] / fsNew);
64 #endif
65     CU_ASSERT(fabs(backupDelays[i] / fsOld -
66                    hrtf->DataDelay.values[i] / fsNew) <= delayThresh);
67   }
68 
69   // loop over IR to check if paired values still match after resampling
70   float irThresh = 0.001 * irPeakValue; // relative acceptable error threshold
71   for (i = 0; i < hrtf->N * num_ir_to_test; i += resampFactor) {
72 
73 #ifdef VDEBUG
74     printf("%f %f ", backupIr[i / resampFactor], hrtf->DataIR.values[i]);
75     if ((i % hrtf->N) == (hrtf->N - 1))
76       printf("\n");
77 #endif
78     CU_ASSERT((fabs(hrtf->DataIR.values[i] - backupIr[i / resampFactor]) <=
79                irThresh));
80   }
81 
82   free(backupIr);
83   free(backupDelays);
84   mysofa_free(hrtf);
85 }
86