Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 Loading... | |
| 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 Loading... | |
| 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 = reinterpret_cast<AecResampler*>(resampInst); |
|
the sun
2016/03/03 15:18:34
Why not static_cast here?
peah-webrtc
2016/03/03 19:14:53
Not sure why it is needed. The cl upload wanted th
the sun
2016/03/03 19:19:46
I think the CL should be consistent with itself. I
peah-webrtc
2016/03/04 05:14:19
Done.
| |
| 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 Loading... | |
| 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 } |
| OLD | NEW |