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

Side by Side Diff: Source/platform/audio/FFTFrame.cpp

Issue 170453004: Add constant twoPiDouble/twoPiFloat to MathExtras.h (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: add constant values to header Created 6 years, 10 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
« no previous file with comments | « Source/platform/audio/EqualPowerPanner.cpp ('k') | Source/platform/audio/SincResampler.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2010 Google Inc. All rights reserved. 2 * Copyright (C) 2010 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions 5 * modification, are permitted provided that the following conditions
6 * are met: 6 * are met:
7 * 7 *
8 * 1. Redistributions of source code must retain the above copyright 8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright 10 * 2. Redistributions in binary form must reproduce the above copyright
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after
144 double phase1 = arg(c1); 144 double phase1 = arg(c1);
145 double phase2 = arg(c2); 145 double phase2 = arg(c2);
146 146
147 double deltaPhase1 = phase1 - lastPhase1; 147 double deltaPhase1 = phase1 - lastPhase1;
148 double deltaPhase2 = phase2 - lastPhase2; 148 double deltaPhase2 = phase2 - lastPhase2;
149 lastPhase1 = phase1; 149 lastPhase1 = phase1;
150 lastPhase2 = phase2; 150 lastPhase2 = phase2;
151 151
152 // Unwrap phase deltas 152 // Unwrap phase deltas
153 if (deltaPhase1 > piDouble) 153 if (deltaPhase1 > piDouble)
154 deltaPhase1 -= 2.0 * piDouble; 154 deltaPhase1 -= twoPiDouble;
155 if (deltaPhase1 < -piDouble) 155 if (deltaPhase1 < -piDouble)
156 deltaPhase1 += 2.0 * piDouble; 156 deltaPhase1 += twoPiDouble;
157 if (deltaPhase2 > piDouble) 157 if (deltaPhase2 > piDouble)
158 deltaPhase2 -= 2.0 * piDouble; 158 deltaPhase2 -= twoPiDouble;
159 if (deltaPhase2 < -piDouble) 159 if (deltaPhase2 < -piDouble)
160 deltaPhase2 += 2.0 * piDouble; 160 deltaPhase2 += twoPiDouble;
161 161
162 // Blend group-delays 162 // Blend group-delays
163 double deltaPhaseBlend; 163 double deltaPhaseBlend;
164 164
165 if (deltaPhase1 - deltaPhase2 > piDouble) 165 if (deltaPhase1 - deltaPhase2 > piDouble)
166 deltaPhaseBlend = s1 * deltaPhase1 + s2 * (2.0 * piDouble + deltaPha se2); 166 deltaPhaseBlend = s1 * deltaPhase1 + s2 * (twoPiDouble + deltaPhase2 );
167 else if (deltaPhase2 - deltaPhase1 > piDouble) 167 else if (deltaPhase2 - deltaPhase1 > piDouble)
168 deltaPhaseBlend = s1 * (2.0 * piDouble + deltaPhase1) + s2 * deltaPh ase2; 168 deltaPhaseBlend = s1 * (twoPiDouble + deltaPhase1) + s2 * deltaPhase 2;
169 else 169 else
170 deltaPhaseBlend = s1 * deltaPhase1 + s2 * deltaPhase2; 170 deltaPhaseBlend = s1 * deltaPhase1 + s2 * deltaPhase2;
171 171
172 phaseAccum += deltaPhaseBlend; 172 phaseAccum += deltaPhaseBlend;
173 173
174 // Unwrap 174 // Unwrap
175 if (phaseAccum > piDouble) 175 if (phaseAccum > piDouble)
176 phaseAccum -= 2.0 * piDouble; 176 phaseAccum -= twoPiDouble;
177 if (phaseAccum < -piDouble) 177 if (phaseAccum < -piDouble)
178 phaseAccum += 2.0 * piDouble; 178 phaseAccum += twoPiDouble;
179 179
180 Complex c = complexFromMagnitudePhase(mag, phaseAccum); 180 Complex c = complexFromMagnitudePhase(mag, phaseAccum);
181 181
182 realP[i] = static_cast<float>(c.real()); 182 realP[i] = static_cast<float>(c.real());
183 imagP[i] = static_cast<float>(c.imag()); 183 imagP[i] = static_cast<float>(c.imag());
184 } 184 }
185 } 185 }
186 186
187 double FFTFrame::extractAverageGroupDelay() 187 double FFTFrame::extractAverageGroupDelay()
188 { 188 {
189 float* realP = realData(); 189 float* realP = realData();
190 float* imagP = imagData(); 190 float* imagP = imagData();
191 191
192 double aveSum = 0.0; 192 double aveSum = 0.0;
193 double weightSum = 0.0; 193 double weightSum = 0.0;
194 double lastPhase = 0.0; 194 double lastPhase = 0.0;
195 195
196 int halfSize = fftSize() / 2; 196 int halfSize = fftSize() / 2;
197 197
198 const double kSamplePhaseDelay = (2.0 * piDouble) / double(fftSize()); 198 const double kSamplePhaseDelay = (twoPiDouble) / double(fftSize());
199 199
200 // Calculate weighted average group delay 200 // Calculate weighted average group delay
201 for (int i = 0; i < halfSize; i++) { 201 for (int i = 0; i < halfSize; i++) {
202 Complex c(realP[i], imagP[i]); 202 Complex c(realP[i], imagP[i]);
203 double mag = abs(c); 203 double mag = abs(c);
204 double phase = arg(c); 204 double phase = arg(c);
205 205
206 double deltaPhase = phase - lastPhase; 206 double deltaPhase = phase - lastPhase;
207 lastPhase = phase; 207 lastPhase = phase;
208 208
209 // Unwrap 209 // Unwrap
210 if (deltaPhase < -piDouble) 210 if (deltaPhase < -piDouble)
211 deltaPhase += 2.0 * piDouble; 211 deltaPhase += twoPiDouble;
212 if (deltaPhase > piDouble) 212 if (deltaPhase > piDouble)
213 deltaPhase -= 2.0 * piDouble; 213 deltaPhase -= twoPiDouble;
214 214
215 aveSum += mag * deltaPhase; 215 aveSum += mag * deltaPhase;
216 weightSum += mag; 216 weightSum += mag;
217 } 217 }
218 218
219 // Note how we invert the phase delta wrt frequency since this is how group delay is defined 219 // Note how we invert the phase delta wrt frequency since this is how group delay is defined
220 double ave = aveSum / weightSum; 220 double ave = aveSum / weightSum;
221 double aveSampleDelay = -ave / kSamplePhaseDelay; 221 double aveSampleDelay = -ave / kSamplePhaseDelay;
222 222
223 // Leave 20 sample headroom (for leading edge of impulse) 223 // Leave 20 sample headroom (for leading edge of impulse)
224 if (aveSampleDelay > 20.0) 224 if (aveSampleDelay > 20.0)
225 aveSampleDelay -= 20.0; 225 aveSampleDelay -= 20.0;
226 226
227 // Remove average group delay (minus 20 samples for headroom) 227 // Remove average group delay (minus 20 samples for headroom)
228 addConstantGroupDelay(-aveSampleDelay); 228 addConstantGroupDelay(-aveSampleDelay);
229 229
230 // Remove DC offset 230 // Remove DC offset
231 realP[0] = 0.0f; 231 realP[0] = 0.0f;
232 232
233 return aveSampleDelay; 233 return aveSampleDelay;
234 } 234 }
235 235
236 void FFTFrame::addConstantGroupDelay(double sampleFrameDelay) 236 void FFTFrame::addConstantGroupDelay(double sampleFrameDelay)
237 { 237 {
238 int halfSize = fftSize() / 2; 238 int halfSize = fftSize() / 2;
239 239
240 float* realP = realData(); 240 float* realP = realData();
241 float* imagP = imagData(); 241 float* imagP = imagData();
242 242
243 const double kSamplePhaseDelay = (2.0 * piDouble) / double(fftSize()); 243 const double kSamplePhaseDelay = (twoPiDouble) / double(fftSize());
244 244
245 double phaseAdj = -sampleFrameDelay * kSamplePhaseDelay; 245 double phaseAdj = -sampleFrameDelay * kSamplePhaseDelay;
246 246
247 // Add constant group delay 247 // Add constant group delay
248 for (int i = 1; i < halfSize; i++) { 248 for (int i = 1; i < halfSize; i++) {
249 Complex c(realP[i], imagP[i]); 249 Complex c(realP[i], imagP[i]);
250 double mag = abs(c); 250 double mag = abs(c);
251 double phase = arg(c); 251 double phase = arg(c);
252 252
253 phase += i * phaseAdj; 253 phase += i * phaseAdj;
(...skipping 22 matching lines...) Expand all
276 276
277 WTF_LOG(WebAudio, "[%d] (%f %f)\n", i, mag, phase); 277 WTF_LOG(WebAudio, "[%d] (%f %f)\n", i, mag, phase);
278 } 278 }
279 WTF_LOG(WebAudio, "****\n"); 279 WTF_LOG(WebAudio, "****\n");
280 } 280 }
281 #endif // NDEBUG 281 #endif // NDEBUG
282 282
283 } // namespace WebCore 283 } // namespace WebCore
284 284
285 #endif // ENABLE(WEB_AUDIO) 285 #endif // ENABLE(WEB_AUDIO)
OLDNEW
« no previous file with comments | « Source/platform/audio/EqualPowerPanner.cpp ('k') | Source/platform/audio/SincResampler.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698