Added a post-filter for narrowband (and thus 0-4 kHz in wideband)
[speexdsp.git] / libspeex / post_filter.c
1 /* Copyright (C) 2002 Jean-Marc Valin 
2    File: post_filter.c
3    Post-filtering routines: processing to enhance perceptual quality
4
5    This library is free software; you can redistribute it and/or
6    modify it under the terms of the GNU Lesser General Public
7    License as published by the Free Software Foundation; either
8    version 2.1 of the License, or (at your option) any later version.
9    
10    This library is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13    Lesser General Public License for more details.
14    
15    You should have received a copy of the GNU Lesser General Public
16    License along with this library; if not, write to the Free Software
17    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18 */
19
20 #include <math.h>
21 #include "filters.h"
22 #include "stack_alloc.h"
23
24 /* Perceptual post-filter for narrowband */
25 void nb_post_filter(
26 float *exc, 
27 float *new_exc, 
28 float *ak, 
29 int p, 
30 int nsf,
31 int pitch,
32 float pitch_gain,
33 float *stack)
34 {
35    int i;
36    float exc_energy=0, new_exc_energy=0;
37    float *awk;
38    float gain;
39
40    awk = PUSH(stack, p);
41    
42    bw_lpc (0.1, ak, awk, p);
43
44    for (i=0;i<nsf;i++)
45       exc_energy+=exc[i]*exc[i];
46
47    for (i=0;i<nsf;i++)
48    {
49       new_exc[i] = exc[i] + .4*pitch_gain*exc[i-pitch];
50    }
51    
52    syn_filt(new_exc, awk, new_exc, nsf, p);
53
54    for (i=0;i<nsf;i++)
55       new_exc_energy+=new_exc[i]*new_exc[i];
56
57    gain = sqrt(exc_energy)/sqrt(.1+new_exc_energy);
58    for (i=0;i<nsf;i++)
59       new_exc[i] *= gain;
60
61    POP(stack);
62 }