Mercurial > mplayer.hg
annotate libaf/window.c @ 35418:cedb0ba2b5c6
Move the code to set guiInfo's Track, Chapter and Angle start values.
Set them before checking whether there is any media opened, because
with no media opened we clear the counters.
author | ib |
---|---|
date | Thu, 29 Nov 2012 14:11:03 +0000 |
parents | 32725ca88fed |
children |
rev | line source |
---|---|
28229
72d0b1444141
Replace informal license notices by standard license header
diego
parents:
26759
diff
changeset
|
1 /* |
72d0b1444141
Replace informal license notices by standard license header
diego
parents:
26759
diff
changeset
|
2 * Copyright (C) 2001 Anders Johansson ajh@atri.curtin.edu.au |
72d0b1444141
Replace informal license notices by standard license header
diego
parents:
26759
diff
changeset
|
3 * |
72d0b1444141
Replace informal license notices by standard license header
diego
parents:
26759
diff
changeset
|
4 * This file is part of MPlayer. |
72d0b1444141
Replace informal license notices by standard license header
diego
parents:
26759
diff
changeset
|
5 * |
72d0b1444141
Replace informal license notices by standard license header
diego
parents:
26759
diff
changeset
|
6 * MPlayer is free software; you can redistribute it and/or modify |
72d0b1444141
Replace informal license notices by standard license header
diego
parents:
26759
diff
changeset
|
7 * it under the terms of the GNU General Public License as published by |
72d0b1444141
Replace informal license notices by standard license header
diego
parents:
26759
diff
changeset
|
8 * the Free Software Foundation; either version 2 of the License, or |
72d0b1444141
Replace informal license notices by standard license header
diego
parents:
26759
diff
changeset
|
9 * (at your option) any later version. |
72d0b1444141
Replace informal license notices by standard license header
diego
parents:
26759
diff
changeset
|
10 * |
72d0b1444141
Replace informal license notices by standard license header
diego
parents:
26759
diff
changeset
|
11 * MPlayer is distributed in the hope that it will be useful, |
72d0b1444141
Replace informal license notices by standard license header
diego
parents:
26759
diff
changeset
|
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
72d0b1444141
Replace informal license notices by standard license header
diego
parents:
26759
diff
changeset
|
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
72d0b1444141
Replace informal license notices by standard license header
diego
parents:
26759
diff
changeset
|
14 * GNU General Public License for more details. |
72d0b1444141
Replace informal license notices by standard license header
diego
parents:
26759
diff
changeset
|
15 * |
72d0b1444141
Replace informal license notices by standard license header
diego
parents:
26759
diff
changeset
|
16 * You should have received a copy of the GNU General Public License along |
72d0b1444141
Replace informal license notices by standard license header
diego
parents:
26759
diff
changeset
|
17 * with MPlayer; if not, write to the Free Software Foundation, Inc., |
72d0b1444141
Replace informal license notices by standard license header
diego
parents:
26759
diff
changeset
|
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
72d0b1444141
Replace informal license notices by standard license header
diego
parents:
26759
diff
changeset
|
19 */ |
7568 | 20 |
21 /* Calculates a number of window functions. The following window | |
22 functions are currently implemented: Boxcar, Triang, Hanning, | |
23 Hamming, Blackman, Flattop and Kaiser. In the function call n is | |
24 the number of filter taps and w the buffer in which the filter | |
25 coefficients will be stored. | |
26 */ | |
27 | |
28 #include <math.h> | |
29 #include "dsp.h" | |
30 | |
31 /* | |
32 // Boxcar | |
33 // | |
34 // n window length | |
35 // w buffer for the window parameters | |
36 */ | |
26350
07abe94a9cc4
Fix illegal identifier: Rename _ftype_t macro to FLOAT_TYPE.
diego
parents:
14274
diff
changeset
|
37 void af_window_boxcar(int n, FLOAT_TYPE* w) |
7568 | 38 { |
39 int i; | |
40 // Calculate window coefficients | |
41 for (i=0 ; i<n ; i++) | |
42 w[i] = 1.0; | |
43 } | |
44 | |
45 | |
46 /* | |
47 // Triang a.k.a Bartlett | |
48 // | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28229
diff
changeset
|
49 // | (N-1)| |
7568 | 50 // 2 * |k - -----| |
51 // | 2 | | |
52 // w = 1.0 - --------------- | |
53 // N+1 | |
54 // n window length | |
55 // w buffer for the window parameters | |
56 */ | |
26350
07abe94a9cc4
Fix illegal identifier: Rename _ftype_t macro to FLOAT_TYPE.
diego
parents:
14274
diff
changeset
|
57 void af_window_triang(int n, FLOAT_TYPE* w) |
7568 | 58 { |
26350
07abe94a9cc4
Fix illegal identifier: Rename _ftype_t macro to FLOAT_TYPE.
diego
parents:
14274
diff
changeset
|
59 FLOAT_TYPE k1 = (FLOAT_TYPE)(n & 1); |
07abe94a9cc4
Fix illegal identifier: Rename _ftype_t macro to FLOAT_TYPE.
diego
parents:
14274
diff
changeset
|
60 FLOAT_TYPE k2 = 1/((FLOAT_TYPE)n + k1); |
7568 | 61 int end = (n + 1) >> 1; |
62 int i; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28229
diff
changeset
|
63 |
7568 | 64 // Calculate window coefficients |
65 for (i=0 ; i<end ; i++) | |
26350
07abe94a9cc4
Fix illegal identifier: Rename _ftype_t macro to FLOAT_TYPE.
diego
parents:
14274
diff
changeset
|
66 w[i] = w[n-i-1] = (2.0*((FLOAT_TYPE)(i+1))-(1.0-k1))*k2; |
7568 | 67 } |
68 | |
69 | |
70 /* | |
71 // Hanning | |
72 // 2*pi*k | |
73 // w = 0.5 - 0.5*cos(------), where 0 < k <= N | |
74 // N+1 | |
75 // n window length | |
76 // w buffer for the window parameters | |
77 */ | |
26350
07abe94a9cc4
Fix illegal identifier: Rename _ftype_t macro to FLOAT_TYPE.
diego
parents:
14274
diff
changeset
|
78 void af_window_hanning(int n, FLOAT_TYPE* w) |
7568 | 79 { |
80 int i; | |
26350
07abe94a9cc4
Fix illegal identifier: Rename _ftype_t macro to FLOAT_TYPE.
diego
parents:
14274
diff
changeset
|
81 FLOAT_TYPE k = 2*M_PI/((FLOAT_TYPE)(n+1)); // 2*pi/(N+1) |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28229
diff
changeset
|
82 |
7568 | 83 // Calculate window coefficients |
84 for (i=0; i<n; i++) | |
26350
07abe94a9cc4
Fix illegal identifier: Rename _ftype_t macro to FLOAT_TYPE.
diego
parents:
14274
diff
changeset
|
85 *w++ = 0.5*(1.0 - cos(k*(FLOAT_TYPE)(i+1))); |
7568 | 86 } |
87 | |
88 /* | |
89 // Hamming | |
90 // 2*pi*k | |
91 // w(k) = 0.54 - 0.46*cos(------), where 0 <= k < N | |
92 // N-1 | |
93 // | |
94 // n window length | |
95 // w buffer for the window parameters | |
96 */ | |
26350
07abe94a9cc4
Fix illegal identifier: Rename _ftype_t macro to FLOAT_TYPE.
diego
parents:
14274
diff
changeset
|
97 void af_window_hamming(int n,FLOAT_TYPE* w) |
7568 | 98 { |
99 int i; | |
26350
07abe94a9cc4
Fix illegal identifier: Rename _ftype_t macro to FLOAT_TYPE.
diego
parents:
14274
diff
changeset
|
100 FLOAT_TYPE k = 2*M_PI/((FLOAT_TYPE)(n-1)); // 2*pi/(N-1) |
7568 | 101 |
102 // Calculate window coefficients | |
103 for (i=0; i<n; i++) | |
26350
07abe94a9cc4
Fix illegal identifier: Rename _ftype_t macro to FLOAT_TYPE.
diego
parents:
14274
diff
changeset
|
104 *w++ = 0.54 - 0.46*cos(k*(FLOAT_TYPE)i); |
7568 | 105 } |
106 | |
107 /* | |
108 // Blackman | |
109 // 2*pi*k 4*pi*k | |
110 // w(k) = 0.42 - 0.5*cos(------) + 0.08*cos(------), where 0 <= k < N | |
111 // N-1 N-1 | |
112 // | |
113 // n window length | |
114 // w buffer for the window parameters | |
115 */ | |
26350
07abe94a9cc4
Fix illegal identifier: Rename _ftype_t macro to FLOAT_TYPE.
diego
parents:
14274
diff
changeset
|
116 void af_window_blackman(int n,FLOAT_TYPE* w) |
7568 | 117 { |
118 int i; | |
26350
07abe94a9cc4
Fix illegal identifier: Rename _ftype_t macro to FLOAT_TYPE.
diego
parents:
14274
diff
changeset
|
119 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
|
120 FLOAT_TYPE k2 = 2*k1; // 4*pi/(N-1) |
7568 | 121 |
122 // Calculate window coefficients | |
123 for (i=0; i<n; i++) | |
26350
07abe94a9cc4
Fix illegal identifier: Rename _ftype_t macro to FLOAT_TYPE.
diego
parents:
14274
diff
changeset
|
124 *w++ = 0.42 - 0.50*cos(k1*(FLOAT_TYPE)i) + 0.08*cos(k2*(FLOAT_TYPE)i); |
7568 | 125 } |
126 | |
127 /* | |
128 // Flattop | |
129 // 2*pi*k 4*pi*k | |
130 // w(k) = 0.2810638602 - 0.5208971735*cos(------) + 0.1980389663*cos(------), where 0 <= k < N | |
131 // N-1 N-1 | |
132 // | |
133 // n window length | |
134 // w buffer for the window parameters | |
135 */ | |
26350
07abe94a9cc4
Fix illegal identifier: Rename _ftype_t macro to FLOAT_TYPE.
diego
parents:
14274
diff
changeset
|
136 void af_window_flattop(int n,FLOAT_TYPE* w) |
7568 | 137 { |
138 int i; | |
26350
07abe94a9cc4
Fix illegal identifier: Rename _ftype_t macro to FLOAT_TYPE.
diego
parents:
14274
diff
changeset
|
139 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
|
140 FLOAT_TYPE k2 = 2*k1; // 4*pi/(N-1) |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28229
diff
changeset
|
141 |
7568 | 142 // Calculate window coefficients |
143 for (i=0; i<n; i++) | |
26350
07abe94a9cc4
Fix illegal identifier: Rename _ftype_t macro to FLOAT_TYPE.
diego
parents:
14274
diff
changeset
|
144 *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
|
145 + 0.1980389663*cos(k2*(FLOAT_TYPE)i); |
7568 | 146 } |
147 | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28229
diff
changeset
|
148 /* Computes the 0th order modified Bessel function of the first kind. |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28229
diff
changeset
|
149 // (Needed to compute Kaiser window) |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28229
diff
changeset
|
150 // |
7568 | 151 // y = sum( (x/(2*n))^2 ) |
152 // n | |
153 */ | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28229
diff
changeset
|
154 #define BIZ_EPSILON 1E-21 // Max error acceptable |
7568 | 155 |
26350
07abe94a9cc4
Fix illegal identifier: Rename _ftype_t macro to FLOAT_TYPE.
diego
parents:
14274
diff
changeset
|
156 static FLOAT_TYPE besselizero(FLOAT_TYPE x) |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28229
diff
changeset
|
157 { |
26350
07abe94a9cc4
Fix illegal identifier: Rename _ftype_t macro to FLOAT_TYPE.
diego
parents:
14274
diff
changeset
|
158 FLOAT_TYPE temp; |
07abe94a9cc4
Fix illegal identifier: Rename _ftype_t macro to FLOAT_TYPE.
diego
parents:
14274
diff
changeset
|
159 FLOAT_TYPE sum = 1.0; |
07abe94a9cc4
Fix illegal identifier: Rename _ftype_t macro to FLOAT_TYPE.
diego
parents:
14274
diff
changeset
|
160 FLOAT_TYPE u = 1.0; |
07abe94a9cc4
Fix illegal identifier: Rename _ftype_t macro to FLOAT_TYPE.
diego
parents:
14274
diff
changeset
|
161 FLOAT_TYPE halfx = x/2.0; |
7568 | 162 int n = 1; |
163 | |
164 do { | |
26350
07abe94a9cc4
Fix illegal identifier: Rename _ftype_t macro to FLOAT_TYPE.
diego
parents:
14274
diff
changeset
|
165 temp = halfx/(FLOAT_TYPE)n; |
7568 | 166 u *=temp * temp; |
167 sum += u; | |
168 n++; | |
169 } while (u >= BIZ_EPSILON * sum); | |
26759
8eff880f638c
cosmetics: Remove useless parentheses from return statements.
diego
parents:
26350
diff
changeset
|
170 return sum; |
7568 | 171 } |
172 | |
173 /* | |
174 // Kaiser | |
175 // | |
176 // n window length | |
177 // w buffer for the window parameters | |
178 // b beta parameter of Kaiser window, Beta >= 1 | |
179 // | |
180 // Beta trades the rejection of the low pass filter against the | |
181 // transition width from passband to stop band. Larger Beta means a | |
182 // slower transition and greater stop band rejection. See Rabiner and | |
183 // Gold (Theory and Application of DSP) under Kaiser windows for more | |
184 // about Beta. The following table from Rabiner and Gold gives some | |
185 // feel for the effect of Beta: | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28229
diff
changeset
|
186 // |
7568 | 187 // All ripples in dB, width of transition band = D*N where N = window |
188 // length | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28229
diff
changeset
|
189 // |
7568 | 190 // BETA D PB RIP SB RIP |
191 // 2.120 1.50 +-0.27 -30 | |
192 // 3.384 2.23 0.0864 -40 | |
193 // 4.538 2.93 0.0274 -50 | |
194 // 5.658 3.62 0.00868 -60 | |
195 // 6.764 4.32 0.00275 -70 | |
196 // 7.865 5.0 0.000868 -80 | |
197 // 8.960 5.7 0.000275 -90 | |
198 // 10.056 6.4 0.000087 -100 | |
199 */ | |
26350
07abe94a9cc4
Fix illegal identifier: Rename _ftype_t macro to FLOAT_TYPE.
diego
parents:
14274
diff
changeset
|
200 void af_window_kaiser(int n, FLOAT_TYPE* w, FLOAT_TYPE b) |
7568 | 201 { |
26350
07abe94a9cc4
Fix illegal identifier: Rename _ftype_t macro to FLOAT_TYPE.
diego
parents:
14274
diff
changeset
|
202 FLOAT_TYPE tmp; |
07abe94a9cc4
Fix illegal identifier: Rename _ftype_t macro to FLOAT_TYPE.
diego
parents:
14274
diff
changeset
|
203 FLOAT_TYPE k1 = 1.0/besselizero(b); |
7568 | 204 int k2 = 1 - (n & 1); |
205 int end = (n + 1) >> 1; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28229
diff
changeset
|
206 int i; |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28229
diff
changeset
|
207 |
7568 | 208 // Calculate window coefficients |
209 for (i=0 ; i<end ; i++){ | |
26350
07abe94a9cc4
Fix illegal identifier: Rename _ftype_t macro to FLOAT_TYPE.
diego
parents:
14274
diff
changeset
|
210 tmp = (FLOAT_TYPE)(2*i + k2) / ((FLOAT_TYPE)n - 1.0); |
7568 | 211 w[end-(1&(!k2))+i] = w[end-1-i] = k1 * besselizero(b*sqrt(1.0 - tmp*tmp)); |
212 } | |
213 } |