Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(241)

Side by Side Diff: webrtc/modules/audio_processing/aec/aec_resampler.cc

Issue 1754223004: Move aec_resampler.c to be built using C++ (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Changed reinterpret_cast to static_cast Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source 5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
(...skipping 25 matching lines...) Expand all
36 static int EstimateSkew(const int* rawSkew, 36 static int EstimateSkew(const int* rawSkew,
37 int size, 37 int size,
38 int absLimit, 38 int absLimit,
39 float* skewEst); 39 float* skewEst);
40 40
41 void* WebRtcAec_CreateResampler() { 41 void* WebRtcAec_CreateResampler() {
42 return malloc(sizeof(AecResampler)); 42 return malloc(sizeof(AecResampler));
43 } 43 }
44 44
45 int WebRtcAec_InitResampler(void* resampInst, int deviceSampleRateHz) { 45 int WebRtcAec_InitResampler(void* resampInst, int deviceSampleRateHz) {
46 AecResampler* obj = (AecResampler*)resampInst; 46 AecResampler* obj = static_cast<AecResampler*>(resampInst);
47 memset(obj->buffer, 0, sizeof(obj->buffer)); 47 memset(obj->buffer, 0, sizeof(obj->buffer));
48 obj->position = 0.0; 48 obj->position = 0.0;
49 49
50 obj->deviceSampleRateHz = deviceSampleRateHz; 50 obj->deviceSampleRateHz = deviceSampleRateHz;
51 memset(obj->skewData, 0, sizeof(obj->skewData)); 51 memset(obj->skewData, 0, sizeof(obj->skewData));
52 obj->skewDataIndex = 0; 52 obj->skewDataIndex = 0;
53 obj->skewEstimate = 0.0; 53 obj->skewEstimate = 0.0;
54 54
55 return 0; 55 return 0;
56 } 56 }
57 57
58 void WebRtcAec_FreeResampler(void* resampInst) { 58 void WebRtcAec_FreeResampler(void* resampInst) {
59 AecResampler* obj = (AecResampler*)resampInst; 59 AecResampler* obj = static_cast<AecResampler*>(resampInst);
60 free(obj); 60 free(obj);
61 } 61 }
62 62
63 void WebRtcAec_ResampleLinear(void* resampInst, 63 void WebRtcAec_ResampleLinear(void* resampInst,
64 const float* inspeech, 64 const float* inspeech,
65 size_t size, 65 size_t size,
66 float skew, 66 float skew,
67 float* outspeech, 67 float* outspeech,
68 size_t* size_out) { 68 size_t* size_out) {
69 AecResampler* obj = (AecResampler*)resampInst; 69 AecResampler* obj = static_cast<AecResampler*>(resampInst);
70 70
71 float* y; 71 float* y;
72 float be, tnew; 72 float be, tnew;
73 size_t tn, mm; 73 size_t tn, mm;
74 74
75 assert(size <= 2 * FRAME_LEN); 75 assert(size <= 2 * FRAME_LEN);
76 assert(resampInst != NULL); 76 assert(resampInst != NULL);
77 assert(inspeech != NULL); 77 assert(inspeech != NULL);
78 assert(outspeech != NULL); 78 assert(outspeech != NULL);
79 assert(size_out != NULL); 79 assert(size_out != NULL);
(...skipping 11 matching lines...) Expand all
91 91
92 tnew = be * mm + obj->position; 92 tnew = be * mm + obj->position;
93 tn = (size_t)tnew; 93 tn = (size_t)tnew;
94 94
95 while (tn < size) { 95 while (tn < size) {
96 // Interpolation 96 // Interpolation
97 outspeech[mm] = y[tn] + (tnew - tn) * (y[tn + 1] - y[tn]); 97 outspeech[mm] = y[tn] + (tnew - tn) * (y[tn + 1] - y[tn]);
98 mm++; 98 mm++;
99 99
100 tnew = be * mm + obj->position; 100 tnew = be * mm + obj->position;
101 tn = (int)tnew; 101 tn = static_cast<int>(tnew);
102 } 102 }
103 103
104 *size_out = mm; 104 *size_out = mm;
105 obj->position += (*size_out) * be - size; 105 obj->position += (*size_out) * be - size;
106 106
107 // Shift buffer 107 // Shift buffer
108 memmove(obj->buffer, &obj->buffer[size], 108 memmove(obj->buffer, &obj->buffer[size],
109 (kResamplerBufferSize - size) * sizeof(obj->buffer[0])); 109 (kResamplerBufferSize - size) * sizeof(obj->buffer[0]));
110 } 110 }
111 111
112 int WebRtcAec_GetSkew(void* resampInst, int rawSkew, float* skewEst) { 112 int WebRtcAec_GetSkew(void* resampInst, int rawSkew, float* skewEst) {
113 AecResampler* obj = (AecResampler*)resampInst; 113 AecResampler* obj = static_cast<AecResampler*>(resampInst);
114 int err = 0; 114 int err = 0;
115 115
116 if (obj->skewDataIndex < kEstimateLengthFrames) { 116 if (obj->skewDataIndex < kEstimateLengthFrames) {
117 obj->skewData[obj->skewDataIndex] = rawSkew; 117 obj->skewData[obj->skewDataIndex] = rawSkew;
118 obj->skewDataIndex++; 118 obj->skewDataIndex++;
119 } else if (obj->skewDataIndex == kEstimateLengthFrames) { 119 } else if (obj->skewDataIndex == kEstimateLengthFrames) {
120 err = EstimateSkew(obj->skewData, kEstimateLengthFrames, 120 err = EstimateSkew(obj->skewData, kEstimateLengthFrames,
121 obj->deviceSampleRateHz, skewEst); 121 obj->deviceSampleRateHz, skewEst);
122 obj->skewEstimate = *skewEst; 122 obj->skewEstimate = *skewEst;
123 obj->skewDataIndex++; 123 obj->skewDataIndex++;
124 } else { 124 } else {
125 *skewEst = obj->skewEstimate; 125 *skewEst = obj->skewEstimate;
126 } 126 }
127 127
128 return err; 128 return err;
129 } 129 }
130 130
131 int EstimateSkew(const int* rawSkew, 131 int EstimateSkew(const int* rawSkew,
132 int size, 132 int size,
133 int deviceSampleRateHz, 133 int deviceSampleRateHz,
134 float* skewEst) { 134 float* skewEst) {
135 const int absLimitOuter = (int)(0.04f * deviceSampleRateHz); 135 const int absLimitOuter = static_cast<int>(0.04f * deviceSampleRateHz);
136 const int absLimitInner = (int)(0.0025f * deviceSampleRateHz); 136 const int absLimitInner = static_cast<int>(0.0025f * deviceSampleRateHz);
137 int i = 0; 137 int i = 0;
138 int n = 0; 138 int n = 0;
139 float rawAvg = 0; 139 float rawAvg = 0;
140 float err = 0; 140 float err = 0;
141 float rawAbsDev = 0; 141 float rawAbsDev = 0;
142 int upperLimit = 0; 142 int upperLimit = 0;
143 int lowerLimit = 0; 143 int lowerLimit = 0;
144 float cumSum = 0; 144 float cumSum = 0;
145 float x = 0; 145 float x = 0;
146 float x2 = 0; 146 float x2 = 0;
(...skipping 18 matching lines...) Expand all
165 rawAvg /= n; 165 rawAvg /= n;
166 166
167 for (i = 0; i < size; i++) { 167 for (i = 0; i < size; i++) {
168 if ((rawSkew[i] < absLimitOuter && rawSkew[i] > -absLimitOuter)) { 168 if ((rawSkew[i] < absLimitOuter && rawSkew[i] > -absLimitOuter)) {
169 err = rawSkew[i] - rawAvg; 169 err = rawSkew[i] - rawAvg;
170 rawAbsDev += err >= 0 ? err : -err; 170 rawAbsDev += err >= 0 ? err : -err;
171 } 171 }
172 } 172 }
173 assert(n > 0); 173 assert(n > 0);
174 rawAbsDev /= n; 174 rawAbsDev /= n;
175 upperLimit = (int)(rawAvg + 5 * rawAbsDev + 1); // +1 for ceiling. 175 upperLimit = static_cast<int>(rawAvg + 5 * rawAbsDev + 1); // +1 for ceiling.
176 lowerLimit = (int)(rawAvg - 5 * rawAbsDev - 1); // -1 for floor. 176 lowerLimit = static_cast<int>(rawAvg - 5 * rawAbsDev - 1); // -1 for floor.
177 177
178 n = 0; 178 n = 0;
179 for (i = 0; i < size; i++) { 179 for (i = 0; i < size; i++) {
180 if ((rawSkew[i] < absLimitInner && rawSkew[i] > -absLimitInner) || 180 if ((rawSkew[i] < absLimitInner && rawSkew[i] > -absLimitInner) ||
181 (rawSkew[i] < upperLimit && rawSkew[i] > lowerLimit)) { 181 (rawSkew[i] < upperLimit && rawSkew[i] > lowerLimit)) {
182 n++; 182 n++;
183 cumSum += rawSkew[i]; 183 cumSum += rawSkew[i];
184 x += n; 184 x += n;
185 x2 += n * n; 185 x2 += n * n;
186 y += cumSum; 186 y += cumSum;
187 xy += n * cumSum; 187 xy += n * cumSum;
188 } 188 }
189 } 189 }
190 190
191 if (n == 0) { 191 if (n == 0) {
192 return -1; 192 return -1;
193 } 193 }
194 assert(n > 0); 194 assert(n > 0);
195 xAvg = x / n; 195 xAvg = x / n;
196 denom = x2 - xAvg * x; 196 denom = x2 - xAvg * x;
197 197
198 if (denom != 0) { 198 if (denom != 0) {
199 skew = (xy - xAvg * y) / denom; 199 skew = (xy - xAvg * y) / denom;
200 } 200 }
201 201
202 *skewEst = skew; 202 *skewEst = skew;
203 return 0; 203 return 0;
204 } 204 }
OLDNEW
« no previous file with comments | « webrtc/modules/audio_processing/aec/aec_resampler.c ('k') | webrtc/modules/audio_processing/aec/echo_cancellation.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698