-
Notifications
You must be signed in to change notification settings - Fork 19
/
functions.hpp
109 lines (95 loc) · 3.47 KB
/
functions.hpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
/* Edge Impulse inferencing library
* Copyright (c) 2020 EdgeImpulse Inc.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
#ifndef _EIDSP_SPEECHPY_FUNCTIONS_H_
#define _EIDSP_SPEECHPY_FUNCTIONS_H_
#include <math.h>
#include "../numpy.hpp"
#include "../returntypes.hpp"
namespace ei {
namespace speechpy {
class functions {
public:
/**
* Converting from frequency to Mel scale
*
* @param f The frequency values(or a single frequency) in Hz.
* @returns The mel scale values(or a single mel).
*/
static float frequency_to_mel(float f) {
return 1127.0 * numpy::log(1 + f / 700.0f);
}
/**
* Converting from Mel scale to frequency.
*
* @param mel The mel scale values(or a single mel).
* @returns The frequency values(or a single frequency) in Hz.
*/
static float mel_to_frequency(float mel) {
return 700.0f * (exp(mel / 1127.0f) - 1.0f);
}
/**
* This function handle the issue with zero values if the are exposed
* to become an argument for any log function.
* @param input Array
* @param input_size Size of array
* @returns void
*/
static void zero_handling(float *input, size_t input_size) {
for (size_t ix = 0; ix < input_size; ix++) {
if (input[ix] == 0) {
input[ix] = FLT_EPSILON;
}
}
}
/**
* This function handle the issue with zero values if the are exposed
* to become an argument for any log function.
* @param input Matrix
* @returns void
*/
static void zero_handling(matrix_t *input) {
zero_handling(input->buffer, input->rows * input->cols);
}
/**
* Triangle, I'm not really sure what this does
* @param x Linspace output, will be overwritten!
* @param x_size Size of the linspace output
* @param left
* @param middle
* @param right
*/
static void triangle(float *x, size_t x_size, int left, int middle, int right) {
EI_DSP_MATRIX(out, 1, x_size);
for (size_t ix = 0; ix < x_size; ix++) {
if (x[ix] > left && x[ix] <= middle) {
out.buffer[ix] = (x[ix] - left) / (middle - left);
}
if (x[ix] < right && middle <= x[ix]) {
out.buffer[ix] = (right - x[ix]) / (right - middle);
}
}
memcpy(x, out.buffer, x_size * sizeof(float));
}
};
} // namespace speechpy
} // namespace ei
#endif // _EIDSP_SPEECHPY_FUNCTIONS_H_