Mercurial > mplayer.hg
annotate libaf/window.c @ 37195:ac6c37d85d65 default tip
configure: Fix initialization of variable def_local_aligned_32
It contiained the #define of HAVE_LOCAL_ALIGNED_16 instead
of HAVE_LOCAL_ALIGNED_32.
| author | al |
|---|---|
| date | Sun, 28 Sep 2014 18:38:41 +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 } |
