1 // Auto-generated file. Do not edit!
2 // Template: src/u32-filterbank-subtract/scalar.c.in
3 // Generator: tools/xngen
4 //
5 // Copyright 2022 Google LLC
6 //
7 // This source code is licensed under the BSD-style license found in the
8 // LICENSE file in the root directory of this source tree.
9
10 #include <assert.h>
11 #include <stddef.h>
12 #include <stdint.h>
13
14 #include <xnnpack/math.h>
15 #include <xnnpack/filterbank.h>
16
17
xnn_u32_filterbank_subtract_ukernel__scalar_x2(size_t batch_size,const uint32_t * input,uint32_t smoothing,uint32_t alternate_smoothing,uint32_t one_minus_smoothing,uint32_t alternate_one_minus_smoothing,uint32_t min_signal_remaining,uint32_t smoothing_bits,uint32_t spectral_subtraction_bits,uint32_t * noise_estimate,uint32_t * output)18 void xnn_u32_filterbank_subtract_ukernel__scalar_x2(
19 size_t batch_size,
20 const uint32_t* input,
21 uint32_t smoothing,
22 uint32_t alternate_smoothing,
23 uint32_t one_minus_smoothing,
24 uint32_t alternate_one_minus_smoothing,
25 uint32_t min_signal_remaining,
26 uint32_t smoothing_bits, /* 0 in FE */
27 uint32_t spectral_subtraction_bits, /* 14 in FE */
28 uint32_t* noise_estimate,
29 uint32_t* output) {
30
31 assert(batch_size != 0);
32 assert(batch_size % 2 == 0);
33 assert(input != NULL);
34 assert(output != NULL);
35 assert(noise_estimate != NULL);
36
37 batch_size >>= 1; /* 48 in FE */
38
39 do {
40 const uint32_t vinput0 = input[0];
41 const uint32_t vinput1 = input[1];
42 input += 2;
43
44 uint32_t vnoise_estimate0 = noise_estimate[0];
45 uint32_t vnoise_estimate1 = noise_estimate[1];
46
47 // Scale up signal for smoothing filter computation.
48 const uint32_t vsignal_scaled_up0 = vinput0 << smoothing_bits;
49 const uint32_t vsignal_scaled_up1 = vinput1 << smoothing_bits;
50
51 vnoise_estimate0 = (uint32_t) ((math_mulext_u32(vsignal_scaled_up0, smoothing) +
52 math_mulext_u32(vnoise_estimate0, one_minus_smoothing)) >> spectral_subtraction_bits);
53 vnoise_estimate1 = (uint32_t) ((math_mulext_u32(vsignal_scaled_up1, alternate_smoothing) +
54 math_mulext_u32(vnoise_estimate1, alternate_one_minus_smoothing)) >> spectral_subtraction_bits);
55
56 noise_estimate[0] = vnoise_estimate0;
57 noise_estimate[1] = vnoise_estimate1;
58 noise_estimate += 2;
59
60 const uint32_t vfloor0 = (uint32_t) (math_mulext_u32(vinput0, min_signal_remaining) >> spectral_subtraction_bits);
61 const uint32_t vfloor1 = (uint32_t) (math_mulext_u32(vinput1, min_signal_remaining) >> spectral_subtraction_bits);
62 const uint32_t vsubtracted0 = math_doz_u32(vsignal_scaled_up0, vnoise_estimate0) >> smoothing_bits;
63 const uint32_t vsubtracted1 = math_doz_u32(vsignal_scaled_up1, vnoise_estimate1) >> smoothing_bits;
64 const uint32_t vout0 = math_max_u32(vsubtracted0, vfloor0);
65 const uint32_t vout1 = math_max_u32(vsubtracted1, vfloor1);
66
67 output[0] = vout0;
68 output[1] = vout1;
69 output += 2;
70
71 } while (--batch_size != 0);
72 }
73