1*49fe348cSAndroid Build Coastguard Worker /******************************************************************************
2*49fe348cSAndroid Build Coastguard Worker *
3*49fe348cSAndroid Build Coastguard Worker * Copyright 2022 Google LLC
4*49fe348cSAndroid Build Coastguard Worker *
5*49fe348cSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
6*49fe348cSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
7*49fe348cSAndroid Build Coastguard Worker * You may obtain a copy of the License at:
8*49fe348cSAndroid Build Coastguard Worker *
9*49fe348cSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
10*49fe348cSAndroid Build Coastguard Worker *
11*49fe348cSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
12*49fe348cSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
13*49fe348cSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*49fe348cSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
15*49fe348cSAndroid Build Coastguard Worker * limitations under the License.
16*49fe348cSAndroid Build Coastguard Worker *
17*49fe348cSAndroid Build Coastguard Worker ******************************************************************************/
18*49fe348cSAndroid Build Coastguard Worker
19*49fe348cSAndroid Build Coastguard Worker #include "attdet.h"
20*49fe348cSAndroid Build Coastguard Worker
21*49fe348cSAndroid Build Coastguard Worker
22*49fe348cSAndroid Build Coastguard Worker /**
23*49fe348cSAndroid Build Coastguard Worker * Time domain attack detector
24*49fe348cSAndroid Build Coastguard Worker */
lc3_attdet_run(enum lc3_dt dt,enum lc3_srate sr,int nbytes,struct lc3_attdet_analysis * attdet,const int16_t * x)25*49fe348cSAndroid Build Coastguard Worker bool lc3_attdet_run(enum lc3_dt dt, enum lc3_srate sr,
26*49fe348cSAndroid Build Coastguard Worker int nbytes, struct lc3_attdet_analysis *attdet, const int16_t *x)
27*49fe348cSAndroid Build Coastguard Worker {
28*49fe348cSAndroid Build Coastguard Worker /* --- Check enabling --- */
29*49fe348cSAndroid Build Coastguard Worker
30*49fe348cSAndroid Build Coastguard Worker const int nbytes_ranges[][LC3_NUM_SRATE - LC3_SRATE_32K][2] = {
31*49fe348cSAndroid Build Coastguard Worker [LC3_DT_7M5 - LC3_DT_7M5] = { { 61, 149 }, { 75, 149 } },
32*49fe348cSAndroid Build Coastguard Worker [LC3_DT_10M - LC3_DT_7M5] = { { 81, INT_MAX }, { 100, INT_MAX } },
33*49fe348cSAndroid Build Coastguard Worker };
34*49fe348cSAndroid Build Coastguard Worker
35*49fe348cSAndroid Build Coastguard Worker if (dt < LC3_DT_7M5 || sr < LC3_SRATE_32K || lc3_hr(sr) ||
36*49fe348cSAndroid Build Coastguard Worker nbytes < nbytes_ranges[dt - LC3_DT_7M5][sr - LC3_SRATE_32K][0] ||
37*49fe348cSAndroid Build Coastguard Worker nbytes > nbytes_ranges[dt - LC3_DT_7M5][sr - LC3_SRATE_32K][1] )
38*49fe348cSAndroid Build Coastguard Worker return 0;
39*49fe348cSAndroid Build Coastguard Worker
40*49fe348cSAndroid Build Coastguard Worker /* --- Filtering & Energy calculation --- */
41*49fe348cSAndroid Build Coastguard Worker
42*49fe348cSAndroid Build Coastguard Worker int nblk = 4 - (dt == LC3_DT_7M5);
43*49fe348cSAndroid Build Coastguard Worker int32_t e[4];
44*49fe348cSAndroid Build Coastguard Worker
45*49fe348cSAndroid Build Coastguard Worker for (int i = 0; i < nblk; i++) {
46*49fe348cSAndroid Build Coastguard Worker e[i] = 0;
47*49fe348cSAndroid Build Coastguard Worker
48*49fe348cSAndroid Build Coastguard Worker if (sr == LC3_SRATE_32K) {
49*49fe348cSAndroid Build Coastguard Worker int16_t xn2 = (x[-4] + x[-3]) >> 1;
50*49fe348cSAndroid Build Coastguard Worker int16_t xn1 = (x[-2] + x[-1]) >> 1;
51*49fe348cSAndroid Build Coastguard Worker int16_t xn, xf;
52*49fe348cSAndroid Build Coastguard Worker
53*49fe348cSAndroid Build Coastguard Worker for (int j = 0; j < 40; j++, x += 2, xn2 = xn1, xn1 = xn) {
54*49fe348cSAndroid Build Coastguard Worker xn = (x[0] + x[1]) >> 1;
55*49fe348cSAndroid Build Coastguard Worker xf = (3 * xn - 4 * xn1 + 1 * xn2) >> 3;
56*49fe348cSAndroid Build Coastguard Worker e[i] += (xf * xf) >> 5;
57*49fe348cSAndroid Build Coastguard Worker }
58*49fe348cSAndroid Build Coastguard Worker }
59*49fe348cSAndroid Build Coastguard Worker
60*49fe348cSAndroid Build Coastguard Worker else {
61*49fe348cSAndroid Build Coastguard Worker int16_t xn2 = (x[-6] + x[-5] + x[-4]) >> 2;
62*49fe348cSAndroid Build Coastguard Worker int16_t xn1 = (x[-3] + x[-2] + x[-1]) >> 2;
63*49fe348cSAndroid Build Coastguard Worker int16_t xn, xf;
64*49fe348cSAndroid Build Coastguard Worker
65*49fe348cSAndroid Build Coastguard Worker for (int j = 0; j < 40; j++, x += 3, xn2 = xn1, xn1 = xn) {
66*49fe348cSAndroid Build Coastguard Worker xn = (x[0] + x[1] + x[2]) >> 2;
67*49fe348cSAndroid Build Coastguard Worker xf = (3 * xn - 4 * xn1 + 1 * xn2) >> 3;
68*49fe348cSAndroid Build Coastguard Worker e[i] += (xf * xf) >> 5;
69*49fe348cSAndroid Build Coastguard Worker }
70*49fe348cSAndroid Build Coastguard Worker }
71*49fe348cSAndroid Build Coastguard Worker }
72*49fe348cSAndroid Build Coastguard Worker
73*49fe348cSAndroid Build Coastguard Worker /* --- Attack detection ---
74*49fe348cSAndroid Build Coastguard Worker * The attack block `p_att` is defined as the normative value + 1,
75*49fe348cSAndroid Build Coastguard Worker * in such way, it will be initialized to 0 */
76*49fe348cSAndroid Build Coastguard Worker
77*49fe348cSAndroid Build Coastguard Worker int p_att = 0;
78*49fe348cSAndroid Build Coastguard Worker int32_t a[4];
79*49fe348cSAndroid Build Coastguard Worker
80*49fe348cSAndroid Build Coastguard Worker for (int i = 0; i < nblk; i++) {
81*49fe348cSAndroid Build Coastguard Worker a[i] = LC3_MAX(attdet->an1 >> 2, attdet->en1);
82*49fe348cSAndroid Build Coastguard Worker attdet->en1 = e[i], attdet->an1 = a[i];
83*49fe348cSAndroid Build Coastguard Worker
84*49fe348cSAndroid Build Coastguard Worker if ((e[i] >> 3) > a[i] + (a[i] >> 4))
85*49fe348cSAndroid Build Coastguard Worker p_att = i + 1;
86*49fe348cSAndroid Build Coastguard Worker }
87*49fe348cSAndroid Build Coastguard Worker
88*49fe348cSAndroid Build Coastguard Worker int att = attdet->p_att >= 1 + (nblk >> 1) || p_att > 0;
89*49fe348cSAndroid Build Coastguard Worker attdet->p_att = p_att;
90*49fe348cSAndroid Build Coastguard Worker
91*49fe348cSAndroid Build Coastguard Worker return att;
92*49fe348cSAndroid Build Coastguard Worker }
93