annotate libaf/window.c @ 27404:778fac8c186f

Add separate variables for CFLAGS that are specific to internal libraries and only add them to CFLAGS when compiling objects from those libraries.
author diego
date Thu, 07 Aug 2008 21:46:06 +0000
parents 8eff880f638c
children 72d0b1444141
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
7568
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
1 /*=============================================================================
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
2 //
13602
14090f7300a8 The full name of the GPL is GNU General Public License.
diego
parents: 7568
diff changeset
3 // This software has been released under the terms of the GNU General Public
7568
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
4 // license. See http://www.gnu.org/copyleft/gpl.html for details.
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
5 //
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
6 // Copyright 2001 Anders Johansson ajh@atri.curtin.edu.au
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
7 //
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
8 //=============================================================================
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
9 */
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
10
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
11 /* Calculates a number of window functions. The following window
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
12 functions are currently implemented: Boxcar, Triang, Hanning,
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
13 Hamming, Blackman, Flattop and Kaiser. In the function call n is
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
14 the number of filter taps and w the buffer in which the filter
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
15 coefficients will be stored.
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
16 */
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
17
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
18 #include <math.h>
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
19 #include "dsp.h"
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
20
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
21 /*
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
22 // Boxcar
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
23 //
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
24 // n window length
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
25 // w buffer for the window parameters
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
26 */
26350
07abe94a9cc4 Fix illegal identifier: Rename _ftype_t macro to FLOAT_TYPE.
diego
parents: 14274
diff changeset
27 void af_window_boxcar(int n, FLOAT_TYPE* w)
7568
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
28 {
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
29 int i;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
30 // Calculate window coefficients
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
31 for (i=0 ; i<n ; i++)
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
32 w[i] = 1.0;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
33 }
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
34
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
35
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
36 /*
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
37 // Triang a.k.a Bartlett
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
38 //
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
39 // | (N-1)|
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
40 // 2 * |k - -----|
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
41 // | 2 |
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
42 // w = 1.0 - ---------------
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
43 // N+1
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
44 // n window length
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
45 // w buffer for the window parameters
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
46 */
26350
07abe94a9cc4 Fix illegal identifier: Rename _ftype_t macro to FLOAT_TYPE.
diego
parents: 14274
diff changeset
47 void af_window_triang(int n, FLOAT_TYPE* w)
7568
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
48 {
26350
07abe94a9cc4 Fix illegal identifier: Rename _ftype_t macro to FLOAT_TYPE.
diego
parents: 14274
diff changeset
49 FLOAT_TYPE k1 = (FLOAT_TYPE)(n & 1);
07abe94a9cc4 Fix illegal identifier: Rename _ftype_t macro to FLOAT_TYPE.
diego
parents: 14274
diff changeset
50 FLOAT_TYPE k2 = 1/((FLOAT_TYPE)n + k1);
7568
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
51 int end = (n + 1) >> 1;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
52 int i;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
53
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
54 // Calculate window coefficients
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
55 for (i=0 ; i<end ; i++)
26350
07abe94a9cc4 Fix illegal identifier: Rename _ftype_t macro to FLOAT_TYPE.
diego
parents: 14274
diff changeset
56 w[i] = w[n-i-1] = (2.0*((FLOAT_TYPE)(i+1))-(1.0-k1))*k2;
7568
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
57 }
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
58
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
59
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
60 /*
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
61 // Hanning
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
62 // 2*pi*k
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
63 // w = 0.5 - 0.5*cos(------), where 0 < k <= N
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
64 // N+1
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
65 // n window length
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
66 // w buffer for the window parameters
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
67 */
26350
07abe94a9cc4 Fix illegal identifier: Rename _ftype_t macro to FLOAT_TYPE.
diego
parents: 14274
diff changeset
68 void af_window_hanning(int n, FLOAT_TYPE* w)
7568
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
69 {
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
70 int i;
26350
07abe94a9cc4 Fix illegal identifier: Rename _ftype_t macro to FLOAT_TYPE.
diego
parents: 14274
diff changeset
71 FLOAT_TYPE k = 2*M_PI/((FLOAT_TYPE)(n+1)); // 2*pi/(N+1)
7568
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
72
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
73 // Calculate window coefficients
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
74 for (i=0; i<n; i++)
26350
07abe94a9cc4 Fix illegal identifier: Rename _ftype_t macro to FLOAT_TYPE.
diego
parents: 14274
diff changeset
75 *w++ = 0.5*(1.0 - cos(k*(FLOAT_TYPE)(i+1)));
7568
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
76 }
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
77
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
78 /*
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
79 // Hamming
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
80 // 2*pi*k
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
81 // w(k) = 0.54 - 0.46*cos(------), where 0 <= k < N
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
82 // N-1
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
83 //
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
84 // n window length
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
85 // w buffer for the window parameters
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
86 */
26350
07abe94a9cc4 Fix illegal identifier: Rename _ftype_t macro to FLOAT_TYPE.
diego
parents: 14274
diff changeset
87 void af_window_hamming(int n,FLOAT_TYPE* w)
7568
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
88 {
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
89 int i;
26350
07abe94a9cc4 Fix illegal identifier: Rename _ftype_t macro to FLOAT_TYPE.
diego
parents: 14274
diff changeset
90 FLOAT_TYPE k = 2*M_PI/((FLOAT_TYPE)(n-1)); // 2*pi/(N-1)
7568
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
91
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
92 // Calculate window coefficients
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
93 for (i=0; i<n; i++)
26350
07abe94a9cc4 Fix illegal identifier: Rename _ftype_t macro to FLOAT_TYPE.
diego
parents: 14274
diff changeset
94 *w++ = 0.54 - 0.46*cos(k*(FLOAT_TYPE)i);
7568
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
95 }
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
96
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
97 /*
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
98 // Blackman
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
99 // 2*pi*k 4*pi*k
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
100 // w(k) = 0.42 - 0.5*cos(------) + 0.08*cos(------), where 0 <= k < N
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
101 // N-1 N-1
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
102 //
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
103 // n window length
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
104 // w buffer for the window parameters
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
105 */
26350
07abe94a9cc4 Fix illegal identifier: Rename _ftype_t macro to FLOAT_TYPE.
diego
parents: 14274
diff changeset
106 void af_window_blackman(int n,FLOAT_TYPE* w)
7568
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
107 {
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
108 int i;
26350
07abe94a9cc4 Fix illegal identifier: Rename _ftype_t macro to FLOAT_TYPE.
diego
parents: 14274
diff changeset
109 FLOAT_TYPE k1 = 2*M_PI/((FLOAT_TYPE)(n-1)); // 2*pi/(N-1)
07abe94a9cc4 Fix illegal identifier: Rename _ftype_t macro to FLOAT_TYPE.
diego
parents: 14274
diff changeset
110 FLOAT_TYPE k2 = 2*k1; // 4*pi/(N-1)
7568
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
111
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
112 // Calculate window coefficients
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
113 for (i=0; i<n; i++)
26350
07abe94a9cc4 Fix illegal identifier: Rename _ftype_t macro to FLOAT_TYPE.
diego
parents: 14274
diff changeset
114 *w++ = 0.42 - 0.50*cos(k1*(FLOAT_TYPE)i) + 0.08*cos(k2*(FLOAT_TYPE)i);
7568
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
115 }
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
116
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
117 /*
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
118 // Flattop
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
119 // 2*pi*k 4*pi*k
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
120 // w(k) = 0.2810638602 - 0.5208971735*cos(------) + 0.1980389663*cos(------), where 0 <= k < N
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
121 // N-1 N-1
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
122 //
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
123 // n window length
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
124 // w buffer for the window parameters
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
125 */
26350
07abe94a9cc4 Fix illegal identifier: Rename _ftype_t macro to FLOAT_TYPE.
diego
parents: 14274
diff changeset
126 void af_window_flattop(int n,FLOAT_TYPE* w)
7568
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
127 {
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
128 int i;
26350
07abe94a9cc4 Fix illegal identifier: Rename _ftype_t macro to FLOAT_TYPE.
diego
parents: 14274
diff changeset
129 FLOAT_TYPE k1 = 2*M_PI/((FLOAT_TYPE)(n-1)); // 2*pi/(N-1)
07abe94a9cc4 Fix illegal identifier: Rename _ftype_t macro to FLOAT_TYPE.
diego
parents: 14274
diff changeset
130 FLOAT_TYPE k2 = 2*k1; // 4*pi/(N-1)
7568
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
131
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
132 // Calculate window coefficients
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
133 for (i=0; i<n; i++)
26350
07abe94a9cc4 Fix illegal identifier: Rename _ftype_t macro to FLOAT_TYPE.
diego
parents: 14274
diff changeset
134 *w++ = 0.2810638602 - 0.5208971735*cos(k1*(FLOAT_TYPE)i)
07abe94a9cc4 Fix illegal identifier: Rename _ftype_t macro to FLOAT_TYPE.
diego
parents: 14274
diff changeset
135 + 0.1980389663*cos(k2*(FLOAT_TYPE)i);
7568
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
136 }
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
137
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
138 /* Computes the 0th order modified Bessel function of the first kind.
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
139 // (Needed to compute Kaiser window)
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
140 //
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
141 // y = sum( (x/(2*n))^2 )
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
142 // n
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
143 */
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
144 #define BIZ_EPSILON 1E-21 // Max error acceptable
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
145
26350
07abe94a9cc4 Fix illegal identifier: Rename _ftype_t macro to FLOAT_TYPE.
diego
parents: 14274
diff changeset
146 static FLOAT_TYPE besselizero(FLOAT_TYPE x)
7568
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
147 {
26350
07abe94a9cc4 Fix illegal identifier: Rename _ftype_t macro to FLOAT_TYPE.
diego
parents: 14274
diff changeset
148 FLOAT_TYPE temp;
07abe94a9cc4 Fix illegal identifier: Rename _ftype_t macro to FLOAT_TYPE.
diego
parents: 14274
diff changeset
149 FLOAT_TYPE sum = 1.0;
07abe94a9cc4 Fix illegal identifier: Rename _ftype_t macro to FLOAT_TYPE.
diego
parents: 14274
diff changeset
150 FLOAT_TYPE u = 1.0;
07abe94a9cc4 Fix illegal identifier: Rename _ftype_t macro to FLOAT_TYPE.
diego
parents: 14274
diff changeset
151 FLOAT_TYPE halfx = x/2.0;
7568
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
152 int n = 1;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
153
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
154 do {
26350
07abe94a9cc4 Fix illegal identifier: Rename _ftype_t macro to FLOAT_TYPE.
diego
parents: 14274
diff changeset
155 temp = halfx/(FLOAT_TYPE)n;
7568
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
156 u *=temp * temp;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
157 sum += u;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
158 n++;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
159 } while (u >= BIZ_EPSILON * sum);
26759
8eff880f638c cosmetics: Remove useless parentheses from return statements.
diego
parents: 26350
diff changeset
160 return sum;
7568
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
161 }
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
162
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
163 /*
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
164 // Kaiser
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
165 //
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
166 // n window length
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
167 // w buffer for the window parameters
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
168 // b beta parameter of Kaiser window, Beta >= 1
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
169 //
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
170 // Beta trades the rejection of the low pass filter against the
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
171 // transition width from passband to stop band. Larger Beta means a
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
172 // slower transition and greater stop band rejection. See Rabiner and
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
173 // Gold (Theory and Application of DSP) under Kaiser windows for more
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
174 // about Beta. The following table from Rabiner and Gold gives some
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
175 // feel for the effect of Beta:
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
176 //
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
177 // All ripples in dB, width of transition band = D*N where N = window
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
178 // length
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
179 //
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
180 // BETA D PB RIP SB RIP
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
181 // 2.120 1.50 +-0.27 -30
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
182 // 3.384 2.23 0.0864 -40
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
183 // 4.538 2.93 0.0274 -50
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
184 // 5.658 3.62 0.00868 -60
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
185 // 6.764 4.32 0.00275 -70
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
186 // 7.865 5.0 0.000868 -80
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
187 // 8.960 5.7 0.000275 -90
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
188 // 10.056 6.4 0.000087 -100
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
189 */
26350
07abe94a9cc4 Fix illegal identifier: Rename _ftype_t macro to FLOAT_TYPE.
diego
parents: 14274
diff changeset
190 void af_window_kaiser(int n, FLOAT_TYPE* w, FLOAT_TYPE b)
7568
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
191 {
26350
07abe94a9cc4 Fix illegal identifier: Rename _ftype_t macro to FLOAT_TYPE.
diego
parents: 14274
diff changeset
192 FLOAT_TYPE tmp;
07abe94a9cc4 Fix illegal identifier: Rename _ftype_t macro to FLOAT_TYPE.
diego
parents: 14274
diff changeset
193 FLOAT_TYPE k1 = 1.0/besselizero(b);
7568
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
194 int k2 = 1 - (n & 1);
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
195 int end = (n + 1) >> 1;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
196 int i;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
197
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
198 // Calculate window coefficients
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
199 for (i=0 ; i<end ; i++){
26350
07abe94a9cc4 Fix illegal identifier: Rename _ftype_t macro to FLOAT_TYPE.
diego
parents: 14274
diff changeset
200 tmp = (FLOAT_TYPE)(2*i + k2) / ((FLOAT_TYPE)n - 1.0);
7568
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
201 w[end-(1&(!k2))+i] = w[end-1-i] = k1 * besselizero(b*sqrt(1.0 - tmp*tmp));
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
202 }
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
203 }
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
204