/[svn]/linuxsampler/trunk/src/engines/gig/Filter.h
ViewVC logotype

Annotation of /linuxsampler/trunk/src/engines/gig/Filter.h

Parent Directory Parent Directory | Revision Log Revision Log


Revision 368 - (hide annotations) (download) (as text)
Fri Feb 11 13:13:54 2005 UTC (19 years, 2 months ago) by schoenebeck
File MIME type: text/x-c++hdr
File size: 7667 byte(s)
* some fixes regarding the filter (fixes the "silence" bug which occured
  occasionally, caused by random biquad parameters which lead to unstable
  filter equation and thus to infinit filter output results)

1 schoenebeck 53 /***************************************************************************
2     * *
3     * LinuxSampler - modular, streaming capable sampler *
4     * *
5 schoenebeck 56 * Copyright (C) 2003, 2004 by Benno Senoner and Christian Schoenebeck *
6 schoenebeck 53 * *
7     * This program is free software; you can redistribute it and/or modify *
8     * it under the terms of the GNU General Public License as published by *
9     * the Free Software Foundation; either version 2 of the License, or *
10     * (at your option) any later version. *
11     * *
12     * This program is distributed in the hope that it will be useful, *
13     * but WITHOUT ANY WARRANTY; without even the implied warranty of *
14     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
15     * GNU General Public License for more details. *
16     * *
17     * You should have received a copy of the GNU General Public License *
18     * along with this program; if not, write to the Free Software *
19     * Foundation, Inc., 59 Temple Place, Suite 330, Boston, *
20     * MA 02111-1307 USA *
21     ***************************************************************************/
22    
23     #ifndef __LS_GIG_FILTER_H__
24     #define __LS_GIG_FILTER_H__
25    
26     #include "../../common/global.h"
27    
28     #if DEBUG_HEADERS
29     # warning Filter.h included
30     #endif // DEBUG_HEADERS
31    
32     #include "../common/BiquadFilter.h"
33    
34     // TODO: Gigasampler's "Turbo Lowpass" and "Bandreject" filters not implemented yet
35    
36     #include "../../lib/fileloader/libgig/gig.h"
37    
38     #define LSF_BW 0.9
39     #define LSF_FB 0.9f
40    
41     namespace LinuxSampler { namespace gig {
42    
43     /**
44 schoenebeck 80 * These are filters similar to the ones from Gigasampler.
45 schoenebeck 53 */
46     class Filter {
47     protected:
48     BandpassFilter BasicBPFilter;
49     HighpassFilter HPFilter;
50     BandpassFilter BPFilter;
51     LowpassFilter LPFilter;
52     BiquadFilter* pFilter;
53     bq_t scale;
54     bq_t resonance;
55     bq_t cutoff;
56     ::gig::vcf_type_t Type;
57 schoenebeck 319 static const float fFB = LSF_FB;
58 schoenebeck 53 public:
59    
60 schoenebeck 319 Filter() {
61 schoenebeck 53 // set filter type to 'lowpass' by default
62     pFilter = &LPFilter;
63     Type = ::gig::vcf_type_lowpass;
64     }
65    
66     inline bq_t Cutoff() { return cutoff; }
67    
68     inline bq_t Resonance() { return resonance; }
69    
70     inline void SetType(::gig::vcf_type_t FilterType) {
71     switch (FilterType) {
72     case ::gig::vcf_type_highpass:
73     pFilter = &HPFilter;
74     break;
75     case ::gig::vcf_type_bandreject: //TODO: not implemented yet
76 schoenebeck 368 FilterType = ::gig::vcf_type_bandpass;
77 schoenebeck 53 case ::gig::vcf_type_bandpass:
78     pFilter = &BPFilter;
79     break;
80     case ::gig::vcf_type_lowpassturbo: //TODO: not implemented yet
81     default:
82 schoenebeck 368 FilterType = ::gig::vcf_type_lowpass;
83 schoenebeck 53 case ::gig::vcf_type_lowpass:
84     pFilter = &LPFilter;
85    
86     }
87     Type = FilterType;
88     }
89    
90     inline void SetParameters(bq_t cutoff, bq_t resonance, bq_t fs) {
91     BasicBPFilter.SetParameters(cutoff, 0.7, fs);
92     switch (Type) {
93     case ::gig::vcf_type_highpass:
94     HPFilter.SetParameters(cutoff, 1.0 - resonance * LSF_BW, fs);
95     break;
96     case ::gig::vcf_type_bandpass:
97     BPFilter.SetParameters(cutoff, 1.0 - resonance * LSF_BW, fs);
98     break;
99     case ::gig::vcf_type_lowpass:
100     LPFilter.SetParameters(cutoff, 1.0 - resonance * LSF_BW, fs);
101     break;
102     }
103     this->scale = 1.0f - resonance * 0.7f;
104     this->resonance = resonance;
105     this->cutoff = cutoff;
106     }
107    
108 schoenebeck 80 inline void SetParameters(biquad_param_t* base, biquad_param_t* main, bq_t cutoff, bq_t resonance, bq_t fs) {
109     BasicBPFilter.SetParameters(base, cutoff, 0.7, fs);
110     switch (Type) {
111     case ::gig::vcf_type_highpass:
112     HPFilter.SetParameters(main, cutoff, 1.0 - resonance * LSF_BW, fs);
113     break;
114     case ::gig::vcf_type_bandpass:
115     BPFilter.SetParameters(main, cutoff, 1.0 - resonance * LSF_BW, fs);
116     break;
117     case ::gig::vcf_type_lowpass:
118     LPFilter.SetParameters(main, cutoff, 1.0 - resonance * LSF_BW, fs);
119     break;
120     }
121     this->scale = 1.0f - resonance * 0.7f;
122     this->resonance = resonance;
123     this->cutoff = cutoff;
124     }
125    
126 schoenebeck 319 void Reset() {
127     BasicBPFilter.Reset();
128     HPFilter.Reset();
129     BPFilter.Reset();
130     LPFilter.Reset();
131     }
132    
133 schoenebeck 53 inline bq_t Apply(const bq_t in) {
134 schoenebeck 319 return pFilter->Apply(in) * this->scale +
135     BasicBPFilter.ApplyFB(in, this->resonance * LSF_FB) * this->resonance;
136 schoenebeck 53 }
137 schoenebeck 80
138     inline bq_t Apply(biquad_param_t* base, biquad_param_t* main, const bq_t in) {
139 schoenebeck 319 return pFilter->Apply(main, in) * this->scale +
140     BasicBPFilter.ApplyFB(base, in, this->resonance * LSF_FB) * this->resonance;
141 schoenebeck 80 }
142 schoenebeck 319
143 schoenebeck 328 #if ARCH_X86
144 schoenebeck 319 // expects to find input in xmm0 and leaves output in xmm7
145     inline void Apply4StepsSSE(biquad_param_t* base, biquad_param_t* main) {
146     float fb;
147     __asm__ __volatile__ (
148     "movss %0, %%xmm4\n\t"
149     "mulss %1, %%xmm4 # this->resonance * LSF_FB\n\t"
150     "movss %%xmm4, %2\n\t"
151     :: "m" (fFB), /* %0 */
152     "m" (resonance), /* %1 */
153     "m" (fb) /* %2 */
154     );
155     BasicBPFilter.ApplyFB4StepsSSE(base, fb); // leaves output in xmm7
156     __asm__ __volatile__ (
157     "movss %0, %%xmm4\n\t"
158     "shufps $0, %%xmm4, %%xmm4 # copy to other 3 cells\n\t"
159     "mulps %%xmm4, %%xmm7 # ApplyFB() * this->resonance\n\t"
160     :: "m" (resonance) /* %0 */
161     );
162     pFilter->Apply4StepsSSE(main); // leaves output in xmm6
163     __asm__ __volatile__ (
164     "movss %0, %%xmm5\n\t"
165     "shufps $0, %%xmm5, %%xmm5 # copy to other 3 cells\n\t"
166     "mulps %%xmm5, %%xmm6 # Apply() * this->scale\n\t"
167     "addps %%xmm6, %%xmm7 # xmm7 = result\n\t"
168     :: "m" (scale) /* %0 */
169     );
170     }
171 schoenebeck 328 #endif // ARCH_X86
172    
173 schoenebeck 53 };
174    
175     }} //namespace LinuxSampler::gig
176    
177     #endif // __LS_GIG_FILTER_H__

  ViewVC Help
Powered by ViewVC