Line data Source code
1 : /*
2 : * Copyright (C) 2011 Google Inc. All rights reserved.
3 : *
4 : * Redistribution and use in source and binary forms, with or without
5 : * modification, are permitted provided that the following conditions
6 : * are met:
7 : *
8 : * 1. Redistributions of source code must retain the above copyright
9 : * notice, this list of conditions and the following disclaimer.
10 : * 2. Redistributions in binary form must reproduce the above copyright
11 : * notice, this list of conditions and the following disclaimer in the
12 : * documentation and/or other materials provided with the distribution.
13 : * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
14 : * its contributors may be used to endorse or promote products derived
15 : * from this software without specific prior written permission.
16 : *
17 : * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
18 : * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19 : * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20 : * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
21 : * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22 : * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23 : * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
24 : * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 : * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 : * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 : */
28 :
29 : #include "ZeroPole.h"
30 :
31 : #include "DenormalDisabler.h"
32 :
33 : #include <cmath>
34 : #include <float.h>
35 :
36 : namespace WebCore {
37 :
38 0 : void ZeroPole::process(const float *source, float *destination, int framesToProcess)
39 : {
40 0 : float zero = m_zero;
41 0 : float pole = m_pole;
42 :
43 : // Gain compensation to make 0dB @ 0Hz
44 0 : const float k1 = 1 / (1 - zero);
45 0 : const float k2 = 1 - pole;
46 :
47 : // Member variables to locals.
48 0 : float lastX = m_lastX;
49 0 : float lastY = m_lastY;
50 :
51 0 : for (int i = 0; i < framesToProcess; ++i) {
52 0 : float input = source[i];
53 :
54 : // Zero
55 0 : float output1 = k1 * (input - zero * lastX);
56 0 : lastX = input;
57 :
58 : // Pole
59 0 : float output2 = k2 * output1 + pole * lastY;
60 0 : lastY = output2;
61 :
62 0 : destination[i] = output2;
63 : }
64 :
65 : // Locals to member variables. Flush denormals here so we don't
66 : // slow down the inner loop above.
67 : #ifndef HAVE_DENORMAL
68 : if (lastX == 0.0f && lastY != 0.0f && fabsf(lastY) < FLT_MIN) {
69 : // Flush future values to zero (until there is new input).
70 : lastY = 0.0;
71 :
72 : // Flush calculated values.
73 : for (int i = framesToProcess; i-- && fabsf(destination[i]) < FLT_MIN; ) {
74 : destination[i] = 0.0f;
75 : }
76 : }
77 : #endif
78 :
79 0 : m_lastX = lastX;
80 0 : m_lastY = lastY;
81 0 : }
82 :
83 : } // namespace WebCore
|