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