1 /*
2  * Copyright (C) 2001 Anders Johansson ajh@atri.curtin.edu.au
3  *
4  * This file is part of MPlayer.
5  *
6  * MPlayer is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * MPlayer is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License along
17  * with MPlayer; if not, write to the Free Software Foundation, Inc.,
18  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19  */
20 
21 #ifndef MPLAYER_FILTER_H
22 #define MPLAYER_FILTER_H
23 
24 #include "dsp.h"
25 
26 
27 // Design and implementation of different types of digital filters
28 
29 
30 // Flags used for filter design
31 
32 // Filter characteristics
33 #define LP          0x00010000 // Low pass
34 #define HP          0x00020000 // High pass
35 #define BP          0x00040000 // Band pass
36 #define BS          0x00080000 // Band stop
37 #define TYPE_MASK   0x000F0000
38 
39 // Window types
40 #define BOXCAR      0x00000001
41 #define TRIANG      0x00000002
42 #define HAMMING     0x00000004
43 #define HANNING     0x00000008
44 #define BLACKMAN    0x00000010
45 #define FLATTOP     0x00000011
46 #define KAISER      0x00000012
47 #define WINDOW_MASK 0x0000001F
48 
49 // Parallel filter design
50 #define	FWD   	    0x00000001 // Forward indexing of polyphase filter
51 #define REW         0x00000002 // Reverse indexing of polyphase filter
52 #define ODD         0x00000010 // Make filter HP
53 
54 // Exported functions
55 FLOAT_TYPE af_filter_fir(unsigned int n, const FLOAT_TYPE* w, const FLOAT_TYPE* x);
56 
57 FLOAT_TYPE* af_filter_pfir(unsigned int n, unsigned int k,
58                            unsigned int xi, const FLOAT_TYPE** w,
59                            const FLOAT_TYPE** x, FLOAT_TYPE* y,
60                            unsigned int s);
61 
62 //int af_filter_updateq(unsigned int n, unsigned int xi,
63 //                      FLOAT_TYPE* xq, FLOAT_TYPE* in);
64 int af_filter_updatepq(unsigned int n, unsigned int k, unsigned int xi,
65                        FLOAT_TYPE** xq, const FLOAT_TYPE* in, unsigned int s);
66 
67 int af_filter_design_fir(unsigned int n, FLOAT_TYPE* w, const FLOAT_TYPE* fc,
68                          unsigned int flags, FLOAT_TYPE opt);
69 
70 int af_filter_design_pfir(unsigned int n, unsigned int k, const FLOAT_TYPE* w,
71                           FLOAT_TYPE** pw, FLOAT_TYPE g, unsigned int flags);
72 
73 int af_filter_szxform(const FLOAT_TYPE* a, const FLOAT_TYPE* b, FLOAT_TYPE Q,
74                       FLOAT_TYPE fc, FLOAT_TYPE fs, FLOAT_TYPE *k,
75                       FLOAT_TYPE *coef);
76 
77 /* Add new data to circular queue designed to be used with a FIR
78    filter. xq is the circular queue, in pointing at the new sample, xi
79    current index for xq and n the length of the filter. xq must be n*2
80    long.
81 */
82 #define af_filter_updateq(n,xi,xq,in)\
83   xq[xi]=(xq)[(xi)+(n)]=*(in);\
84   xi=(++(xi))&((n)-1);
85 
86 #endif /* MPLAYER_FILTER_H */
87