blob: cc568bade0c3f80ac2175a923a31e43df58c49f5 [file] [log] [blame]
ragoff0a51f2018-03-22 09:55:50 -07001/*
2 * Copyright (C) 2018 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#ifndef RDSP_H
18#define RDSP_H
19
20#include <complex>
21#include <log/log.h>
22#include <vector>
ragod55d0f32018-05-15 18:57:31 -070023#include <map>
ragoff0a51f2018-03-22 09:55:50 -070024using FloatVec = std::vector<float>;
ragod55d0f32018-05-15 18:57:31 -070025using IntVec = std::vector<int>;
ragoff0a51f2018-03-22 09:55:50 -070026using ComplexVec = std::vector<std::complex<float>>;
27
28// =======
29// DSP window creation
30// =======
31
32#define TWOPI (M_PI * 2)
33
34enum rdsp_window_type {
35 RDSP_WINDOW_RECTANGULAR,
36 RDSP_WINDOW_TRIANGULAR,
37 RDSP_WINDOW_TRIANGULAR_FLAT_TOP,
38 RDSP_WINDOW_HAMMING,
39 RDSP_WINDOW_HAMMING_FLAT_TOP,
40 RDSP_WINDOW_HANNING,
41 RDSP_WINDOW_HANNING_FLAT_TOP,
42};
43
44template <typename T>
45static void fillRectangular(T &v) {
46 const size_t size = v.size();
47 for (size_t i = 0; i < size; i++) {
48 v[i] = 1.0;
49 }
50} //rectangular
51
52template <typename T>
53static void fillTriangular(T &v, size_t overlap) {
54 const size_t size = v.size();
55 //ramp up
56 size_t i = 0;
57 if (overlap > 0) {
58 for (; i < overlap; i++) {
59 v[i] = (2.0 * i + 1) / (2 * overlap);
60 }
61 }
62
63 //flat top
64 for (; i < size - overlap; i++) {
65 v[i] = 1.0;
66 }
67
68 //ramp down
69 if (overlap > 0) {
70 for (; i < size; i++) {
71 v[i] = (2.0 * (size - i) - 1) / (2 * overlap);
72 }
73 }
74} //triangular
75
76template <typename T>
77static void fillHamming(T &v, size_t overlap) {
78 const size_t size = v.size();
79 const size_t twoOverlap = 2 * overlap;
80 size_t i = 0;
81 if (overlap > 0) {
82 for (; i < overlap; i++) {
83 v[i] = 0.54 - 0.46 * cos(TWOPI * i /(twoOverlap - 1));
84 }
85 }
86
87 //flat top
88 for (; i < size - overlap; i++) {
89 v[i] = 1.0;
90 }
91
92 //ramp down
93 if (overlap > 0) {
94 for (; i < size; i++) {
95 int k = i - ((int)size - 2 * overlap);
96 v[i] = 0.54 - 0.46 * cos(TWOPI * k / (twoOverlap - 1));
97 }
98 }
99} //hamming
100
101template <typename T>
102static void fillHanning(T &v, size_t overlap) {
103 const size_t size = v.size();
104 const size_t twoOverlap = 2 * overlap;
105 //ramp up
106 size_t i = 0;
107 if (overlap > 0) {
108 for (; i < overlap; i++) {
109 v[i] = 0.5 * (1.0 - cos(TWOPI * i / (twoOverlap - 1)));
110 }
111 }
112
113 //flat top
114 for (; i < size - overlap; i++) {
115 v[i] = 1.0;
116 }
117
118 //ramp down
119 if (overlap > 0) {
120 for (; i < size; i++) {
121 int k = i - ((int)size - 2 * overlap);
122 v[i] = 0.5 * (1.0 - cos(TWOPI * k / (twoOverlap - 1)));
123 }
124 }
125}
126
127template <typename T>
128static void fill_window(T &v, int type, size_t size, size_t overlap) {
129 if (overlap > size / 2) {
130 overlap = size / 2;
131 }
132 v.resize(size);
133
134 switch (type) {
135 case RDSP_WINDOW_RECTANGULAR:
136 fillRectangular(v);
137 break;
138 case RDSP_WINDOW_TRIANGULAR:
139 fillTriangular(v, size / 2);
140 break;
141 case RDSP_WINDOW_TRIANGULAR_FLAT_TOP:
142 fillTriangular(v, overlap);
143 break;
144 case RDSP_WINDOW_HAMMING:
145 fillHamming(v, size / 2);
146 break;
147 case RDSP_WINDOW_HAMMING_FLAT_TOP:
148 fillHamming(v, overlap);
149 break;
150 case RDSP_WINDOW_HANNING:
151 fillHanning(v, size / 2);
152 break;
153 case RDSP_WINDOW_HANNING_FLAT_TOP:
154 fillHanning(v, overlap);
155 break;
156 default:
157 ALOGE("Error: unknown window type %d", type);
158 }
159}
160
161//};
162#endif //RDSP_H