Skip to content

Commit 24b5236

Browse files
authored
Merge pull request #10 from techpro-studio/dev
Dev
2 parents 2101a4d + 4a46f39 commit 24b5236

14 files changed

Lines changed: 453 additions & 99 deletions

CMakeLists.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,14 +76,18 @@ endif()
7676

7777
if (USE_SIGNAL_API)
7878
list(APPEND SOURCES
79+
nntoolkitcore/signal/mel_filterbank.c
7980
nntoolkitcore/signal/dft.c
8081
nntoolkitcore/signal/dft.h
8182
nntoolkitcore/signal/spectrogram.c
83+
nntoolkitcore/signal/log_mel_spectrogram.c
8284
nntoolkitcore/signal/window.c
8385
)
8486
list(APPEND PUBLIC_HEADERS
87+
nntoolkitcore/signal/mel_filterbank.h
8588
nntoolkitcore/signal/window.h
8689
nntoolkitcore/signal/spectrogram.h
90+
nntoolkitcore/signal/log_mel_spectrogram.h
8791
)
8892
if(NOT APPLE)
8993
list(APPEND SOURCES

NNToolkitCore.podspec

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ Pod::Spec.new do |s|
1818
'nntoolkitcore/layers/*.{h}',
1919
'nntoolkitcore/train/*.{h}',
2020
'nntoolkitcore/signal/spectrogram.h',
21+
'nntoolkitcore/signal/mel_filterbank.h',
22+
'nntoolkitcore/signal/log_mel_spectrogram.h',
2123
'nntoolkitcore/signal/window.h',
2224
'nntoolkitcore/core/debug.h',
2325
'nntoolkitcore/core/ops.h'

nntoolkitcore/core/apple_ops.c

Lines changed: 35 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -15,23 +15,23 @@
1515

1616
#define simd_float_16_init(var, value) \
1717
float var##arr[16] = { value, value, value, value, value, value, value, value, value, value, value, value, value, value, value, value };\
18-
simd_float16 var = simd_make_float16(*(simd_float16 *)(var##arr));\
18+
simd_float16 var = simd_make_float16(*(simd_packed_float16 *)(var##arr));\
1919

2020
#define simd_float_8_init(var, value) \
2121
float var##arr[8] = { value, value, value, value, value, value, value, value };\
22-
simd_float8 var = simd_make_float8(*(simd_float8 *)(var##arr));\
22+
simd_float8 var = simd_make_float8(*(simd_packed_float8 *)(var##arr));\
2323

2424
#define simd_float_4_init(var, value) \
2525
float var##arr[4] = { value, value, value, value };\
26-
simd_float4 var = simd_make_float4(*(simd_float4 *)(var##arr));\
26+
simd_float4 var = simd_make_float4(*(simd_packed_float4 *)(var##arr));\
2727

2828
#define simd_float_3_init(var, value) \
2929
float var##arr[3] = { value, value, value };\
3030
simd_float3 var = simd_make_float3(*(simd_float3 *)(var##arr));\
3131

3232
#define simd_float_2_init(var, value) \
3333
float var##arr[2] = { value, value };\
34-
simd_float2 var = simd_make_float2(*(simd_float2 *)(var##arr));\
34+
simd_float2 var = simd_make_float2(*(simd_packed_float2 *)(var##arr));\
3535

3636

3737
#define vector_dot_(NUM) float op_vec_dot_##NUM(const float* a, const float *b, int size)\
@@ -83,7 +83,7 @@ float op_vec_dot_3(const float* a, const float *b, int size)
8383
{\
8484
simd_float_##NUM##_init(s_min, min)\
8585
simd_float_##NUM##_init(s_max, max)\
86-
((simd_float##NUM*) c)[i] = simd_clamp(((simd_float##NUM*) a)[i], s_min, s_max);\
86+
((simd_float##NUM*) c)[i] = simd_clamp(((simd_packed_float##NUM*) a)[i], s_min, s_max);\
8787
}\
8888
int left = size % NUM;\
8989
for (int i = 0; i < left; ++i)\
@@ -93,7 +93,6 @@ float op_vec_dot_3(const float* a, const float *b, int size)
9393
}
9494

9595
op_vec_clamp_(2)
96-
op_vec_clamp_(3)
9796
op_vec_clamp_(4)
9897
op_vec_clamp_(8)
9998
op_vec_clamp_(16)
@@ -104,8 +103,8 @@ op_vec_clamp_(16)
104103
int iterations = size / NUM;\
105104
for (int i = 0; i < iterations; ++i)\
106105
{\
107-
simd_float_##NUM##_init(s_b, b)\
108-
((simd_float##NUM*) c)[i] = simd_max(((simd_float##NUM*) a)[i], s_b);\
106+
simd_float_##NUM##_init(s_b, b)\
107+
((simd_float##NUM*) c)[i] = simd_max(((simd_packed_float##NUM*) a)[i], s_b);\
109108
}\
110109
int left = size % NUM;\
111110
for (int i = 0; i < left; ++i)\
@@ -114,14 +113,23 @@ op_vec_clamp_(16)
114113
}\
115114
}
116115

116+
void op_vec_max_sc_4(const float* a, float b, float *c, int size)\
117+
{\
118+
int iterations = size / 4;
119+
for (int i = 0; i < iterations; ++i)
120+
{
121+
simd_float_4_init(s_b, b)
122+
simd_float4 s_a = ((simd_packed_float4 *) a)[i];
123+
((simd_packed_float4*) c)[i] = simd_max(s_a, s_b);
124+
}
125+
int left = size % 4;
126+
for (int i = 0; i < left; ++i)
127+
{
128+
c[iterations * 4 + i] = simd_max(a[iterations * 4 + i], b);
129+
}
130+
}
117131

118132

119-
op_vec_max_sc_(2)
120-
op_vec_max_sc_(3)
121-
op_vec_max_sc_(4)
122-
op_vec_max_sc_(8)
123-
op_vec_max_sc_(16)
124-
125133
typedef enum {
126134
two = 2, three = 3, four = 4, eight = 8, sixteen = 16
127135
}optimal_vector_size;
@@ -146,24 +154,6 @@ optimal_vector_size get_optimal_vector_size(int size){
146154
return values[optimalIndex];
147155
}
148156

149-
#define get_optimized(func) func##_fn func##_get_optimized(int size){\
150-
optimal_vector_size value = get_optimal_vector_size(size);\
151-
switch (value) {\
152-
case two:\
153-
return func##_2;\
154-
case three:\
155-
return func##_3;\
156-
case four:\
157-
return func##_4;\
158-
case eight:\
159-
return func##_8;\
160-
case sixteen:\
161-
return func##_16;\
162-
default:\
163-
return func##_4;\
164-
}\
165-
}
166-
167157
typedef float (*op_vec_dot_fn)(const float *a, const float *b, int size);
168158

169159
typedef void (*op_vec_clamp_fn)(const float *a, float *c, float min, float max, int size);
@@ -176,9 +166,6 @@ op_vec_clamp_fn op_vec_clamp_get_optimized(int size);
176166

177167
op_vec_max_sc_fn op_vec_max_sc_get_optimized(int size);
178168

179-
get_optimized(op_vec_dot)
180-
get_optimized(op_vec_clamp)
181-
get_optimized(op_vec_max_sc)
182169

183170
void op_vec_max(const float *a, const float *b, float *c, int size){
184171
vDSP_vmax(a, 1, b, 1, c, 1, size);
@@ -194,9 +181,6 @@ float op_vec_dot(const float *a, const float *b, int size) {
194181
#else
195182
return op_vec_dot_4(a, b, size);
196183
#endif
197-
// float c;
198-
// vDSP_dotpr(a, 1, b, 1, &c, size);
199-
// return c;
200184
}
201185

202186
void op_vec_clamp(const float *a, float *c, float min, float max, int size){
@@ -215,7 +199,7 @@ void op_vec_sub(const float *a, const float *b, float *result, int size){
215199
vDSP_vsub(b, 1, a, 1, result, 1, size);
216200
}
217201

218-
void op_vec_sum(const float *a, float* result, int size){
202+
void op_vec_sum(const float *a, float* result, int size) {
219203
vDSP_sve(a, 1, result, size);
220204
}
221205

@@ -247,6 +231,15 @@ void op_vec_exp(const float *a, float *c, int size) {
247231
vvexpf(c, a, &size);
248232
}
249233

234+
void op_vec_pow(const float *a, const float *b, float *c, int size) {
235+
vvpowf(c, b, a, &size);
236+
}
237+
238+
void op_vec_pow_sc(const float *a, const float b, float *c, int size) {
239+
vvpowsf(c, &b, a, &size);
240+
}
241+
242+
250243
void op_vec_log(const float *a, float *c, int size) {
251244
vvlogf(c, a, &size);
252245
}
@@ -263,7 +256,7 @@ void op_vec_div(const float *a, const float *b, float *c, int size) {
263256
vDSP_vdiv(b, 1, a, 1, c, 1, size);
264257
}
265258

266-
void op_vec_magnitudes(float *a, float *b, float *c, int size) {
259+
void op_vec_magn_sq(float *a, float *b, float *c, int size) {
267260
DSPSplitComplex split = {a, b};
268261
vDSP_zvmags(&split, 1, c, 1, size);
269262
}
@@ -281,3 +274,5 @@ void op_mat_transp(const float *a, float *b, int M, int N) {
281274
}
282275

283276

277+
278+

nntoolkitcore/core/default_ops.cc

Lines changed: 45 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// Created by Alex on 07.11.2020.
33
//
44

5+
56
#include "ops.h"
67
#include "math.h"
78
#include "third_party/eigen3/Eigen/Dense"
@@ -305,6 +306,44 @@ void op_vec_exp(const float *a, float *c, int size){
305306
#endif
306307
}
307308

309+
static inline void op_vec_pow_c(const float *a, const float *b, float *c, int size) {
310+
for (int i = 0; i < size; ++i){
311+
c[i] = powf(a[i], b[i]);
312+
}
313+
}
314+
// x ^^ m = exp(m * log(x))
315+
316+
void op_vec_pow(const float *a, const float *b, float *c, int size){
317+
#if NEON
318+
int parts = size / 4, remaining = size % 4;
319+
for (int i = 0; i < parts; ++i){
320+
vst1q_f32(c + i * 4, exp_neon(vmulq_f32(vld1q_f32(b + 4 * i), log_neon(vld1q_f32(a + 4 * i)))));
321+
}
322+
op_vec_pow_c(a + parts * 4, b + parts * 4, c + parts * 4, remaining);
323+
#else
324+
op_vec_pow_c(a, b, c, size);
325+
#endif
326+
}
327+
328+
static inline void op_vec_pow_sc_c(const float *a, const float b, float *c, int size) {
329+
for (int i = 0; i < size; ++i){
330+
c[i] = powf(a[i], b);
331+
}
332+
}
333+
334+
void op_vec_pow_sc(const float *a, const float b, float *c, int size) {
335+
#if NEON
336+
int parts = size / 4, remaining = size % 4;
337+
for (int i = 0; i < parts; ++i){
338+
vst1q_f32(c + i * 4, exp_neon(vmulq_f32(vdupq_n_f32(b), log_neon(vld1q_f32(a + 4 * i)))));
339+
}
340+
op_vec_pow_sc_c(a + parts * 4, b, c + parts * 4, remaining);
341+
#else
342+
op_vec_pow_sc_c(a, b, c, size);
343+
#endif
344+
}
345+
346+
308347
static inline void op_vec_log_c(const float *a, float *c, int size){
309348
for (int i = 0; i < size; ++i){
310349
c[i] = logf(a[i]);
@@ -465,7 +504,7 @@ void op_vec_add_sc(const float *a, float b, float *c, int size) {
465504

466505
static void op_vec_sub_sc_c(const float *a, float b, float *c, int size){
467506
for (int i = 0; i < size; ++i){
468-
c[i] = a[i] + b;
507+
c[i] = a[i] - b;
469508
}
470509
}
471510

@@ -624,23 +663,23 @@ void op_vec_sum(const float *a, float* c, int size) {
624663
}
625664

626665

627-
static void op_vec_magnitudes_c(const float *a, const float *b, float *c, int size){
666+
static void op_vec_magn_sq_c(const float *a, const float *b, float *c, int size){
628667
for (int i = 0; i < size; ++i){
629668
c[i] = a[i] * a[i] + b[i] * b[i];
630669
}
631670
}
632671

633-
void op_vec_magnitudes(float *a, float *b, float *c, int size) {
672+
void op_vec_magn_sq(float *a, float *b, float *c, int size) {
634673
#if NEON
635674
int parts = size / 4, remaining = size % 4;
636675
for (int i = 0; i < parts; ++i){
637676
float32x4_t a_4 = vld1q_f32(a + 4 * i);
638677
float32x4_t b_4 = vld1q_f32(b + 4 * i);
639678
vst1q_f32(c + i * 4, vaddq_f32(vmulq_f32(a_4, a_4), vmulq_f32(b_4, b_4)));
640679
}
641-
op_vec_magnitudes_c(a + parts * 4, b + parts * 4, c + parts * 4, remaining);
680+
op_vec_magn_sq_c(a + parts * 4, b + parts * 4, c + parts * 4, remaining);
642681
#else
643-
op_vec_magnitudes_c(a, b, c, size);
682+
op_vec_magn_sq_c(a, b, c, size);
644683
#endif
645684
}
646685

@@ -715,3 +754,4 @@ void op_mat_transp(const float *a, float *b, int M, int N) {
715754

716755

717756

757+

nntoolkitcore/core/memory.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
#ifndef memory_h
66
#define memory_h
77

8+
#include "stdlib.h"
9+
810
float *f_malloc(unsigned long size);
911

1012
void f_copy(float *dst, const float *src, unsigned long size);

nntoolkitcore/core/ops.h

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,13 +44,21 @@ void op_vec_sqrt(const float *a, float *c, int size);
4444

4545
void op_vec_exp(const float *a, float *c, int size);
4646

47+
void op_vec_pow(const float *a, const float *b, float *c, int size);
48+
49+
void op_vec_pow_sc(const float *a, const float b, float *c, int size);
50+
51+
void op_vec_min(const float *a, const float *b, float *c, int size);
52+
53+
void op_vec_max(const float *a, const float *b, float *c, int size);
54+
4755
void op_vec_log(const float *a, float *c, int size);
4856

4957
void op_vec_tanh(const float *a, float *c, int size);
5058

5159
void op_vec_reciprocal(const float *a, float *c, int size);
5260

53-
void op_vec_magnitudes(float *a, float *b, float *c, int size);
61+
void op_vec_magn_sq(float *a, float *b, float *c, int size);
5462

5563
void op_vec_db(float *a, float b, float *c, int size);
5664

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
//
2+
// Created by Alex on 18.12.2020.
3+
//
4+
5+
#include "log_mel_spectrogram.h"
6+
#include "stdlib.h"
7+
#include "nntoolkitcore/core/memory.h"
8+
#include "nntoolkitcore/core/ops.h"
9+
10+
struct LogMelSpectrogramStruct {
11+
MelFilterBankConfig mel_filter_bank_config;
12+
Spectrogram spectrogram;
13+
MelFilterBank bank;
14+
int ts;
15+
int mel_output_size;
16+
float *buffer;
17+
};
18+
19+
LogMelSpectrogram LogMelSpectrogramCreate(Spectrogram spectrogram, MelFilterBankConfig mel_filter_bank_config){
20+
LogMelSpectrogram filter = malloc(sizeof(struct LogMelSpectrogramStruct));
21+
filter->spectrogram = spectrogram;
22+
SpectrogramConfig s_cfg = SpectrogramGetConfig(spectrogram);
23+
filter->ts = s_cfg.ntime_series;
24+
filter->mel_output_size = filter->ts * mel_filter_bank_config.n_mels;
25+
filter->mel_filter_bank_config = mel_filter_bank_config;
26+
filter->bank = MelFilterBankCreate(mel_filter_bank_config);
27+
filter->buffer = f_malloc(s_cfg.ntime_series * s_cfg.nfreq);
28+
return filter;
29+
}
30+
31+
void LogMelSpectrogramApply(LogMelSpectrogram filter, const float *input, float* output){
32+
SpectrogramApply(filter->spectrogram, input, filter->buffer);
33+
MelFilterBankApply(filter->bank, filter->buffer, output, filter->ts);
34+
op_vec_add_sc(output, 1.5849e-13, output, filter->mel_output_size);
35+
op_vec_log(output, output, filter->mel_output_size);
36+
}
37+
38+
void LogMelSpectrogramDestroy(LogMelSpectrogram filter){
39+
MelFilterBankDestroy(filter->bank);
40+
free(filter->buffer);
41+
free(filter);
42+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
//
2+
// Created by Alex on 18.12.2020.
3+
//
4+
5+
#ifndef log_mel_spectrogram_h
6+
#define log_mel_spectrogram_h
7+
8+
#include "spectrogram.h"
9+
#include "mel_filterbank.h"
10+
11+
12+
typedef struct LogMelSpectrogramStruct* LogMelSpectrogram;
13+
14+
LogMelSpectrogram LogMelSpectrogramCreate(Spectrogram spectrogram, MelFilterBankConfig mel_filter_bank_config);
15+
16+
void LogMelSpectrogramApply(LogMelSpectrogram filter, const float *input, float* output);
17+
18+
void LogMelSpectrogramDestroy(LogMelSpectrogram filter);
19+
20+
#endif //log_mel_spectrogram_h

0 commit comments

Comments
 (0)