• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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