OSDN Git Service

[filter] Vectorize LPF_BW
[timidity41/timidity41.git] / timidity / filter.c
1 /*
2     TiMidity++ -- MIDI to WAVE converter and player
3     Copyright (C) 1999-2002 Masanao Izumo <mo@goice.co.jp>
4     Copyright (C) 1995 Tuukka Toivonen <tt@cgs.fi>
5
6     This program 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     This program 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
17     along with this program; if not, write to the Free Software
18     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19
20    filter.c: written by Vincent Pagel ( pagel@loria.fr )
21
22    implements fir antialiasing filter : should help when setting sample
23    rates as low as 8Khz.
24
25    April 95
26       - first draft
27
28    22/5/95
29       - modify "filter" so that it simulate leading and trailing 0 in the buffer
30    */
31
32 #ifdef HAVE_CONFIG_H
33 #include "config.h"
34 #endif /* HAVE_CONFIG_H */
35 #include <stdio.h>
36 #ifndef NO_STRING_H
37 #include <string.h>
38 #else
39 #include <strings.h>
40 #endif
41 #include <math.h>
42 #include <stdlib.h>
43 #include "timidity.h"
44 #include "common.h"
45 #include "instrum.h"
46 #include "playmidi.h"
47 #include "output.h"
48 #include "controls.h"
49 #include "tables.h"
50 #include "mix.h"
51 #include "filter.h"
52
53
54 double ext_filter_shelving_gain = 1.0;
55 double ext_filter_shelving_reduce = 1.0;
56 double ext_filter_shelving_q = 1.0;
57 double ext_filter_peaking_gain = 1.0;
58 double ext_filter_peaking_reduce = 1.0;
59 double ext_filter_peaking_q = 1.0;
60 const double ext_filter_margin = 0.010; // 1cB,+-20cent\82æ\82è\8f¬\82³\82¢ \95\89\89×\8c¸\8f­\8f¬
61 //const double ext_filter_margin = 0.05; // 5cB,+-100cent\82æ\82è\8f¬\82³\82¢ \95\89\89×\8c¸\8f­\91å
62
63
64 ///r
65 /*        sample_filter       */
66 /*
67 voice_filter1(LPF), voice_filter2(HPF), resample_filter
68 \83t\83B\83\8b\83^\95\94\95ª\8b¤\92Ê
69 \83t\83B\83\8b\83^\8e©\91Ì\82Í freq[Hz], reso_dB[dB] ,(EQ\82Ì\8fê\8d\87 q[0.0~1.0]
70
71 voice_filter(LPF) \82Ì\8fê\8d\87
72         playmidi.c init_voice_filter(int i)
73
74 input freq 20 < freq < 20000 , input 0 < reso < 96
75
76 0<n<\81\87, 0<n<1, 1>n>0 (\8ae\83t\83B\83\8b\83^\91¤\83\8c\83]\83i\83\93\83X\95\94\95ª\92l\88æ\82ª\82±\82ñ\82È\8a´\82\82Å\83o\83\89\83o\83\89
77 n=f(rez) (\8ae\83t\83B\83\8b\83^\82Ìf()\82ª\89½\82È\82Ì\82©
78 q, 1/q, 1-1/q \82±\82¤\82·\82é\82Æ\8b¤\92Ê\82µ\82½\92l\88æ 1<q<\81\87 \82É\82È\82é
79 0<rez \82È\82Ì\82Å q=X^rez \82Å q\82Ì\92l\88æ\82É\95Ï\8a·
80 \82±\82ê\82É\90§\8cÀ\82â\82ç\8cW\90\94\82ª\82Â\82­
81
82 \8f\88\97\9d\8f\87\8f\98
83 1: type\82ð\8ew\92è set_type() (\8f\89\89ñ\82Ü\82½\82Ítype\95Ï\89»\82Ì\8fê\8d\87 FilterCoefficients 0\83N\83\8a\83A
84 2: \93Á\8eê\82È\83T\83\93\83v\83\8b\83\8c\81[\83g\82Ì\8fê\8d\87\82Í set_ext_rate()
85 3: orig_freq,orig_reso\82ð\8eg\97p\82·\82é\8fê\8d\87\82Í set_orig_freq() set_orig_reso() 
86 4: freq,reso\82ð\8ew\92è set_freq() set_reso() (EQ\82Ì\8fê\8d\87 set_q()
87 5: sample_filter\82Ì\8fê\8d\87\82Í \8cW\90\94\8cv\8eZ recalc_filter()
88 6: \83t\83B\83\8b\83^\8f\88\97\9d filter() (buffer_filter\82Í\8f\88\97\9d\91O\82É\8cW\90\94\8cv\8eZ\82³\82ê\82é
89
90 1:~5:\82ð\82Ü\82Æ\82ß\82½ init_sample_filter()\82Å\82à\82¢\82¢ (EQ\82Ì\8fê\8d\87 init_sample_filter2()
91
92 */
93
94 /*
95 filter spec
96 num     filter_define           type    cutoff_limit (oversampling)     desc                                    
97 00      FILTER_NONE,            OFF                                                                     filter OFF
98 01      FILTER_LPF12,           LPF             sr / 6 0.16666 (~x3)            Chamberlin 12dB/oct
99 02      FILTER_LPF24,           LPF             sr / 2                                          Moog VCF 24dB/oct               
100 03      FILTER_LPF_BW,          LPF             sr / 2                                          butterworth     elion add       
101 04      FILTER_LPF12_2,         LPF             sr / 2                                          Resonant IIR 12dB/oct   
102 05      FILTER_LPF24_2,         LPF             sr / 2                                          amSynth 24dB/oct                
103 06      FILTER_LPF6,            LPF             sr / 2                                          One pole 6dB/oct nonrez
104 07      FILTER_LPF18,           LPF             sr / 2.25 0.44444 (~x2)         3pole 18dB/oct  
105 08      FILTER_LPF_TFO,         LPF             sr / 2                                          two first order         
106 // test
107 09      FILTER_HPF_BW,          HPF             sr / 2                                          butterworth elion+
108 10      FILTER_BPF_BW,          BPF             sr / 2                                          butterworth elion+      
109 11      FILTER_PEAK1,           peak    sr / 2
110 12      FILTER_NOTCH1,          notch   sr / 2
111 13      FILTER_LPF12_3,         LPF             sr / 4.6 0.21875 (~x3)          Chamberlin2 12dB/oct
112 14      FILTER_HPF12_3,         HPF             sr / 4.6 0.21875 (~x3)          Chamberlin2 12dB/oct
113 15      FILTER_BPF12_3,         BPF             sr / 4.6 0.21875 (~x3)          Chamberlin2 12dB/oct
114 16      FILTER_BCF12_3,         BCF             sr / 4.6 0.21875 (~x3)          Chamberlin2 12dB/oct    
115 17      FILTER_HPF6,            HPF             sr / 2                                          One pole 6dB/oct nonrez
116 18      FILTER_HPF12_2,         HPF             sr / 2                                          Resonant IIR 12dB/oct
117 // hybrid
118 19      FILTER_HBF_L6L12,       HBF             sr / 2                                                  
119 20      FILTER_HBF_L12L6,       HBF             sr / 2                                          
120 21      FILTER_HBF_L12H6,       HBF             sr / 2                                          
121 22      FILTER_HBF_L24H6,       HBF             sr / 2                                          
122 23      FILTER_HBF_L24H12,      HBF             sr / 2                                          
123 24      FILTER_HBF_L12OCT,      HBF             sr / 2                                          
124 25      FILTER_HBF_L24OCT,      HBF             sr / 2                                          
125 // multi
126 26      FILTER_LPF6x2,          LPF             sr / 2
127 27      FILTER_LPF6x3,          LPF             sr / 2
128 28      FILTER_LPF6x4,          LPF             sr / 2
129 29      FILTER_LPF6x8,          LPF             sr / 2
130 30      FILTER_LPF6x16,         LPF             sr / 2
131 31      FILTER_LPF_BWx2,        LPF             sr / 2
132 32      FILTER_LPF_BWx3,        LPF             sr / 2
133 33      FILTER_LPF_BWx4,        LPF             sr / 2
134 34      FILTER_LPF24_2x2,       LPF             sr / 2
135 35      FILTER_LPF_FIR,
136 // equalizer
137 36      FILTER_SHELVING_LOW,EQ_LOW      sr / 2                                  
138 37      FILTER_SHELVING_HI,     EQ_HI   sr / 2
139 38      FILTER_PEAKING,         EQ_MID  sr / 2
140 39      FILTER_BIQUAD_LOW,      LPF             sr / 2
141 40      FILTER_BIQUAD_HI,       HPF             sr / 2
142 // last
143 41      FILTER_LIST_MAX,
144 cutoff_limit sr/2\96¢\96\9e\82Ì\82à\82Ì\82Íoversampling\82Åsr/2\82ð\88µ\82¦\82é\82æ\82¤\82É\82·\82é
145 */
146
147
148
149 #if 1 // recalc filter margin
150 /*
151 \8cW\90\94\8dÄ\8cv\8eZ\82Í\95\89\89×\82ª\91å\82«\82­ \83{\83C\83X\83t\83B\83\8b\83^\82Å\8eg\97p\89ñ\90\94\82à\91½\82¢\82Ì\82Å \82 \82é\92ö\93x\8dí\82Á\82Ä\8f\88\97\9d\89ñ\90\94\82ð\8c¸\82ç\82·
152 \83{\83C\83X\83t\83B\83\8b\83^\82Í\95Ï\93®\82µ\82Ä\82é\82à\82Ì\82¾\82©\82ç100cent\83Y\83\8c\82Ä\82à\88á\82¢\82Í\82í\82©\82ç\82È\82¢ EQ\82Í\95Ï\93®\82µ\82È\82¢\82µ
153 */
154
155 #define INIT_MARGIN_VAL { \
156         fc->range[0] = fc->range[1] = fc->range[2] = fc->range[3] = fc->range[4] = fc->range[5] = fc->range[6] = fc->range[7] = 0; }
157 #define FLT_FREQ_MARGIN (fc->freq < fc->range[0] || fc->freq > fc->range[1])
158 #define FLT_RESO_MARGIN (fc->reso_dB < fc->range[2] || fc->reso_dB > fc->range[3])
159 #define FLT_WIDTH_MARGIN (fc->q < fc->range[4] || fc->q > fc->range[5])
160
161 #if (USE_X86_EXT_INTRIN >= 3) && defined(DATA_T_DOUBLE) && defined(FLOAT_T_DOUBLE)
162 #define CALC_MARGIN_VAL __m128d vec_range = _mm_set_pd(1.0 + ext_filter_margin, 1.0 - ext_filter_margin);
163 #define CALC_FREQ_MARGIN { _mm_storeu_pd(&fc->range[0], _mm_mul_pd(MM_LOAD1_PD(&fc->freq), vec_range));}
164 #define CALC_RESO_MARGIN { _mm_storeu_pd(&fc->range[2], _mm_mul_pd(MM_LOAD1_PD(&fc->reso_dB), vec_range));}
165 #define CALC_WIDTH_MARGIN { _mm_storeu_pd(&fc->range[4], _mm_mul_pd(MM_LOAD1_PD(&fc->q), vec_range));}
166 #else
167 #define CALC_MARGIN_VAL
168 #define CALC_FREQ_MARGIN {fc->range[0] = fc->freq * (1.0 - ext_filter_margin); fc->range[1] = fc->freq * (1.0 + ext_filter_margin);}
169 #define CALC_RESO_MARGIN {fc->range[2] = fc->reso_dB * (1.0 - ext_filter_margin); fc->range[3] = fc->reso_dB * (1.0 + ext_filter_margin);}
170 #define CALC_WIDTH_MARGIN {fc->range[4] = fc->q * (1.0 - ext_filter_margin); fc->range[5] = fc->q * (1.0 + ext_filter_margin);}
171 #endif
172
173 #else // ! recalc filter margin
174
175 #define INIT_MARGIN_VAL
176 #define CALC_MARGIN_VAL
177 #define FLT_FREQ_MARGIN (fc->freq != fc->last_freq)
178 #define FLT_RESO_MARGIN (fc->reso_dB != fc->last_reso_dB)
179 #define FLT_WIDTH_MARGIN (fc->q != fc->last_q)
180 #define CALC_FREQ_MARGIN {fc->last_freq = fc->freq;}
181 #define CALC_RESO_MARGIN {fc->last_reso_dB = fc->reso_dB;}
182 #define CALC_WIDTH_MARGIN {fc->last_q = fc->q;}
183 #endif
184
185 #if 1 // resonance use table
186 #define RESO_DB_CF_P(db) filter_cb_p_table[(int)(db * 10.0)]
187 #define RESO_DB_CF_M(db) filter_cb_m_table[(int)(db * 10.0)]
188 #elif 1 // resonance calc function lite
189 #define RESO_DB_CF_P(db) (FLOAT_T)(exp((float)(M_LN10 * DIV_40 * db)))
190 #define RESO_DB_CF_M(db) (FLOAT_T)(exp((float)(M_LN10 * -DIV_40 * db)))
191 #else // resonance calc function
192 #define RESO_DB_CF_P(db) pow(10.0, DIV_40 * db)
193 #define RESO_DB_CF_M(db) pow(10.0, -DIV_40 * db)
194 #endif
195
196
197
198
199 #if (OPT_MODE == 1) && !defined(DATA_T_DOUBLE) && !defined(DATA_T_FLOAT) /* fixed-point implementation */
200
201 static inline void sample_filter_none(FILTER_T *dc, FILTER_T *db, DATA_T *sp) {}
202
203 static inline void recalc_filter_none(FilterCoefficients *fc) {}
204
205 static inline void sample_filter_LPF12(FILTER_T *dc, FILTER_T *db, DATA_T *sp)
206 {
207         db[0] = db[0] + imuldiv28(db[2], dc[0]);
208         db[1] = (*sp << 4) - db[0] - imuldiv28(db[2], dc[1]);
209         db[2] = imuldiv28(db[1], dc[0]) + db[2];
210         *sp = db[0] >> 4; /* 4.28 to 8.24 */
211 }
212
213 static inline void sample_filter_LPF12_ov2(FILTER_T *dc, FILTER_T *db, DATA_T *sp)
214 {
215         FILTER_T input = *sp << 4;
216         
217         db[0] = db[0] + imuldiv28(db[2], dc[0]);
218         db[1] = input - db[0] - imuldiv28(db[2], dc[1]);
219         db[2] = imuldiv28(db[1], dc[0]) + db[2];
220         *sp = db[0] >> 4; /* 4.28 to 8.24 */
221         // ov2
222         db[0] = db[0] + imuldiv28(db[2], dc[0]);
223         db[1] = input - db[0] - imuldiv28(db[2], dc[1]);
224         db[2] = imuldiv28(db[1], dc[0]) + db[2];
225 }
226
227 static inline void sample_filter_LPF12_ov3(FILTER_T *dc, FILTER_T *db, DATA_T *sp)
228 {
229         FILTER_T input = *sp << 4;
230         
231         db[0] = db[0] + imuldiv28(db[2], dc[0]);
232         db[1] = input - db[0] - imuldiv28(db[2], dc[1]);
233         db[2] = imuldiv28(db[1], dc[0]) + db[2];
234         *sp = db[0] >> 4; /* 4.28 to 8.24 */
235         // ov2
236         db[0] = db[0] + imuldiv28(db[2], dc[0]);
237         db[1] = input - db[0] - imuldiv28(db[2], dc[1]);
238         db[2] = imuldiv28(db[1], dc[0]) + db[2];
239         // ov3
240         db[0] = db[0] + imuldiv28(db[2], dc[0]);
241         db[1] = input - db[0] - imuldiv28(db[2], dc[1]);
242         db[2] = imuldiv28(db[1], dc[0]) + db[2];
243 }
244
245 static inline void recalc_filter_LPF12(FilterCoefficients *fc)
246 {
247         int32 *dc = fc->dc;
248
249 /* copy with applying Chamberlin's lowpass filter. */
250         if (!FP_EQ(fc->freq, fc->last_freq) || !FP_EQ(fc->reso_dB, fc->last_reso_dB)) {
251                 fc->last_freq = fc->freq;               
252                 if(fc->freq < fc->flt_rate_limit1){ // <sr*DIV_6
253                         fc->sample_filter = sample_filter_LPF12;
254                         dc[0] = TIM_FSCALE(2.0 * sin(M_PI * fc->freq * fc->div_flt_rate), 28); // *1.0
255                 }else if(fc->freq < fc->flt_rate_limit2){ // <sr*2*DIV_6
256                         fc->sample_filter = sample_filter_LPF12_ov2;
257                         dc[0] = TIM_FSCALE(2.0 * sin(M_PI * fc->freq * fc->div_flt_rate_ov2), 28); // sr*2
258                 }else{ // <sr*3*DIV_6
259                         fc->sample_filter = sample_filter_LPF12_ov3;
260                         dc[0] = TIM_FSCALE(2.0 * sin(M_PI * fc->freq * fc->div_flt_rate_ov3), 28); // sr*3
261                 }
262                 fc->last_reso_dB = fc->reso_dB;
263                 dc[1] = TIM_FSCALE(RESO_DB_CF_M(fc->reso_dB), 28);
264         }
265 }
266
267 static inline void sample_filter_LPF24(FILTER_T *dc, FILTER_T *db, DATA_T *sp)
268 {
269         FILTER_T da[6];
270
271         da[0] = (*sp << 4) - imuldiv28(db[4], dc[2]);   /* feedback */
272         da[1] = db[1];
273         da[2] = db[2];
274         da[3] = db[3];
275         db[1] = imuldiv28((db[0] + da[0]), dc[0]) - imuldiv28(db[1], dc[1]);
276         db[2] = imuldiv28((db[1] + da[1]), dc[0]) - imuldiv28(db[2], dc[1]);
277         db[3] = imuldiv28((db[2] + da[2]), dc[0]) - imuldiv28(db[3], dc[1]);
278         db[4] = imuldiv28((db[3] + da[3]), dc[0]) - imuldiv28(db[4], dc[1]);
279         db[0] = da[0];
280         *sp = db[4] >> 4; /* 4.28 to 8.24 */
281 }
282
283 static inline void recalc_filter_LPF24(FilterCoefficients *fc)
284 {
285         FLOAT_T f, q, p, tmp;
286         int32 *dc = fc->dc;
287
288 /* copy with applying Moog lowpass VCF. */
289         if (!FP_EQ(fc->freq, fc->last_freq) || !FP_EQ(fc->reso_dB, fc->last_reso_dB)) {
290                 fc->last_freq = fc->freq;
291                 f = 2.0 * fc->freq * fc->div_flt_rate;
292                 p = 1.0 - f;
293                 fc->last_reso_dB = fc->reso_dB;
294                 q = 0.80 * (1.0 - RESO_DB_CF_M(fc->reso_dB)); // 0.0f <= c < 0.80f
295                 dc[0] = TIM_FSCALE(tmp = f + 0.8 * f * p, 28);
296                 dc[1] = TIM_FSCALE(tmp + tmp - 1.0, 28);
297                 dc[2] = TIM_FSCALE(q * (1.0 + 0.5 * p * (1.0 - p + 5.6 * p * p)), 28);          
298         }
299 }
300
301 static inline void sample_filter_LPF_BW(FILTER_T *dc, FILTER_T *db, DATA_T *sp)
302 {
303         // input
304         db[0] = *sp << 4;
305         // LPF
306         db[2] = imuldiv28(db[0], dc[0])
307               + imuldiv28(db[1], dc[1])
308               + imuldiv28(db[2], dc[2])
309               - imuldiv28(db[3], dc[3])
310               - imuldiv28(db[4], dc[4]);
311         db[4] = db[3];
312         db[3] = db[2]; // flt out
313         db[2] = db[1];
314         db[1] = db[0]; // flt in
315         // output
316         *sp = db[3] >> 4; /* 4.28 to 8.24 */
317 }
318
319 static inline void recalc_filter_LPF_BW(FilterCoefficients *fc)
320 {
321         FILTER_T *dc = fc->dc;
322         FLOAT_T q ,p, p2, qp, tmp;
323
324 // elion butterworth
325         if (!FP_EQ(fc->freq, fc->last_freq) || !FP_EQ(fc->reso_dB, fc->last_reso_dB)) {
326                 fc->last_freq = fc->freq;
327                 fc->last_reso_dB = fc->reso_dB;
328                 p = 1.0 / tan(M_PI * fc->freq * fc->div_flt_rate); // ?
329                 q = RESO_DB_CF_M(fc->reso_dB) * SQRT_2; // q>0.1
330                 p2 = p * p;
331                 qp = q * p;
332                 dc[0] = TIM_FSCALE(tmp = 1.0 / (1.0 + qp + p2), 28);
333                 dc[1] = TIM_FSCALE(2.0 * tmp, 28);
334                 dc[2] = dc[0];
335                 dc[3] = TIM_FSCALE(2.0 * (1.0 - p2) * tmp, 28);
336                 dc[4] = TIM_FSCALE((1.0 - qp + p2) * tmp, 28);
337         }
338 }
339
340 static inline void sample_filter_LPF12_2(FILTER_T *dc, FILTER_T *db, DATA_T *sp)
341 {
342         db[1] += imuldiv28(((*sp << 4) - db[0]), dc[1]);
343         db[0] += db[1];
344         db[1] = imuldiv28(db[1], dc[0]);
345         *sp = db[0] >> 4; /* 4.28 to 8.24 */
346 }
347
348 static inline void recalc_filter_LPF12_2(FilterCoefficients *fc)
349 {
350         FILTER_T *dc = fc->dc;
351         FLOAT_T f, q, tmp;
352
353 // Resonant IIR lowpass (12dB/oct) Olli Niemitalo //r
354         if (!FP_EQ(fc->freq, fc->last_freq) || !FP_EQ(fc->reso_dB, fc->last_reso_dB)) {
355                 fc->last_freq = fc->freq;
356                 fc->last_reso_dB = fc->reso_dB;
357                 f = M_PI2 * fc->freq * fc->div_flt_rate;
358                 //q = 1.0 - f / (2.0 * ((fc->reso_dB * DIV_96 + 1.0) + 0.5 / (1.0 + f)) + f - 2.0);
359                 q = 1.0 - f / (2.0 * (RESO_DB_CF_P(fc->reso_dB) + 0.5 / (1.0 + f)) + f - 2.0);
360                 dc[0] = TIM_FSCALE(tmp = q * q, 28);
361                 dc[1] = TIM_FSCALE(tmp + 1.0 - 2.0 * cos(f) * q, 28);
362         }
363 }
364
365 static inline void buffer_filter_LPF12_2(FILTER_T *dc, FILTER_T *db, DATA_T *sp, int32 count)
366 {
367         int32 i;
368         FILTER_T db0 = db[0], db1 = db[1], dc0 = dc[0], dc1 = dc[1];
369
370         for (i = 0; i < count; i++) {
371                 db1 += imuldiv28(((sp[i] << 4) - db0), dc1);
372                 db0 += db1;
373                 db1 = imuldiv28(db1, dc0);
374                 sp[i] = db0 >> 4; /* 4.28 to 8.24 */
375         }
376         db[0] = db0;
377         db[1] = db1;
378 }
379
380 static inline void sample_filter_LPF24_2(FILTER_T *dc, FILTER_T *db, DATA_T *sp)
381 {
382         db[0] = *sp << 4;
383         db[5] = imuldiv28(db[0], dc[0]) + db[1];
384         db[1] = imuldiv28(db[0], dc[1]) + imuldiv28(db[5], dc[3]) + db[2];
385         db[2] = imuldiv28(db[0], dc[2]) + imuldiv28(db[5], dc[4]);
386         db[0] = db[5];
387         db[5] = imuldiv28(db[0], dc[0]) + db[3];
388         db[3] = imuldiv28(db[0], dc[1]) + imuldiv28(db[5], dc[3]) + db[4];
389         db[4] = imuldiv28(db[0], dc[2]) + imuldiv28(db[5], dc[4]);
390         *sp = db[0] >> 4; /* 4.28 to 8.24 */
391 }
392
393 static inline void recalc_filter_LPF24_2(FilterCoefficients *fc)
394 {
395         FLOAT_T f, q, p, r, dc0;
396         int32 *dc = fc->dc;
397
398 // amSynth 24dB/ocatave resonant low-pass filter. Nick Dowell //r
399         if (!FP_EQ(fc->freq, fc->last_freq) || !FP_EQ(fc->reso_dB, fc->last_reso_dB)) {
400                 fc->last_freq = fc->freq;
401                 fc->last_reso_dB = fc->reso_dB;
402                 f = tan(M_PI * fc->freq * fc->div_flt_rate); // cutoff freq rate/2
403                 //q = 2 * (1 - fc->reso_dB * DIV_96); // maxQ = 0.9995
404                 q = 2.0 * RESO_DB_CF_M(fc->reso_dB);
405                 r = f * f;
406                 p = 1.0 / (1.0 + (q * f) + r);
407                 dc0 = r * p;
408                 dc[0] = TIM_FSCALE(dc0, 28);
409                 dc[1] = TIM_FSCALE(dc0 * 2, 28);
410                 dc[2] = dc[0];
411                 dc[3] = TIM_FSCALE(-2.0 * (r - 1) * p, 28);
412                 dc[4] = TIM_FSCALE((-1.0 + (q * f) - r) * p, 28);
413         }
414 }
415
416 static inline void sample_filter_LPF6(FILTER_T *dc, FILTER_T *db, DATA_T *sp)
417 {
418         db[1] = imuldiv28((*sp << 4), dc[0]) + imuldiv28(db[1], dc[1]);
419         *sp = db[1] >> 4; /* 4.28 to 8.24 */
420 }
421
422 static inline void recalc_filter_LPF6(FilterCoefficients *fc)
423 {
424         FLOAT_T f;
425         int32 *dc = fc->dc;
426
427 // One pole filter, LP 6dB/Oct scoofy no resonance //r
428         if (!FP_EQ(fc->freq, fc->last_freq)) {
429                 fc->last_freq = fc->freq;
430                 f = exp(-M_PI2 * fc->freq * fc->div_flt_rate);
431                 dc[0] = TIM_FSCALE(1.0 - f, 28);
432                 dc[1] = TIM_FSCALE(f, 28);
433         }
434 }
435
436 static inline void sample_filter_LPF18(FILTER_T *dc, FILTER_T *db, DATA_T *sp)
437 {
438         FILTER_T da[3];
439
440         da[0] = db[0];
441         da[1] = db[1];
442         da[2] = db[2];
443         db[0] = (*sp << 4) - imuldiv28(db[3], dc[2]);
444         db[1] = imuldiv28((db[0] + da[0]), dc[1]) - imuldiv28(db[1], dc[0]);
445         db[2] = imuldiv28((db[1] + da[1]), dc[1]) - imuldiv28(db[2], dc[0]);
446         db[3] = imuldiv28((db[2] + da[2]), dc[1]) - imuldiv28(db[3], dc[0]);
447         *sp = imuldiv28(db[3], dc[3]) >> 4; /* 4.28 to 8.24 */
448 }
449
450 static inline void sample_filter_LPF18_ov2(FILTER_T *dc, FILTER_T *db, DATA_T *sp)
451 {
452         FILTER_T da[3], input = *sp << 4;
453
454         da[0] = db[0];
455         da[1] = db[1];
456         da[2] = db[2];
457         db[0] = input - imuldiv28(db[3], dc[2]);
458         db[1] = imuldiv28((db[0] + da[0]), dc[1]) - imuldiv28(db[1], dc[0]);
459         db[2] = imuldiv28((db[1] + da[1]), dc[1]) - imuldiv28(db[2], dc[0]);
460         db[3] = imuldiv28((db[2] + da[2]), dc[1]) - imuldiv28(db[3], dc[0]);
461         // ov2
462         da[0] = db[0];
463         da[1] = db[1];
464         da[2] = db[2];
465         db[0] = input - imuldiv28(db[3], dc[2]);
466         db[1] = imuldiv28((db[0] + da[0]), dc[1]) - imuldiv28(db[1], dc[0]);
467         db[2] = imuldiv28((db[1] + da[1]), dc[1]) - imuldiv28(db[2], dc[0]);
468         db[3] = imuldiv28((db[2] + da[2]), dc[1]) - imuldiv28(db[3], dc[0]);
469         *sp = imuldiv28(db[3], dc[3]) >> 4; /* 4.28 to 8.24 */
470 }
471
472 static inline void recalc_filter_LPF18(FilterCoefficients *fc)
473 {
474         FLOAT_T f, q, p, tmp;
475         int32 *dc = fc->dc;
476
477 // LPF18 low-pass filter //r
478         if (!FP_EQ(fc->freq, fc->last_freq) || !FP_EQ(fc->reso_dB, fc->last_reso_dB)) {         
479                 fc->last_freq = fc->freq;
480                 if(fc->freq < fc->flt_rate_limit1){ // <sr/2.25
481                         fc->sample_filter = sample_filter_LPF18;
482                         f = 2.0 * fc->freq * fc->div_flt_rate; // *1.0
483                 }else{ // <sr*2/2.25
484                         fc->sample_filter = sample_filter_LPF18_ov2;
485                         f = 2.0 * fc->freq * fc->div_flt_rate_ov2; // sr*2
486                 }
487                 dc[0] = TIM_FSCALE(tmp = ((-2.7528 * f + 3.0429) * f + 1.718) * f - 0.9984, 28);
488                 fc->last_reso_dB = fc->reso_dB;
489                 //q = fc->reso_dB * DIV_96;
490                 q = 0.789 * (1.0 - RESO_DB_CF_M(fc->reso_dB)); // 0<q<0.78125
491                 p = tmp + 1.0;
492                 dc[1] = TIM_FSCALE(0.5 * p, 28);
493                 dc[2] = TIM_FSCALE(tmp = q * (((-2.7079 * p + 10.963) * p - 14.934) * p + 8.4974), 28);
494                 dc[3] = TIM_FSCALE(1.0 + (0.25 * (1.5 + 2.0 * tmp * (1.0 - f))), 28);
495         }
496 }
497
498 static inline void sample_filter_LPF_TFO(FILTER_T *dc, FILTER_T *db, DATA_T *sp)
499 {
500         db[0] = db[0] + imuldiv28(((*sp << 4) - db[0] + imuldiv28((db[0] - db[1]), dc[1])), dc[0]);
501         db[1] = db[1] + imuldiv28((db[0] - db[1]), dc[0]);
502         *sp = db[1] >> 4; /* 4.28 to 8.24 */
503 }
504
505 static inline void recalc_filter_LPF_TFO(FilterCoefficients *fc)
506 {
507         FLOAT_T q, tmp;
508         int32 *dc = fc->dc;
509
510 // two first order low-pass filter //r
511         if (!FP_EQ(fc->freq, fc->last_freq) || !FP_EQ(fc->reso_dB, fc->last_reso_dB)) {
512                 fc->last_freq = fc->freq;
513                 fc->last_reso_dB = fc->reso_dB;
514                 dc[0] = TIM_FSCALE(tmp = 2 * fc->freq * fc->div_flt_rate, 28);
515                 q = 1.0 - RESO_DB_CF_M(fc->reso_dB);
516                 dc[1] = TIM_FSCALE(q + q / (1.01 - tmp), 28);
517         }
518 }
519
520 static inline void sample_filter_HPF_BW(FILTER_T *dc, FILTER_T *db, DATA_T *sp)
521 {
522         // input
523         db[0] = *sp << 4;
524         // LPF
525         db[2] = imuldiv28(db[0], dc[0])
526               + imuldiv28(db[1], dc[1])
527               + imuldiv28(db[2], dc[2])
528               - imuldiv28(db[3], dc[3])
529               - imuldiv28(db[4], dc[4]);
530         db[4] = db[3];
531         db[3] = db[2]; // flt out
532         db[2] = db[1];
533         db[1] = db[0]; // flt in
534         // output
535         *sp = db[3] >> 4; /* 4.28 to 8.24 */
536 }
537
538 static inline void recalc_filter_HPF_BW(FilterCoefficients *fc)
539 {
540         int32 *dc = fc->dc;     
541         FLOAT_T q, p, p2, qp, tmp;
542
543 // elion butterworth HPF //r
544         if (!FP_EQ(fc->freq, fc->last_freq) || !FP_EQ(fc->reso_dB, fc->last_reso_dB)) {
545                 fc->last_freq = fc->freq;
546                 fc->last_reso_dB = fc->reso_dB;
547                 q = RESO_DB_CF_M(fc->reso_dB) * SQRT_2; // q>0.1
548                 p = tan(M_PI * fc->freq * fc->div_flt_rate); // hpf ?           
549                 p2 = p * p;
550                 qp = q * p;
551                 dc[0] = TIM_FSCALE(tmp = 1.0 / (1.0 + qp + p2), 28);
552                 dc[1] = TIM_FSCALE(-2 * tmp, 28); // hpf
553                 dc[2] = dc[0];
554                 dc[3] = TIM_FSCALE(2.0 * (p2 - 1.0) * tmp, 28); // hpf
555                 dc[4] = TIM_FSCALE((1.0 - qp + p2) * tmp, 28);
556         }
557 }
558
559 static inline void sample_filter_BPF_BW(FILTER_T *dc, FILTER_T *db, DATA_T *sp)
560 {
561         // input
562         db[0] = *sp << 4;
563         // LPF
564         db[2] = imuldiv28(db[0], dc[0])
565               + imuldiv28(db[1], dc[1])
566               + imuldiv28(db[2], dc[2])
567               - imuldiv28(db[3], dc[3])
568               - imuldiv28(db[4], dc[4]);
569         db[4] = db[3];
570         db[3] = db[2]; // flt out
571         db[2] = db[1];
572         db[1] = db[0]; // flt in
573         // HPF
574         db[7] = imuldiv28(db[3], dc[5])
575               + imuldiv28(db[6], dc[6])
576               + imuldiv28(db[7], dc[7])
577               - imuldiv28(db[8], dc[8])
578               - imuldiv28(db[9], dc[9]);
579         db[9] = db[8];
580         db[8] = db[7]; // flt out
581         db[7] = db[6];
582         db[6] = db[3]; // flt in
583         // output
584         *sp = db[8] >> 4; /* 4.28 to 8.24 */
585 }
586
587 static inline void recalc_filter_BPF_BW(FilterCoefficients *fc)
588 {
589         FLOAT_T f, q, r, pl, ph, sl, sh, tmp;
590         int32 *dc = fc->dc;
591
592 // elion butterworth
593         if (!FP_EQ(fc->freq, fc->last_freq) || !FP_EQ(fc->reso_dB, fc->last_reso_dB)) {
594                 fc->last_freq = fc->freq;
595                 fc->last_reso_dB = fc->reso_dB;
596                 f = fc->freq * fc->div_flt_rate;
597                 r = 1.0 - RESO_DB_CF_M(fc->reso_dB);
598                 q = SQRT_2 - r * SQRT_2; // q>0.1
599                 // LPF
600                 pl = 1.0 / tan(M_PI * f); // ?
601                 sl = pl * pl;
602                 dc[0] = TIM_FSCALE(tmp = 1.0 / (1.0 + q * pl + sl), 28);
603                 dc[1] = TIM_FSCALE(2.0 * tmp, 28);
604                 dc[2] = dc[0];
605                 dc[3] = TIM_FSCALE(2.0 * (1.0 - sl) * tmp, 28);
606                 dc[4] = TIM_FSCALE((1.0 - q * pl + sl) * tmp, 28);
607                 // HPF
608                 f = f * 0.80; // bandwidth = LPF-HPF
609                 ph = tan(M_PI * f); // hpf ?
610                 sh = ph * ph;
611                 dc[5] = TIM_FSCALE(tmp = 1.0 / (1.0 + q * ph + sh), 28);
612                 dc[6] = TIM_FSCALE(-2 * tmp, 28); // hpf
613                 dc[7] = dc[5];
614                 dc[8] = TIM_FSCALE(2.0 * (sh - 1.0) * tmp, 28); // hpf
615                 dc[9] = TIM_FSCALE((1.0 - q * ph + sh) * tmp, 28);
616         }
617 }
618
619 static inline void recalc_filter_peak1(FilterCoefficients *fc)
620 {
621         FLOAT_T f, q, r, pl ,ph, sl, sh;
622         int32 *dc = fc->dc;
623
624 // elion butterworth
625         if (!FP_EQ(fc->freq, fc->last_freq) || !FP_EQ(fc->reso_dB, fc->last_reso_dB)) {
626                 fc->last_freq = fc->freq;
627                 fc->last_reso_dB = fc->reso_dB;         
628                 f = cos(M_PI2 * fc->freq * fc->div_flt_rate);
629                 r = 1.0 - RESO_DB_CF_M(fc->reso_dB); // r < 0.99609375
630                 r *= 0.99609375;
631                 dc[0] = TIM_FSCALE((1 - r) * sqrt(r * (r - 4 * (f * f) + 2.0) + 1.0), 28);
632                 dc[1] = TIM_FSCALE(2 * f * r, 28);
633                 dc[2] = TIM_FSCALE(-(r * r), 28);
634         }
635 }
636
637 static inline void sample_filter_peak1(FILTER_T *dc, FILTER_T *db, DATA_T *sp)
638 {
639         FILTER_T r = 0;
640
641         db[0] = *sp << 4;
642         r += imuldiv28(dc[0], db[0]);
643         r += imuldiv28(dc[1], db[1]);
644         r += imuldiv28(dc[2], db[2]);
645         db[2] = db[1];
646         db[1] = r;
647         *sp = r >> 4; /* 4.28 to 8.24 */
648 }
649
650 static inline void recalc_filter_notch1(FilterCoefficients *fc)
651 {
652         FLOAT_T f, q, r, pl ,ph, sl, sh;
653         int32 *dc = fc->dc;
654
655 // elion butterworth
656         if (!FP_EQ(fc->freq, fc->last_freq) || !FP_EQ(fc->reso_dB, fc->last_reso_dB)) {
657                 fc->last_freq = fc->freq;
658                 fc->last_reso_dB = fc->reso_dB; 
659                 f = cos(M_PI2 * fc->freq * fc->div_flt_rate);
660                 r = (1.0 - RESO_DB_CF_M(fc->reso_dB)) * 0.99609375; // r < 0.99609375
661                 dc[0] = TIM_FSCALE((1 - r) * sqrt(r * (r - 4 * (f * f) + 2.0) + 1.0), 28);
662                 dc[1] = TIM_FSCALE(2 * f * r, 28);
663                 dc[2] = TIM_FSCALE(-(r * r), 28);
664         }
665 }
666
667 static inline void sample_filter_notch1(FILTER_T *dc, FILTER_T *db, DATA_T *sp)
668 {
669         FILTER_T r = 0;
670
671         db[0] = *sp << 4;
672         r += imuldiv28(dc[0], db[0]);
673         r += imuldiv28(dc[1], db[1]);
674         r += imuldiv28(dc[2], db[2]);
675         db[2] = db[1];
676         db[1] = r;
677         *sp = (db[0] - r) >> 4; // notch
678 }
679
680 static inline void sample_filter_LPF12_3(FILTER_T *dc, FILTER_T *db, DATA_T *sp)
681 {       
682         db[0] = db[0] + imuldiv28(dc[0], db[2]); // low
683         db[1] = imuldiv28(dc[1], *sp << 4) - db[0] - imuldiv28(dc[1], db[2]); // high
684         db[2] = imuldiv28(dc[0], db[1]) + db[2]; // band
685         *sp = db[0] >> 4; // (db[1] + db[0]) >> 4; // notch
686 }
687
688 static inline void sample_filter_LPF12_3_ov2(FILTER_T *dc, FILTER_T *db, DATA_T *sp)
689 {
690         FILTER_T input = *sp << 4;
691         
692         db[0] = db[0] + imuldiv28(dc[0], db[2]); // low
693         db[1] = imuldiv28(dc[1], input) - db[0] - imuldiv28(dc[1], db[2]); // high
694         db[2] = imuldiv28(dc[0], db[1]) + db[2]; // band
695         *sp = db[0] >> 4; // (db[1] + db[0]) >> 4; // notch
696         // ov2
697         db[0] = db[0] + imuldiv28(dc[0], db[2]); // low
698         db[1] = imuldiv28(dc[1], input) - db[0] - imuldiv28(dc[1], db[2]); // high
699         db[2] = imuldiv28(dc[0], db[1]) + db[2]; // band
700 }
701
702 static inline void sample_filter_LPF12_3_ov3(FILTER_T *dc, FILTER_T *db, DATA_T *sp)
703 {
704         FILTER_T input = *sp << 4;
705         
706         db[0] = db[0] + imuldiv28(dc[0], db[2]); // low
707         db[1] = imuldiv28(dc[1], input) - db[0] - imuldiv28(dc[1], db[2]); // high
708         db[2] = imuldiv28(dc[0], db[1]) + db[2]; // band
709         *sp = db[0] >> 4; // (db[1] + db[0]) >> 4; // notch
710         // ov2
711         db[0] = db[0] + imuldiv28(dc[0], db[2]); // low
712         db[1] = imuldiv28(dc[1], input) - db[0] - imuldiv28(dc[1], db[2]); // high
713         db[2] = imuldiv28(dc[0], db[1]) + db[2]; // band
714         // ov3
715         db[0] = db[0] + imuldiv28(dc[0], db[2]); // low
716         db[1] = imuldiv28(dc[1], input) - db[0] - imuldiv28(dc[1], db[2]); // high
717         db[2] = imuldiv28(dc[0], db[1]) + db[2]; // band
718 }
719
720 static inline void recalc_filter_LPF12_3(FilterCoefficients *fc)
721 {
722         int32 *dc = fc->dc;
723
724         /* Chamberlin2's lowpass filter. */
725         if (!FP_EQ(fc->freq, fc->last_freq) || !FP_EQ(fc->reso_dB, fc->last_reso_dB)) {
726                 fc->last_freq = fc->freq;               
727                 if(fc->freq < fc->flt_rate_limit1){ // <sr*0.21875
728                         fc->sample_filter = sample_filter_LPF12_3;
729                         dc[0] = TIM_FSCALE(2.0 * sin(M_PI * fc->freq * fc->div_flt_rate), 28); // *1.0
730                 }else if(fc->freq < fc->flt_rate_limit2){ // <sr*2*0.21875
731                         fc->sample_filter = sample_filter_LPF12_3_ov2;
732                         dc[0] = TIM_FSCALE(2.0 * sin(M_PI * fc->freq * fc->div_flt_rate_ov2), 28); // sr*2
733                 }else{ // <sr*3*0.21875
734                         fc->sample_filter = sample_filter_LPF12_3_ov3;
735                         dc[0] = TIM_FSCALE(2.0 * sin(M_PI * fc->freq * fc->div_flt_rate_ov3), 28); // sr*3
736                 }
737                 fc->last_reso_dB = fc->reso_dB;
738                 dc[1] = TIM_FSCALE(RESO_DB_CF_M(fc->reso_dB), 28);
739         }
740 }
741
742 static inline void sample_filter_HPF12_3(FILTER_T *dc, FILTER_T *db, DATA_T *sp)
743 {
744         db[0] = db[0] + imuldiv28(dc[0], db[2]); // low
745         db[1] = imuldiv28(dc[1], *sp << 4) - db[0] - imuldiv28(dc[1], db[2]); // high
746         db[2] = imuldiv28(dc[0], db[1]) + db[2]; // band
747         *sp = db[1] >> 4; // (db[1] + db[0]) >> 4; // notch
748 }
749
750 static inline void sample_filter_HPF12_3_ov2(FILTER_T *dc, FILTER_T *db, DATA_T *sp)
751 {
752         FILTER_T input = *sp << 4;
753         
754         db[0] = db[0] + imuldiv28(dc[0], db[2]); // low
755         db[1] = imuldiv28(dc[1], input) - db[0] - imuldiv28(dc[1], db[2]); // high
756         db[2] = imuldiv28(dc[0], db[1]) + db[2]; // band
757         *sp = db[1] >> 4; // (db[1] + db[0]) >> 4; // notch
758         // ov2
759         db[0] = db[0] + imuldiv28(dc[0], db[2]); // low
760         db[1] = imuldiv28(dc[1], input) - db[0] - imuldiv28(dc[1], db[2]); // high
761         db[2] = imuldiv28(dc[0], db[1]) + db[2]; // band
762 }
763
764 static inline void sample_filter_HPF12_3_ov3(FILTER_T *dc, FILTER_T *db, DATA_T *sp)
765 {
766         FILTER_T input = *sp << 4;
767         
768         db[0] = db[0] + imuldiv28(dc[0], db[2]); // low
769         db[1] = imuldiv28(dc[1], input) - db[0] - imuldiv28(dc[1], db[2]); // high
770         db[2] = imuldiv28(dc[0], db[1]) + db[2]; // band
771         *sp = db[1] >> 4; // (db[1] + db[0]) >> 4; // notch
772         // ov2
773         db[0] = db[0] + imuldiv28(dc[0], db[2]); // low
774         db[1] = imuldiv28(dc[1], input) - db[0] - imuldiv28(dc[1], db[2]); // high
775         db[2] = imuldiv28(dc[0], db[1]) + db[2]; // band
776         // ov3
777         db[0] = db[0] + imuldiv28(dc[0], db[2]); // low
778         db[1] = imuldiv28(dc[1], input) - db[0] - imuldiv28(dc[1], db[2]); // high
779         db[2] = imuldiv28(dc[0], db[1]) + db[2]; // band
780 }
781
782 static inline void recalc_filter_HPF12_3(FilterCoefficients *fc)
783 {
784         int32 *dc = fc->dc;
785
786         /* Chamberlin2's lowpass filter. */
787         if (!FP_EQ(fc->freq, fc->last_freq) || !FP_EQ(fc->reso_dB, fc->last_reso_dB)) {
788                 fc->last_freq = fc->freq;               
789                 if(fc->freq < fc->flt_rate_limit1){ // <sr*0.21875
790                         fc->sample_filter = sample_filter_HPF12_3;
791                         dc[0] = TIM_FSCALE(2.0 * sin(M_PI * fc->freq * fc->div_flt_rate), 28); // *1.0
792                 }else if(fc->freq < fc->flt_rate_limit2){ // <sr*2*0.21875
793                         fc->sample_filter = sample_filter_HPF12_3_ov2;
794                         dc[0] = TIM_FSCALE(2.0 * sin(M_PI * fc->freq * fc->div_flt_rate_ov2), 28); // sr*2
795                 }else{ // <sr*3*0.21875
796                         fc->sample_filter = sample_filter_HPF12_3_ov3;
797                         dc[0] = TIM_FSCALE(2.0 * sin(M_PI * fc->freq * fc->div_flt_rate_ov3), 28); // sr*3
798                 }
799                 fc->last_reso_dB = fc->reso_dB;
800                 dc[1] = TIM_FSCALE(RESO_DB_CF_M(fc->reso_dB), 28);
801         }
802 }
803
804 static inline void sample_filter_BPF12_3(FILTER_T *dc, FILTER_T *db, DATA_T *sp)
805 {
806         db[0] = db[0] + imuldiv28(dc[0], db[2]); // low
807         db[1] = imuldiv28(dc[1], *sp << 4) - db[0] - imuldiv28(dc[1], db[2]); // high
808         db[2] = imuldiv28(dc[0], db[1]) + db[2]; // band
809         *sp = db[2] >> 4; // (db[1] + db[0]) >> 4; // notch
810 }
811
812 static inline void sample_filter_BPF12_3_ov2(FILTER_T *dc, FILTER_T *db, DATA_T *sp)
813 {
814         FILTER_T input = *sp << 4;
815         
816         db[0] = db[0] + imuldiv28(dc[0], db[2]); // low
817         db[1] = imuldiv28(dc[1], input) - db[0] - imuldiv28(dc[1], db[2]); // high
818         db[2] = imuldiv28(dc[0], db[1]) + db[2]; // band
819         *sp = db[2] >> 4; // (db[1] + db[0]) >> 4; // notch
820         // ov2
821         db[0] = db[0] + imuldiv28(dc[0], db[2]); // low
822         db[1] = imuldiv28(dc[1], input) - db[0] - imuldiv28(dc[1], db[2]); // high
823         db[2] = imuldiv28(dc[0], db[1]) + db[2]; // band
824 }
825
826 static inline void sample_filter_BPF12_3_ov3(FILTER_T *dc, FILTER_T *db, DATA_T *sp)
827 {
828         FILTER_T input = *sp << 4;
829         
830         db[0] = db[0] + imuldiv28(dc[0], db[2]); // low
831         db[1] = imuldiv28(dc[1], input) - db[0] - imuldiv28(dc[1], db[2]); // high
832         db[2] = imuldiv28(dc[0], db[1]) + db[2]; // band
833         *sp = db[2] >> 4; // (db[1] + db[0]) >> 4; // notch
834         // ov2
835         db[0] = db[0] + imuldiv28(dc[0], db[2]); // low
836         db[1] = imuldiv28(dc[1], input) - db[0] - imuldiv28(dc[1], db[2]); // high
837         db[2] = imuldiv28(dc[0], db[1]) + db[2]; // band
838         // ov3
839         db[0] = db[0] + imuldiv28(dc[0], db[2]); // low
840         db[1] = imuldiv28(dc[1], input) - db[0] - imuldiv28(dc[1], db[2]); // high
841         db[2] = imuldiv28(dc[0], db[1]) + db[2]; // band
842 }
843
844 static inline void recalc_filter_BPF12_3(FilterCoefficients *fc)
845 {
846         int32 *dc = fc->dc;
847
848         /* Chamberlin2's lowpass filter. */
849         if (!FP_EQ(fc->freq, fc->last_freq) || !FP_EQ(fc->reso_dB, fc->last_reso_dB)) {
850                 fc->last_freq = fc->freq;               
851                 if(fc->freq < fc->flt_rate_limit1){ // <sr*0.21875
852                         fc->sample_filter = sample_filter_BPF12_3;
853                         dc[0] = TIM_FSCALE(2.0 * sin(M_PI * fc->freq * fc->div_flt_rate), 28); // *1.0
854                 }else if(fc->freq < fc->flt_rate_limit2){ // <sr*2*0.21875
855                         fc->sample_filter = sample_filter_BPF12_3_ov2;
856                         dc[0] = TIM_FSCALE(2.0 * sin(M_PI * fc->freq * fc->div_flt_rate_ov2), 28); // sr*2
857                 }else{ // <sr*3*0.21875
858                         fc->sample_filter = sample_filter_BPF12_3_ov3;
859                         dc[0] = TIM_FSCALE(2.0 * sin(M_PI * fc->freq * fc->div_flt_rate_ov3), 28); // sr*3
860                 }
861                 fc->last_reso_dB = fc->reso_dB;
862                 dc[1] = TIM_FSCALE(RESO_DB_CF_M(fc->reso_dB), 28);
863         }
864 }
865
866 static inline void sample_filter_BCF12_3(FILTER_T *dc, FILTER_T *db, DATA_T *sp)
867 {
868         db[0] = db[0] + imuldiv28(dc[0], db[2]); // low
869         db[1] = imuldiv28(dc[1], *sp << 4) - db[0] - imuldiv28(dc[1], db[2]); // high
870         db[2] = imuldiv28(dc[0], db[1]) + db[2]; // band
871         *sp = (db[1] + db[0]) >> 4; // notch
872 }
873
874 static inline void sample_filter_BCF12_3_ov2(FILTER_T *dc, FILTER_T *db, DATA_T *sp)
875 {
876         FILTER_T input = *sp << 4;
877         
878         db[0] = db[0] + imuldiv28(dc[0], db[2]); // low
879         db[1] = imuldiv28(dc[1], input) - db[0] - imuldiv28(dc[1], db[2]); // high
880         db[2] = imuldiv28(dc[0], db[1]) + db[2]; // band
881         *sp = (db[1] + db[0]) >> 4; // notch
882         // ov2
883         db[0] = db[0] + imuldiv28(dc[0], db[2]); // low
884         db[1] = imuldiv28(dc[1], input) - db[0] - imuldiv28(dc[1], db[2]); // high
885         db[2] = imuldiv28(dc[0], db[1]) + db[2]; // band
886 }
887
888 static inline void sample_filter_BCF12_3_ov3(FILTER_T *dc, FILTER_T *db, DATA_T *sp)
889 {
890         FILTER_T input = *sp << 4;
891
892         db[0] = db[0] + imuldiv28(dc[0], db[2]); // low
893         db[1] = imuldiv28(dc[1], input) - db[0] - imuldiv28(dc[1], db[2]); // high
894         db[2] = imuldiv28(dc[0], db[1]) + db[2]; // band
895         *sp = (db[1] + db[0]) >> 4; // notch
896         // ov2
897         db[0] = db[0] + imuldiv28(dc[0], db[2]); // low
898         db[1] = imuldiv28(dc[1], input) - db[0] - imuldiv28(dc[1], db[2]); // high
899         db[2] = imuldiv28(dc[0], db[1]) + db[2]; // band
900         // ov3
901         db[0] = db[0] + imuldiv28(dc[0], db[2]); // low
902         db[1] = imuldiv28(dc[1], input) - db[0] - imuldiv28(dc[1], db[2]); // high
903         db[2] = imuldiv28(dc[0], db[1]) + db[2]; // band
904 }
905
906 static inline void recalc_filter_BCF12_3(FilterCoefficients *fc)
907 {
908         int32 *dc = fc->dc;
909
910         /* Chamberlin2's lowpass filter. */
911         if (!FP_EQ(fc->freq, fc->last_freq) || !FP_EQ(fc->reso_dB, fc->last_reso_dB)) {
912                 fc->last_freq = fc->freq;               
913                 if(fc->freq < fc->flt_rate_limit1){ // <sr*0.21875
914                         fc->sample_filter = sample_filter_BCF12_3;
915                         dc[0] = TIM_FSCALE(2.0 * sin(M_PI * fc->freq * fc->div_flt_rate), 28); // *1.0
916                 }else if(fc->freq < fc->flt_rate_limit2){ // <sr*2*0.21875
917                         fc->sample_filter = sample_filter_BCF12_3_ov2;
918                         dc[0] = TIM_FSCALE(2.0 * sin(M_PI * fc->freq * fc->div_flt_rate_ov2), 28); // sr*2
919                 }else{ // <sr*3*0.21875
920                         fc->sample_filter = sample_filter_BCF12_3_ov3;
921                         dc[0] = TIM_FSCALE(2.0 * sin(M_PI * fc->freq * fc->div_flt_rate_ov3), 28); // sr*3
922                 }
923                 fc->last_reso_dB = fc->reso_dB;
924                 dc[1] = TIM_FSCALE(RESO_DB_CF_M(fc->reso_dB), 28);
925         }
926 }
927
928 static inline void sample_filter_HPF6(FILTER_T *dc, FILTER_T *db, DATA_T *sp)
929 {
930         *sp -= (db[1] = imuldiv28(dc[0], *sp << 4) + imuldiv28(dc[1], db[1])) >> 4;
931 }
932
933 static inline void sample_filter_HPF12_2(FILTER_T *dc, FILTER_T *db, DATA_T *sp)
934 {
935         db[1] += imuldiv28(((*sp << 4) - db[0]), dc[1]);
936         db[0] += db[1];
937         db[1] = imuldiv28(db[1], dc[0]);
938         *sp -= db[0] >> 4; /* 4.28 to 8.24 */
939 }
940
941
942 // hybrid
943
944 static inline void sample_filter_HBF_L6L12(FILTER_T *dc, FILTER_T *db, DATA_T *sp)
945 {
946         FILTER_T input = *sp << 4, out1, out2;
947         const FILTER_T var1 = TIM_FSCALE(0.75, 28);
948         const FILTER_T var2 = TIM_FSCALE(0.25, 28);
949         const FILTER_T var3 = TIM_FSCALE(1.0, 28);
950         // filter1
951         db[1] += imuldiv28((input - db[0]), dc[1]);
952         db[0] += db[1];
953         db[1] = imuldiv28(db[1], dc[0]);
954         out1 = db[0];
955         // filter2
956         db[11] = imuldiv28(input, dc[10]) + imuldiv28(db[11], dc[11]);
957         out2 = db[11];
958         // output
959         dc[16] = imuldiv28(dc[16], var1) + imuldiv28(dc[15], var2);
960         *sp = imuldiv28(out1, dc[16]) + imuldiv28(out2, var3 - dc[16]);
961
962
963 static inline void recalc_filter_HBF_L6L12(FilterCoefficients *fc)
964 {
965         FILTER_T *dc = fc->dc;
966         FLOAT_T f, r, p, q, t;
967         
968         if (!FP_EQ(fc->freq, fc->last_freq) || !FP_EQ(fc->reso_dB, fc->last_reso_dB)) {
969                 fc->last_freq = fc->freq;               
970                 fc->last_reso_dB = fc->reso_dB;
971                 // filter1
972                 f = M_PI2 * fc->freq * fc->div_flt_rate;
973                 q = 1.0 - f / (2.0 * (RESO_DB_CF_P(fc->reso_dB) + 0.5 / (1.0 + f)) + f - 2.0);
974                 p = q * q;
975                 dc[0] = TIM_FSCALE(p, 28);
976                 dc[1] = TIM_FSCALE(p + 1.0 - 2.0 * cos(f) * q, 28);
977                 // filter2
978                 f = exp(-M_PI2 * fc->freq * fc->div_flt_rate);
979                 dc[10] = TIM_FSCALE(1.0 - f, 28);
980                 dc[11] = TIM_FSCALE(f, 28);
981                 //
982                 dc[15] = TIM_FSCALE(1.0 - RESO_DB_CF_M(fc->reso_dB), 28);
983         }
984 }
985
986 static inline void sample_filter_HBF_L12L6(FILTER_T *dc, FILTER_T *db, DATA_T *sp)
987 {
988         FILTER_T input = *sp << 4, out1, out2;
989         const FILTER_T var = TIM_FSCALE(DIV_2, 28);
990         // filter1
991         db[1] += imuldiv28((input - db[0]), dc[1]);
992         db[0] += db[1];
993         db[1] = imuldiv28(db[1], dc[0]);
994         out1 = db[0];
995         // filter2
996         db[11] = imuldiv28(input, dc[10]) + imuldiv28(db[11], dc[11]);
997         out2 = db[11];
998         // output       
999         *sp = (out1 + imuldiv28(out2, var)) >> 4; /* 4.28 to 8.24 */
1000
1001
1002 static inline void recalc_filter_HBF_L12L6(FilterCoefficients *fc)
1003 {
1004         FILTER_T *dc = fc->dc;
1005         FLOAT_T f, r, q ,p;
1006         
1007         if (!FP_EQ(fc->freq, fc->last_freq) || !FP_EQ(fc->reso_dB, fc->last_reso_dB)) {
1008                 fc->last_freq = fc->freq;               
1009                 fc->last_reso_dB = fc->reso_dB;
1010                 // filter1
1011                 f = M_PI2 * fc->freq * fc->div_flt_rate;
1012                 q = 1.0 - f / (2.0 * (RESO_DB_CF_P(fc->reso_dB) + 0.5 / (1.0 + f)) + f - 2.0);
1013                 p = q * q;
1014                 dc[0] = TIM_FSCALE(p, 28);
1015                 dc[1] = TIM_FSCALE(p + 1.0 - 2.0 * cos(f) * q, 28);
1016                 // filter2
1017                 f = exp(-M_PI2 * fc->freq * fc->div_flt_rate);
1018                 dc[10] = TIM_FSCALE(1.0 - f, 28);
1019                 dc[11] = TIM_FSCALE(f, 28);
1020         }
1021 }
1022
1023 static inline void sample_filter_HBF_L12H6(FILTER_T *dc, FILTER_T *db, DATA_T *sp)
1024 {
1025         FILTER_T input = *sp << 4, out1, out2;
1026         const FILTER_T var = TIM_FSCALE(DIV_2, 28);
1027         // filter1
1028         db[1] += imuldiv28((input - db[0]), dc[1]);
1029         db[0] += db[1];
1030         db[1] = imuldiv28(db[1], dc[0]);
1031         out1 = db[0];
1032         // filter2
1033         db[11] = imuldiv28(input, dc[10]) + imuldiv28(db[11], dc[11]);
1034         out2 = input - db[11];
1035         // output       
1036         *sp = (out1 + imuldiv28(out2, var)) >> 4; /* 4.28 to 8.24 */
1037
1038
1039 static inline void recalc_filter_HBF_L12H6(FilterCoefficients *fc)
1040 {
1041         FILTER_T *dc = fc->dc;
1042         FLOAT_T f, r, q ,p;
1043         
1044         if (!FP_EQ(fc->freq, fc->last_freq) || !FP_EQ(fc->reso_dB, fc->last_reso_dB)) {
1045                 fc->last_freq = fc->freq;               
1046                 fc->last_reso_dB = fc->reso_dB;
1047                 // filter1
1048                 f = M_PI2 * fc->freq * fc->div_flt_rate;
1049                 q = 1.0 - f / (2.0 * (RESO_DB_CF_P(fc->reso_dB) + 0.5 / (1.0 + f)) + f - 2.0);
1050                 p = q * q;
1051                 dc[0] = TIM_FSCALE(p, 28);
1052                 dc[1] = TIM_FSCALE(p + 1.0 - 2.0 * cos(f) * q, 28);
1053                 // filter2
1054                 f = exp(-M_PI2 * fc->freq * fc->div_flt_rate);
1055                 dc[10] = TIM_FSCALE(1.0 - f, 28);
1056                 dc[11] = TIM_FSCALE(f, 28);
1057         }
1058 }
1059
1060 static inline void sample_filter_HBF_L24H6(FILTER_T *dc, FILTER_T *db, DATA_T *sp)
1061 {
1062         FILTER_T input = *sp << 4, out1, out2;
1063         const FILTER_T var = TIM_FSCALE(DIV_2, 28);
1064         // filter1
1065         db[0] = input;
1066         db[5] = imuldiv28(db[0], dc[0]) + db[1];
1067         db[1] = imuldiv28(db[0], dc[1]) + imuldiv28(db[5], dc[3]) + db[2];
1068         db[2] = imuldiv28(db[0], dc[2]) + imuldiv28(db[5], dc[4]);
1069         db[0] = db[5];
1070         db[5] = imuldiv28(db[0], dc[0]) + db[3];
1071         db[3] = imuldiv28(db[0], dc[1]) + imuldiv28(db[5], dc[3]) + db[4];
1072         db[4] = imuldiv28(db[0], dc[2]) + imuldiv28(db[5], dc[4]);
1073         out1 = db[0];
1074         // filter2
1075         db[11] = imuldiv28(input, dc[10]) + imuldiv28(db[11], dc[11]);
1076         out2 = input - db[11];
1077         // output       
1078         *sp = (out1 + imuldiv28(out2, var)) >> 4; /* 4.28 to 8.24 */
1079
1080
1081 static inline void recalc_filter_HBF_L24H6(FilterCoefficients *fc)
1082 {
1083         FILTER_T *dc = fc->dc;
1084         FLOAT_T f, r, q ,p, s;
1085         
1086         if (!FP_EQ(fc->freq, fc->last_freq) || !FP_EQ(fc->reso_dB, fc->last_reso_dB)) {
1087                 fc->last_freq = fc->freq;               
1088                 fc->last_reso_dB = fc->reso_dB;
1089                 // filter1
1090                 f = tan(M_PI * fc->freq * fc->div_flt_rate); // cutoff freq rate/2
1091                 q = 2.0 * RESO_DB_CF_M( fc->reso_dB);
1092                 r = f * f;
1093                 p = 1 + (q * f) + r;
1094                 s = r / p;
1095                 dc[0] = TIM_FSCALE(s, 28);
1096                 dc[1] = TIM_FSCALE(s * 2, 28);
1097                 dc[2] = TIM_FSCALE(r / p, 28);
1098                 dc[3] = TIM_FSCALE(2 * (r - 1) / (-p), 28);
1099                 dc[4] = TIM_FSCALE((1 - (q * f) + r) / (-p), 28);
1100                 // filter2
1101                 f = exp(-M_PI2 * fc->freq * fc->div_flt_rate);
1102                 dc[10] = TIM_FSCALE(1.0 - f, 28);
1103                 dc[11] = TIM_FSCALE(f, 28);
1104         }
1105 }
1106
1107 static inline void sample_filter_HBF_L24H12(FILTER_T *dc, FILTER_T *db, DATA_T *sp)
1108 {
1109         FILTER_T input = *sp << 4, out1, out2;
1110         const FILTER_T var = TIM_FSCALE(DIV_2, 28);
1111         // filter1
1112         db[0] = input;
1113         db[5] = imuldiv28(db[0], dc[0]) + db[1];
1114         db[1] = imuldiv28(db[0], dc[1]) + imuldiv28(db[5], dc[3]) + db[2];
1115         db[2] = imuldiv28(db[0], dc[2]) + imuldiv28(db[5], dc[4]);
1116         db[0] = db[5];
1117         db[5] = imuldiv28(db[0], dc[0]) + db[3];
1118         db[3] = imuldiv28(db[0], dc[1]) + imuldiv28(db[5], dc[3]) + db[4];
1119         db[4] = imuldiv28(db[0], dc[2]) + imuldiv28(db[5], dc[4]);
1120         out1 = db[0];
1121         // filter2
1122         db[11] += imuldiv28((input - db[10]), dc[11]);
1123         db[10] += db[11];
1124         db[11] = imuldiv28(db[11], dc[10]);
1125         out2 = input - db[10];
1126         // output       
1127         *sp = (out1 + imuldiv28(out2, var)) >> 4; /* 4.28 to 8.24 */
1128
1129
1130 static inline void recalc_filter_HBF_L24H12(FilterCoefficients *fc)
1131 {
1132         FILTER_T *dc = fc->dc;
1133         FLOAT_T f, r, q ,p, s;
1134         
1135         if (!FP_EQ(fc->freq, fc->last_freq) || !FP_EQ(fc->reso_dB, fc->last_reso_dB)) {
1136                 fc->last_freq = fc->freq;               
1137                 fc->last_reso_dB = fc->reso_dB;
1138                 // filter1
1139                 f = tan(M_PI * fc->freq * fc->div_flt_rate); // cutoff freq rate/2
1140                 q = 2.0 * RESO_DB_CF_M( fc->reso_dB);
1141                 r = f * f;
1142                 p = 1 + (q * f) + r;
1143                 s = r / p;
1144                 dc[0] = TIM_FSCALE(s, 28);
1145                 dc[1] = TIM_FSCALE(s * 2, 28);
1146                 dc[2] = TIM_FSCALE(r / p, 28);
1147                 dc[3] = TIM_FSCALE(2 * (r - 1) / (-p), 28);
1148                 dc[4] = TIM_FSCALE((1 - (q * f) + r) / (-p), 28);
1149                 // filter2
1150                 f = M_PI2 * fc->freq * fc->div_flt_rate;
1151                 q = 1.0 - f / (2.0 * (RESO_DB_CF_P(fc->reso_dB) + 0.5 / (1.0 + f)) + f - 2.0);
1152                 p = q * q;
1153                 dc[10] = TIM_FSCALE(p, 28);
1154                 dc[11] = TIM_FSCALE(p + 1.0 - 2.0 * cos(f) * q, 28);
1155         }
1156 }
1157
1158 static inline void sample_filter_HBF_L12OCT(FILTER_T *dc, FILTER_T *db, DATA_T *sp)
1159 {
1160         FILTER_T input = *sp << 4, out1, out2;
1161         const FILTER_T var1 = TIM_FSCALE(DIV_3_2, 28);
1162         const FILTER_T var2 = TIM_FSCALE(DIV_3, 28);
1163         // filter1
1164         db[1] += imuldiv28((input - db[0]), dc[1]);
1165         db[0] += db[1];
1166         db[1] = imuldiv28(db[1], dc[0]);
1167         out1 = db[0];
1168         // filter2
1169         db[11] += imuldiv28((input - db[10]), dc[11]);
1170         db[10] += db[11];
1171         db[11] = imuldiv28(db[11], dc[10]);
1172         out2 = db[10];
1173         // output       
1174         *sp = (imuldiv28(out1, var1) + imuldiv28(out2, var2)) >> 4; /* 4.28 to 8.24 */
1175
1176
1177 static inline void recalc_filter_HBF_L12OCT(FilterCoefficients *fc)
1178 {
1179         FILTER_T *dc = fc->dc;
1180         FLOAT_T f, r, q ,p;
1181         
1182         if (!FP_EQ(fc->freq, fc->last_freq) || !FP_EQ(fc->reso_dB, fc->last_reso_dB)) {
1183                 fc->last_freq = fc->freq;               
1184                 fc->last_reso_dB = fc->reso_dB;
1185                 // filter1
1186                 f = M_PI2 * fc->freq * fc->div_flt_rate;
1187                 q = 1.0 - f / (2.0 * (RESO_DB_CF_P(fc->reso_dB) + 0.5 / (1.0 + f)) + f - 2.0);
1188                 p = q * q;
1189                 dc[0] = TIM_FSCALE(p, 28);
1190                 dc[1] = TIM_FSCALE(p + 1.0 - 2.0 * cos(f) * q, 28);
1191                 // filter2
1192                 f = 2.0 * fc->freq * fc->div_flt_rate;
1193                 if(f > DIV_2)
1194                         f = DIV_2;
1195                 f = M_PI2 * f;
1196                 q = 1.0 - f / (2.0 * (RESO_DB_CF_P(fc->reso_dB) + 0.5 / (1.0 + f)) + f - 2.0);
1197                 p = q * q;
1198                 dc[10] = TIM_FSCALE(p, 28);
1199                 dc[11] = TIM_FSCALE(p + 1.0 - 2.0 * cos(f) * q, 28);
1200         }
1201 }
1202
1203 static inline void sample_filter_HBF_L24OCT(FILTER_T *dc, FILTER_T *db, DATA_T *sp)
1204 {
1205         FILTER_T input = *sp << 4, out1, out2;
1206         const FILTER_T var1 = TIM_FSCALE(DIV_3_2, 28);
1207         const FILTER_T var2 = TIM_FSCALE(DIV_3, 28);
1208         // filter1
1209         db[0] = input;
1210         db[5] = imuldiv28(db[0], dc[0]) + db[1];
1211         db[1] = imuldiv28(db[0], dc[1]) + imuldiv28(db[5], dc[3]) + db[2];
1212         db[2] = imuldiv28(db[0], dc[2]) + imuldiv28(db[5], dc[4]);
1213         db[0] = db[5];
1214         db[5] = imuldiv28(db[0], dc[0]) + db[3];
1215         db[3] = imuldiv28(db[0], dc[1]) + imuldiv28(db[5], dc[3]) + db[4];
1216         db[4] = imuldiv28(db[0], dc[2]) + imuldiv28(db[5], dc[4]);
1217         out1 = db[0];
1218         // filter2
1219         db[10] = input;
1220         db[15] = imuldiv28(db[10], dc[10]) + db[11];
1221         db[11] = imuldiv28(db[10], dc[11]) + imuldiv28(db[15], dc[13]) + db[12];
1222         db[12] = imuldiv28(db[10], dc[12]) + imuldiv28(db[15], dc[14]);
1223         db[10] = db[15];
1224         db[15] = imuldiv28(db[10], dc[10]) + db[3];
1225         db[13] = imuldiv28(db[10], dc[11]) + imuldiv28(db[15], dc[13]) + db[14];
1226         db[14] = imuldiv28(db[10], dc[12]) + imuldiv28(db[15], dc[14]);
1227         out2 = db[10];
1228         // output       
1229         *sp = (imuldiv28(out1, var1) + imuldiv28(out2, var2)) >> 4; /* 4.28 to 8.24 */
1230
1231
1232 static inline void recalc_filter_HBF_L24OCT(FilterCoefficients *fc)
1233 {
1234         FILTER_T *dc = fc->dc;
1235         FLOAT_T f, r, q ,p, s;
1236         
1237         if (!FP_EQ(fc->freq, fc->last_freq) || !FP_EQ(fc->reso_dB, fc->last_reso_dB)) {
1238                 fc->last_freq = fc->freq;               
1239                 fc->last_reso_dB = fc->reso_dB;
1240                 // filter1
1241                 f = tan(M_PI * fc->freq * fc->div_flt_rate); // cutoff freq rate/2
1242                 q = 2.0 * RESO_DB_CF_M( fc->reso_dB);
1243                 r = f * f;
1244                 p = 1 + (q * f) + r;
1245                 s = r / p;
1246                 dc[0] = TIM_FSCALE(s, 28);
1247                 dc[1] = TIM_FSCALE(s * 2, 28);
1248                 dc[2] = TIM_FSCALE(r / p, 28);
1249                 dc[3] = TIM_FSCALE(2 * (r - 1) / (-p), 28);
1250                 dc[4] = TIM_FSCALE((1 - (q * f) + r) / (-p), 28);
1251                 // filter2
1252                 f = 2.0 * fc->freq * fc->div_flt_rate;
1253                 if(f > DIV_2)
1254                         f = DIV_2;
1255                 f = tan(M_PI * f); // cutoff freq rate/2
1256                 q = 2.0 * RESO_DB_CF_M( fc->reso_dB);
1257                 r = f * f;
1258                 p = 1 + (q * f) + r;
1259                 s = r / p;
1260                 dc[10] = TIM_FSCALE(s, 28);
1261                 dc[11] = TIM_FSCALE(s * 2, 28);
1262                 dc[12] = TIM_FSCALE(r / p, 28);
1263                 dc[13] = TIM_FSCALE(2 * (r - 1) / (-p), 28);
1264                 dc[14] = TIM_FSCALE((1 - (q * f) + r) / (-p), 28);
1265         }
1266 }
1267
1268 // multi
1269
1270 static inline void sample_filter_LPF_BWx2(FILTER_T *dc, FILTER_T *db, DATA_T *sp)
1271 {
1272         // input
1273         db[ 0] = *sp << 4;
1274         // filter1
1275         db[ 2] = imuldiv28(db[ 0], dc[0])
1276                + imuldiv28(db[ 1], dc[1])
1277                + imuldiv28(db[ 2], dc[2])
1278                - imuldiv28(db[ 3], dc[3])
1279                - imuldiv28(db[ 4], dc[4]);
1280         db[ 4] = db[ 3];
1281         db[ 3] = db[ 2]; // flt out
1282         db[ 2] = db[ 1];
1283         db[ 1] = db[ 0]; // flt in
1284         // filter2
1285         db[ 6] = imuldiv28(db[ 3], dc[0])
1286                + imuldiv28(db[ 5], dc[1])
1287                + imuldiv28(db[ 6], dc[2])
1288                - imuldiv28(db[ 7], dc[3])
1289                - imuldiv28(db[ 8], dc[4]);
1290         db[ 8] = db[ 7];
1291         db[ 7] = db[ 6]; // flt out
1292         db[ 6] = db[ 5];
1293         db[ 5] = db[ 3]; // flt in
1294         // output
1295         *sp = db[ 7] >> 4; /* 4.28 to 8.24 */
1296 }
1297
1298 static inline void sample_filter_LPF_BWx3(FILTER_T *dc, FILTER_T *db, DATA_T *sp)
1299 {
1300         // input
1301         db[ 0] = *sp << 4;
1302         // filter1
1303         db[ 2] = imuldiv28(db[ 0], dc[0])
1304                + imuldiv28(db[ 1], dc[1])
1305                + imuldiv28(db[ 2], dc[2])
1306                - imuldiv28(db[ 3], dc[3])
1307                - imuldiv28(db[ 4], dc[4]);
1308         db[ 4] = db[ 3];
1309         db[ 3] = db[ 2]; // flt out
1310         db[ 2] = db[ 1];
1311         db[ 1] = db[ 0]; // flt in
1312         // filter2
1313         db[ 6] = imuldiv28(db[ 3], dc[0])
1314                + imuldiv28(db[ 5], dc[1])
1315                + imuldiv28(db[ 6], dc[2])
1316                - imuldiv28(db[ 7], dc[3])
1317                - imuldiv28(db[ 8], dc[4]);
1318         db[ 8] = db[ 7];
1319         db[ 7] = db[ 6]; // flt out
1320         db[ 6] = db[ 5];
1321         db[ 5] = db[ 3]; // flt in
1322         // filter3
1323         db[10] = imuldiv28(db[ 7], dc[0])
1324                + imuldiv28(db[ 9], dc[1])
1325                + imuldiv28(db[10], dc[2])
1326                - imuldiv28(db[11], dc[3])
1327                - imuldiv28(db[12], dc[4]);
1328         db[12] = db[11];
1329         db[11] = db[10]; // flt out
1330         db[10] = db[ 9];
1331         db[ 9] = db[ 7]; // flt in
1332         // output
1333         *sp = db[11] >> 4; /* 4.28 to 8.24 */
1334 }
1335
1336 static inline void sample_filter_LPF_BWx4(FILTER_T *dc, FILTER_T *db, DATA_T *sp)
1337 {
1338         // input
1339         db[ 0] = *sp << 4;
1340         // filter1
1341         db[ 2] = imuldiv28(db[ 0], dc[0])
1342                + imuldiv28(db[ 1], dc[1])
1343                + imuldiv28(db[ 2], dc[2])
1344                - imuldiv28(db[ 3], dc[3])
1345                - imuldiv28(db[ 4], dc[4]);
1346         db[ 4] = db[ 3];
1347         db[ 3] = db[ 2]; // flt out
1348         db[ 2] = db[ 1];
1349         db[ 1] = db[ 0]; // flt in
1350         // filter2
1351         db[ 6] = imuldiv28(db[ 3], dc[0])
1352                + imuldiv28(db[ 5], dc[1])
1353                + imuldiv28(db[ 6], dc[2])
1354                - imuldiv28(db[ 7], dc[3])
1355                - imuldiv28(db[ 8], dc[4]);
1356         db[ 8] = db[ 7];
1357         db[ 7] = db[ 6]; // flt out
1358         db[ 6] = db[ 5];
1359         db[ 5] = db[ 3]; // flt in
1360         // filter3
1361         db[10] = imuldiv28(db[ 7], dc[0])
1362                + imuldiv28(db[ 9], dc[1])
1363                + imuldiv28(db[10], dc[2])
1364                - imuldiv28(db[11], dc[3])
1365                - imuldiv28(db[12], dc[4]);
1366         db[12] = db[11];
1367         db[11] = db[10]; // flt out
1368         db[10] = db[ 9];
1369         db[ 9] = db[ 7]; // flt in
1370         // filter4
1371         db[14] = imuldiv28(db[11], dc[0])
1372                + imuldiv28(db[13], dc[1])
1373                + imuldiv28(db[14], dc[2])
1374                - imuldiv28(db[15], dc[3])
1375                - imuldiv28(db[16], dc[4]);
1376         db[16] = db[15];
1377         db[15] = db[14]; // flt out
1378         db[14] = db[13];
1379         db[13] = db[11]; // flt in
1380         // output
1381         *sp = db[15] >> 4; /* 4.28 to 8.24 */
1382 }
1383
1384 static inline void recalc_filter_LPF24_2x2(FilterCoefficients *fc)
1385 {
1386         FLOAT_T f, q, p, r, tmp;
1387         int32 *dc = fc->dc;
1388
1389         if (!FP_EQ(fc->freq, fc->last_freq) || !FP_EQ(fc->reso_dB, fc->last_reso_dB)) {
1390                 fc->last_freq = fc->freq;
1391                 fc->last_reso_dB = fc->reso_dB;
1392                 //f = 1.0 / tan(M_PI * fc->freq * fc->div_flt_rate);
1393                 f = tan(M_PI * fc->freq * fc->div_flt_rate); // cutoff freq rate/2
1394                 q = 2.0 * RESO_DB_CF_M(fc->reso_dB);
1395                 r = f * f;
1396                 //p = 1 + ((2.0) * f) + r;
1397                 p = 1 + (q * f) + r;
1398                 dc[0] = TIM_FSCALE(tmp = r / p, 28);
1399                 dc[1] = TIM_FSCALE(tmp * 2, 28);
1400                 dc[2] = TIM_FSCALE(r / p, 28);
1401                 dc[3] = TIM_FSCALE(2 * (r - 1) / (-p), 28);
1402                 //dc[4] = TIM_FSCALE((1 - ((2.0) * f) + r) / (-p), 28);
1403                 dc[4] = TIM_FSCALE((1 - (q * f) + r) / (-p), 28);
1404         }
1405 }
1406
1407 static inline void sample_filter_LPF24_2x2(FILTER_T *dc, FILTER_T *db, DATA_T *sp)
1408 {
1409         db[0] = *sp << 4;
1410         // filter1
1411         db[5] = imuldiv28(db[0], dc[0]) + db[1];
1412         db[1] = imuldiv28(db[0], dc[1]) + imuldiv28(db[5], dc[3]) + db[2];
1413         db[2] = imuldiv28(db[0], dc[2]) + imuldiv28(db[5], dc[4]);
1414         db[10] = db[0] = db[5];
1415         db[5] = imuldiv28(db[0], dc[0]) + db[3];
1416         db[3] = imuldiv28(db[0], dc[1]) + imuldiv28(db[5], dc[3]) + db[4];
1417         db[4] = imuldiv28(db[0], dc[2]) + imuldiv28(db[5], dc[4]);
1418         // filter2
1419         db[15] = imuldiv28(db[10], dc[0]) + db[11];
1420         db[11] = imuldiv28(db[10], dc[1]) + imuldiv28(db[15], dc[3]) + db[12];
1421         db[12] = imuldiv28(db[10], dc[2]) + imuldiv28(db[15], dc[4]);
1422         db[10] = db[15];
1423         db[15] = imuldiv28(db[10], dc[0]) + db[13];
1424         db[13] = imuldiv28(db[10], dc[1]) + imuldiv28(db[15], dc[3]) + db[14];
1425         db[14] = imuldiv28(db[10], dc[2]) + imuldiv28(db[15], dc[4]);
1426         *sp = db[10] >> 4; /* 4.28 to 8.24 */
1427 }
1428
1429 static inline void sample_filter_LPF6x2(FILTER_T *dc, FILTER_T *db, DATA_T *sp)
1430 {
1431         db[0] = *sp << 4;
1432         db[1] = imuldiv28(db[0], dc[0]) + imuldiv28(db[1], dc[1]); // 6db
1433         db[2] = imuldiv28(db[0], dc[1]) + imuldiv28(db[1], dc[2]); // 12db
1434         *sp = db[2] >> 4; /* 4.28 to 8.24 */
1435 }
1436
1437 static inline void sample_filter_LPF6x3(FILTER_T *dc, FILTER_T *db, DATA_T *sp)
1438 {
1439         db[0] = *sp << 4;
1440         db[1] = imuldiv28(db[0], dc[0]) + imuldiv28(db[1], dc[1]); // 6db
1441         db[2] = imuldiv28(db[0], dc[1]) + imuldiv28(db[1], dc[2]); // 12db
1442         db[3] = imuldiv28(db[0], dc[2]) + imuldiv28(db[1], dc[3]);
1443         *sp = db[3] >> 4; /* 4.28 to 8.24 */
1444 }
1445
1446 static inline void sample_filter_LPF6x4(FILTER_T *dc, FILTER_T *db, DATA_T *sp)
1447 {
1448         db[0] = *sp << 4;
1449         db[1] = imuldiv28(db[0], dc[0]) + imuldiv28(db[1], dc[1]); // 6db
1450         db[2] = imuldiv28(db[0], dc[1]) + imuldiv28(db[1], dc[2]); // 12db
1451         db[3] = imuldiv28(db[0], dc[2]) + imuldiv28(db[1], dc[3]);
1452         db[4] = imuldiv28(db[0], dc[3]) + imuldiv28(db[1], dc[4]); // 24db
1453         *sp = db[4] >> 4; /* 4.28 to 8.24 */
1454 }
1455
1456 static inline void sample_filter_LPF6x8(FILTER_T *dc, FILTER_T *db, DATA_T *sp)
1457 {
1458         db[0] = *sp << 4;
1459         db[1] = imuldiv28(db[0], dc[0]) + imuldiv28(db[1], dc[1]); // 6db
1460         db[2] = imuldiv28(db[0], dc[1]) + imuldiv28(db[1], dc[2]); // 12db
1461         db[3] = imuldiv28(db[0], dc[2]) + imuldiv28(db[1], dc[3]);
1462         db[4] = imuldiv28(db[0], dc[3]) + imuldiv28(db[1], dc[4]); // 24db
1463         db[5] = imuldiv28(db[0], dc[4]) + imuldiv28(db[1], dc[5]);
1464         db[6] = imuldiv28(db[0], dc[5]) + imuldiv28(db[1], dc[6]); // 36db
1465         db[7] = imuldiv28(db[0], dc[6]) + imuldiv28(db[1], dc[7]);
1466         db[8] = imuldiv28(db[0], dc[7]) + imuldiv28(db[1], dc[8]); // 48db
1467         *sp = db[8] >> 4; /* 4.28 to 8.24 */
1468 }
1469
1470 static inline void sample_filter_LPF6x16(FILTER_T *dc, FILTER_T *db, DATA_T *sp)
1471 {
1472         db[0] = *sp << 4;
1473         db[1] = imuldiv28(db[0], dc[0]) + imuldiv28(db[1], dc[1]); // 6db
1474         db[2] = imuldiv28(db[0], dc[1]) + imuldiv28(db[1], dc[2]); // 12db
1475         db[3] = imuldiv28(db[0], dc[2]) + imuldiv28(db[1], dc[3]);
1476         db[4] = imuldiv28(db[0], dc[3]) + imuldiv28(db[1], dc[4]); // 24db
1477         db[5] = imuldiv28(db[0], dc[4]) + imuldiv28(db[1], dc[5]);
1478         db[6] = imuldiv28(db[0], dc[5]) + imuldiv28(db[1], dc[6]); // 36db
1479         db[7] = imuldiv28(db[0], dc[6]) + imuldiv28(db[1], dc[7]);
1480         db[8] = imuldiv28(db[0], dc[7]) + imuldiv28(db[1], dc[8]); // 48db
1481         db[9] = imuldiv28(db[0], dc[8]) + imuldiv28(db[1], dc[9]);
1482         db[10] = imuldiv28(db[0], dc[9]) + imuldiv28(db[1], dc[10]); // 60db
1483         db[11] = imuldiv28(db[0], dc[10]) + imuldiv28(db[1], dc[11]);
1484         db[12] = imuldiv28(db[0], dc[11]) + imuldiv28(db[1], dc[12]); // 72db
1485         db[13] = imuldiv28(db[0], dc[12]) + imuldiv28(db[1], dc[13]);
1486         db[14] = imuldiv28(db[0], dc[13]) + imuldiv28(db[1], dc[14]); // 84db
1487         db[15] = imuldiv28(db[0], dc[14]) + imuldiv28(db[1], dc[15]);
1488         db[16] = imuldiv28(db[0], dc[15]) + imuldiv28(db[1], dc[16]); // 96db
1489         *sp = db[16] >> 4; /* 4.28 to 8.24 */
1490 }
1491
1492 // antialias
1493 static inline void sample_filter_LPF_FIR(FILTER_T *dc, FILTER_T *db, DATA_T *sp)
1494 {
1495     int32 sum = 0;
1496         int i;
1497         for (i = 0; i < LPF_FIR_ORDER ;i++)
1498                 sum += imuldiv24(db[i], dc[i]); 
1499         for (i = LPF_FIR_ORDER - 2; i >= 0; i--)
1500                 db[i + 1] = db[i];
1501         db[0] = *sp;    
1502         *sp = sum;
1503 }
1504
1505 static void designfir(FLOAT_T *g , FLOAT_T fc, FLOAT_T att);
1506
1507 static inline void recalc_filter_LPF_FIR(FilterCoefficients *fc)
1508 {
1509         FILTER_T *dc = fc->dc;  
1510     FLOAT_T fir_coef[LPF_FIR_ORDER2];
1511         FLOAT_T f;
1512         int i;
1513
1514         if(FLT_FREQ_MARGIN){
1515                 CALC_MARGIN_VAL
1516                 CALC_FREQ_MARGIN
1517                 f = fc->freq * fc->div_flt_rate * 2.0;
1518                 designfir(fir_coef, f, 40.0);
1519                 for (i = 0; i < LPF_FIR_ORDER2; i++)
1520                         dc[LPF_FIR_ORDER-1 - i] = dc[i] = TIM_FSCALE(fir_coef[LPF_FIR_ORDER2 - 1 - i], 24);
1521         }
1522 }
1523
1524 // shelving \8b¤\92Ê 
1525 static inline void sample_filter_shelving(FILTER_T *dc, FILTER_T *db, DATA_T *sp)
1526 {
1527         db[0] = *sp;
1528         db[2] = imuldiv28(db[0], dc[0])
1529               + imuldiv28(db[1], dc[1])
1530               + imuldiv28(db[2], dc[2])
1531               + imuldiv28(db[3], dc[3])
1532               + imuldiv28(db[4], dc[4]);
1533         db[4] = db[3];
1534         db[3] = db[2];
1535         db[2] = db[1];
1536         db[1] = db[0];
1537         *sp = imuldiv28(db[3], dc[6]); /* 4.28 to 8.24 */ // spgain
1538 }
1539
1540 static inline void recalc_filter_shelving_low(FilterCoefficients *fc)
1541 {
1542         FILTER_T *dc = fc->dc;
1543         FLOAT_T a0, a1, a2, b1, b2, b0, omega, sn, cs, A, beta;
1544
1545         if(fc->freq != fc->last_freq || fc->reso_dB != fc->last_reso_dB || fc->q != fc->last_q){
1546                 fc->last_freq = fc->freq;       
1547                 fc->last_reso_dB = fc->reso_dB; 
1548                 fc->last_q = fc->q;                     
1549                 A = pow(10.0, fc->reso_dB * DIV_40 * ext_filter_shelving_gain);
1550                 dc[6] = TIM_FSCALE(pow(10.0, -(fc->reso_dB) * DIV_80 * ext_filter_shelving_reduce), 28); // spgain
1551                 omega = (FLOAT_T)2.0 * M_PI * fc->freq * fc->div_flt_rate;
1552                 sn = sin(omega);
1553                 cs = cos(omega);
1554                 beta = sqrt(A) / (fc->q * ext_filter_shelving_q); // q > 0
1555                 a0 = 1.0 / ((A + 1) + (A - 1) * cs + beta * sn);
1556                 a1 = 2.0 * ((A - 1) + (A + 1) * cs);
1557                 a2 = -((A + 1) + (A - 1) * cs - beta * sn);
1558                 b0 = A * ((A + 1) - (A - 1) * cs + beta * sn);
1559                 b1 = 2.0 * A * ((A - 1) - (A + 1) * cs);
1560                 b2 = A * ((A + 1) - (A - 1) * cs - beta * sn);
1561                 dc[4] = TIM_FSCALE(a2* a0, 28);
1562                 dc[3] = TIM_FSCALE(a1* a0, 28);
1563                 dc[2] = TIM_FSCALE(b2* a0, 28);
1564                 dc[1] = TIM_FSCALE(b1* a0, 28);
1565                 dc[0] = TIM_FSCALE(b0* a0, 28);
1566         }
1567 }
1568
1569 static inline void recalc_filter_shelving_hi(FilterCoefficients *fc)
1570 {
1571         FILTER_T *dc = fc->dc;
1572         FLOAT_T a0, a1, a2, b1, b2, b0, omega, sn, cs, A, beta;
1573
1574         if(fc->freq != fc->last_freq || fc->reso_dB != fc->last_reso_dB || fc->q != fc->last_q){
1575                 fc->last_freq = fc->freq;       
1576                 fc->last_reso_dB = fc->reso_dB; 
1577                 fc->last_q = fc->q;                     
1578                 A = pow(10.0, fc->reso_dB * DIV_40 * ext_filter_shelving_gain);
1579                 dc[6] = TIM_FSCALE(pow(10.0, -(fc->reso_dB) * DIV_80 * ext_filter_shelving_reduce), 28); // spgain
1580                 omega = (FLOAT_T)2.0 * M_PI * fc->freq * fc->div_flt_rate;
1581                 sn = sin(omega);
1582                 cs = cos(omega);
1583                 beta = sqrt(A) / (fc->q * ext_filter_shelving_q); // q > 0
1584                 a0 = 1.0 / ((A + 1) - (A - 1) * cs + beta * sn);
1585                 a1 = (-2.0 * ((A - 1) - (A + 1) * cs));
1586                 a2 = -((A + 1) - (A - 1) * cs - beta * sn);
1587                 b0 = A * ((A + 1) + (A - 1) * cs + beta * sn);
1588                 b1 = -2.0 * A * ((A - 1) + (A + 1) * cs);
1589                 b2 = A * ((A + 1) + (A - 1) * cs - beta * sn);
1590                 dc[4] = TIM_FSCALE(a2* a0, 28);
1591                 dc[3] = TIM_FSCALE(a1* a0, 28);
1592                 dc[2] = TIM_FSCALE(b2* a0, 28);
1593                 dc[1] = TIM_FSCALE(b1* a0, 28);
1594                 dc[0] = TIM_FSCALE(b0* a0, 28);
1595         }
1596 }
1597
1598 // peaking \8b¤\92Ê 
1599 static inline void sample_filter_peaking(FILTER_T *dc, FILTER_T *db, DATA_T *sp)
1600 {
1601         db[0] = *sp;
1602         db[2] = imuldiv28(db[0], dc[0])
1603               + imuldiv28(db[1], dc[1])
1604               + imuldiv28(db[2], dc[2])
1605               - imuldiv28(db[3], dc[3])
1606               - imuldiv28(db[4], dc[4]);
1607         db[4] = db[3];
1608         db[3] = db[2];
1609         db[2] = db[1];
1610         db[1] = db[0];
1611         *sp = imuldiv28(db[3], dc[6]); // spgain
1612 }
1613
1614 static inline void recalc_filter_peaking(FilterCoefficients *fc)
1615 {
1616         FILTER_T *dc = fc->dc;
1617         FLOAT_T a0, a1, a2, b1, b2, b0, omega, sn, cs, A, beta;
1618
1619         if(fc->freq != fc->last_freq || fc->reso_dB != fc->last_reso_dB || fc->q != fc->last_q){
1620                 fc->last_freq = fc->freq;       
1621                 fc->last_reso_dB = fc->reso_dB; 
1622                 fc->last_q = fc->q;                     
1623                 A = pow(10.0, fc->reso_dB * DIV_40 * ext_filter_peaking_gain);
1624                 dc[6] = TIM_FSCALE(pow(10.0, -(fc->reso_dB) * DIV_80 * ext_filter_peaking_reduce), 28); // spgain
1625                 omega = (FLOAT_T)2.0 * M_PI * fc->freq * fc->div_flt_rate;
1626                 sn = sin(omega);
1627                 cs = cos(omega);
1628                 beta = sn / (2.0 * fc->q * ext_filter_peaking_q); // q > 0
1629                 a0 = 1.0 / (1.0 + beta / A);
1630                 a1 = -2.0 * cs;
1631                 a2 = 1.0 - beta / A;
1632                 b0 = 1.0 + beta * A;
1633                 b2 = 1.0 - beta * A;
1634                 a2 *= a0;
1635                 a1 *= a0;
1636                 b2 *= a0;
1637                 b0 *= a0;               
1638                 dc[4] = TIM_FSCALE(a2, 28);
1639                 dc[3] = TIM_FSCALE(a1, 28);
1640                 dc[2] = TIM_FSCALE(b2, 28);
1641                 dc[1] = TIM_FSCALE(a1, 28); // b1 = a1
1642                 dc[0] = TIM_FSCALE(b0, 28);
1643         }
1644 }
1645
1646 // biquad \8b¤\92Ê 
1647 static inline void sample_filter_biquad(FILTER_T *dc, FILTER_T *db, DATA_T *sp)
1648 {
1649         // input
1650         DATA_T input = *sp << 4, r;
1651
1652         r = imuldiv28(db[1], dc[1])
1653                 + imuldiv28(*sp + db[2], dc[2])
1654                 - imuldiv28(db[3], dc[3])
1655                 - imuldiv28(db[4], dc[4]); // -dc3 -dc4 
1656         db[2] = r;
1657         db[4] = db[3];
1658         db[3] = db[2];
1659         db[2] = db[1];
1660         db[1] = input;
1661         *sp = r >> 4; /* 4.28 to 8.24 */
1662 }
1663
1664 static inline void recalc_filter_biquad_low(FilterCoefficients *fc)
1665 {
1666         FILTER_T *dc = fc->dc;
1667         FLOAT_T a0, a1, a2, b1, b2, b0, omega, sn, cs, alpha;
1668
1669         if(fc->freq != fc->last_freq || fc->q != fc->last_q){
1670                 fc->last_freq = fc->freq;       
1671                 fc->last_reso_dB = fc->reso_dB; 
1672                 fc->last_q = fc->q;                     
1673                 omega = 2.0 * M_PI * fc->freq * fc->div_flt_rate;
1674                 sn = sin(omega);
1675                 cs = cos(omega);
1676                 alpha = sn / (2.0 * fc->q); // q > 0
1677                 a0 = 1.0 / (1.0 + alpha);
1678                 dc[1] = TIM_FSCALE((1.0 - cs) * a0, 28);
1679                 dc[2] = dc[0] = TIM_FSCALE(((1.0 - cs) * DIV_2) * a0, 28);
1680                 dc[3] = TIM_FSCALE((-2.0 * cs) * a0, 28);
1681                 dc[4] = TIM_FSCALE((1.0 - alpha) * a0, 28);
1682                 //b2 = ((1.0 - cs) * DIV_2) * a0;
1683                 //b1 = (1.0 - cs) * a0;
1684                 //a1 = (-2.0 * cs) * a0;
1685                 //a2 = (1.0 - alpha) * a0;
1686                 //dc[0] = TIM_FSCALE(b2, 28);
1687                 //dc[1] = TIM_FSCALE(b1, 28);
1688                 //dc[2] = TIM_FSCALE(a1, 28);
1689                 //dc[3] = TIM_FSCALE(a2, 28);
1690         }
1691 }
1692
1693 static inline void recalc_filter_biquad_hi(FilterCoefficients *fc)
1694 {
1695         FILTER_T *dc = fc->dc;
1696         FLOAT_T a0, a1, a2, b1, b2, b0, omega, sn, cs, alpha;
1697
1698         if(fc->freq != fc->last_freq || fc->q != fc->last_q){
1699                 fc->last_freq = fc->freq;       
1700                 fc->last_reso_dB = fc->reso_dB; 
1701                 fc->last_q = fc->q;                     
1702                 omega = 2.0 * M_PI * fc->freq * fc->div_flt_rate;
1703                 sn = sin(omega);
1704                 cs = cos(omega);
1705                 alpha = sn / (2.0 * fc->q); // q > 0
1706                 a0 = 1.0 / (1.0 + alpha);
1707                 dc[1] = TIM_FSCALE((-(1.0 + cs)) * a0, 28);
1708                 dc[2] = dc[0] = TIM_FSCALE(((1.0 + cs) * DIV_2) * a0, 28);
1709                 dc[3] = TIM_FSCALE((-2.0 * cs) * a0, 28);
1710                 dc[4] = TIM_FSCALE((1.0 - alpha) * a0, 28);
1711                 //b2 = ((1.0 + cs) * DIV_2) * a0;
1712                 //b1 = (-(1.0 + cs)) * a0;
1713                 //a1 = (-2.0 * cs) * a0;
1714                 //a2 = (1.0 - alpha) * a0;
1715                 //dc[0] = TIM_FSCALE(b2, 28);
1716                 //dc[1] = TIM_FSCALE(b1, 28);
1717                 //dc[2] = TIM_FSCALE(a1, 28);
1718                 //dc[3] = TIM_FSCALE(a2, 28);
1719         }
1720 }
1721
1722 #else /* floating-point implementation */
1723
1724 #ifdef USE_PENTIUM_4
1725 #define DENORMAL_FIX 1 // for pentium 4 float/double denormal fix
1726 #define DENORMAL_ADD (5.4210108624275221703311375920553e-20) // 1.0/(1<<64)
1727 const FLOAT_T denormal_add = DENORMAL_ADD; // 1.0/(1<<64)
1728
1729 #if (USE_X86_EXT_INTRIN >= 3) && defined(FLOAT_T_DOUBLE)
1730 const __m128d vec_denormal_add = {DENORMAL_ADD, DENORMAL_ADD};
1731 #elif (USE_X86_EXT_INTRIN >= 2) && defined(FLOAT_T_FLOAT)
1732 const __m128 vec_denormal_add = {DENORMAL_ADD, DENORMAL_ADD, DENORMAL_ADD, DENORMAL_ADD};
1733 #endif // USE_X86_EXT_INTRIN
1734
1735 #endif // USE_PENTIUM_4
1736
1737
1738 static inline void sample_filter_none(FILTER_T *dc, FILTER_T *db, DATA_T *sp){}
1739
1740 static inline void recalc_filter_none(FilterCoefficients *fc){}
1741
1742 static inline void sample_filter_LPF12(FILTER_T *dc, FILTER_T *db, DATA_T *sp)
1743 {
1744         db[0] = db[0] + db[2] * dc[0];
1745         db[1] = *sp - db[0] - db[2] * dc[1];
1746         db[2] = db[1] * dc[0] + db[2];
1747         *sp = db[0];
1748 }
1749
1750 static inline void sample_filter_LPF12_ov2(FILTER_T *dc, FILTER_T *db, DATA_T *sp)
1751 {
1752         FILTER_T input = *sp;
1753         
1754         db[0] = db[0] + db[2] * dc[0];
1755         db[1] = input - db[0] - db[2] * dc[1];
1756         db[2] = db[1] * dc[0] + db[2];
1757         *sp = db[0];
1758         // ov2
1759         db[0] = db[0] + db[2] * dc[0];
1760         db[1] = input - db[0] - db[2] * dc[1];
1761         db[2] = db[1] * dc[0] + db[2];
1762 }
1763
1764 static inline void sample_filter_LPF12_ov3(FILTER_T *dc, FILTER_T *db, DATA_T *sp)
1765 {
1766         FILTER_T input = *sp;
1767         
1768         db[0] = db[0] + db[2] * dc[0];
1769         db[1] = input - db[0] - db[2] * dc[1];
1770         db[2] = db[1] * dc[0] + db[2];
1771         *sp = db[0];
1772         // ov2
1773         db[0] = db[0] + db[2] * dc[0];
1774         db[1] = input - db[0] - db[2] * dc[1];
1775         db[2] = db[1] * dc[0] + db[2];
1776         // ov3
1777         db[0] = db[0] + db[2] * dc[0];
1778         db[1] = input - db[0] - db[2] * dc[1];
1779         db[2] = db[1] * dc[0] + db[2];
1780 }
1781
1782 static inline void recalc_filter_LPF12(FilterCoefficients *fc)
1783 {
1784         FILTER_T *dc = fc->dc;
1785
1786 /* copy with applying Chamberlin's lowpass filter. */
1787         if(FLT_FREQ_MARGIN || FLT_RESO_MARGIN){
1788                 CALC_MARGIN_VAL
1789                 CALC_FREQ_MARGIN
1790                 CALC_RESO_MARGIN
1791                 if(fc->freq < fc->flt_rate_limit1){ // <sr*DIV_6
1792                         fc->sample_filter = sample_filter_LPF12;
1793                         dc[0] = 2.0 * sin(M_PI * fc->freq * fc->div_flt_rate); // *1.0
1794                 }else if(fc->freq < fc->flt_rate_limit2){ // <sr*2*DIV_6
1795                         fc->sample_filter = sample_filter_LPF12_ov2;
1796                         dc[0] = 2.0 * sin(M_PI * fc->freq * fc->div_flt_rate_ov2); // sr*2
1797                 }else{ // <sr*3*DIV_6
1798                         fc->sample_filter = sample_filter_LPF12_ov3;
1799                         dc[0] = 2.0 * sin(M_PI * fc->freq * fc->div_flt_rate_ov3); // sr*3
1800                 }
1801                 dc[1] = RESO_DB_CF_M(fc->reso_dB);
1802         }
1803 }
1804
1805 static inline void sample_filter_LPF24(FILTER_T *dc, FILTER_T *db, DATA_T *sp)
1806 {
1807         FILTER_T da[6];
1808
1809         da[0] = *sp - dc[2] * db[4];    /* feedback */
1810         da[1] = db[1];
1811         da[2] = db[2];
1812         da[3] = db[3];
1813         db[1] = (db[0] + da[0]) * dc[0] - db[1] * dc[1];
1814         db[2] = (db[1] + da[1]) * dc[0] - db[2] * dc[1];
1815         db[3] = (db[2] + da[2]) * dc[0] - db[3] * dc[1];
1816         db[4] = (db[3] + da[3]) * dc[0] - db[4] * dc[1];
1817         db[0] = da[0];
1818         *sp = db[4];
1819 }
1820
1821 static inline void recalc_filter_LPF24(FilterCoefficients *fc)
1822 {
1823         FILTER_T *dc = fc->dc, f, q ,p, r;
1824
1825 /* copy with applying Moog lowpass VCF. */
1826         if(FLT_FREQ_MARGIN || FLT_RESO_MARGIN){
1827                 CALC_MARGIN_VAL
1828                 CALC_FREQ_MARGIN
1829                 CALC_RESO_MARGIN
1830                 f = 2.0 * fc->freq * fc->div_flt_rate;
1831                 p = 1.0 - f;
1832                 q = 0.80 * (1.0 - RESO_DB_CF_M(fc->reso_dB)); // 0.0f <= c < 0.80f
1833                 dc[0] = f + 0.8 * f * p;
1834                 dc[1] = dc[0] + dc[0] - 1.0;
1835                 dc[2] = q * (1.0 + 0.5 * p * (1.0 - p + 5.6 * p * p));
1836         }
1837 }
1838
1839 static inline void sample_filter_LPF_BW(FILTER_T *dc, FILTER_T *db, DATA_T *sp)
1840 {
1841         // input
1842         db[0] = *sp;    
1843         // LPF
1844         db[2] = dc[0] * db[0] + dc[1] * db[1] + dc[2] * db[2] + dc[3] * db[3] + dc[4] * db[4];
1845 #if defined(DENORMAL_FIX)
1846         db[2] += denormal_add;
1847 #endif  
1848         db[4] = db[3];
1849         db[3] = db[2]; // flt out
1850         db[2] = db[1];
1851         db[1] = db[0]; // flt in
1852         // output
1853         *sp = db[3];
1854
1855
1856 static inline void recalc_filter_LPF_BW(FilterCoefficients *fc)
1857 {
1858         FILTER_T *dc = fc->dc;
1859         double q ,p, p2, qp, dc0;
1860
1861 // elion butterworth
1862         if(FLT_FREQ_MARGIN || FLT_RESO_MARGIN){
1863                 CALC_MARGIN_VAL
1864                 CALC_FREQ_MARGIN
1865                 CALC_RESO_MARGIN
1866                 p = 1.0 / tan(M_PI * fc->freq * (double)fc->div_flt_rate); // ?
1867                 q = RESO_DB_CF_M(fc->reso_dB) * SQRT_2; // q>0.1
1868                 p2 = p * p;
1869                 qp = q * p;
1870                 dc0 = 1.0 / ( 1.0 + qp + p2);
1871                 dc[0] = dc0;
1872                 dc[1] = 2.0 * dc0;
1873                 dc[2] = dc0;
1874                 dc[3] = -2.0 * ( 1.0 - p2) * dc0; // -
1875                 dc[4] = -(1.0 - qp + p2) * dc0; // -
1876         }
1877 }
1878
1879 static inline void sample_filter_LPF12_2(FILTER_T *dc, FILTER_T *db, DATA_T *sp)
1880 {
1881         db[1] += (*sp - db[0]) * dc[1];
1882         db[0] += db[1];
1883         db[1] *= dc[0];
1884         *sp = db[0];
1885 }
1886
1887 static inline void recalc_filter_LPF12_2(FilterCoefficients *fc)
1888 {
1889         FILTER_T *dc = fc->dc;
1890         FLOAT_T f, q ,p, r;
1891         FLOAT_T c0, c1, a0, b1, b2;
1892
1893 // Resonant IIR lowpass (12dB/oct) Olli Niemitalo //r
1894         if(FLT_FREQ_MARGIN || FLT_RESO_MARGIN){
1895                 CALC_MARGIN_VAL
1896                 CALC_FREQ_MARGIN
1897                 CALC_RESO_MARGIN
1898                 f = M_PI2 * fc->freq * fc->div_flt_rate;
1899                 q = 1.0 - f / (2.0 * (RESO_DB_CF_P(fc->reso_dB) + 0.5 / (1.0 + f)) + f - 2.0);
1900                 
1901                 c0 = q * q;
1902                 c1 = c0 + 1.0 - 2.0 * cos(f) * q;
1903                 dc[0] = c0;
1904                 dc[1] = c1;
1905 #if (USE_X86_EXT_INTRIN >= 3) && defined(DATA_T_DOUBLE) && defined(FLOAT_T_DOUBLE)
1906                 a0 = c1;
1907                 b1 = 1 + c0 - c1;
1908                 b2 = -c0;
1909                 dc[2] = a0;
1910                 dc[3] = a0 * b1;
1911                 dc[4] = 0;
1912                 dc[5] = a0;
1913                 dc[6] = b2;
1914                 dc[7] = b2 * b1;
1915                 dc[8] = b1;
1916                 dc[9] = b1 * b1 + b2;
1917 #endif
1918         }
1919 }
1920
1921 #if (USE_X86_EXT_INTRIN >= 8) && defined(DATA_T_DOUBLE) && defined(FLOAT_T_DOUBLE)
1922 // SIMD optimization (double * 2)
1923 static inline void buffer_filter_LPF12_2(FILTER_T* dc, FILTER_T* db, DATA_T* sp, int32 count)
1924 {
1925         int32 i;
1926         __m256d vcx0 = _mm256_broadcast_pd((__m128d *)(dc + 2));
1927         __m256d vcx1 = _mm256_broadcast_pd((__m128d *)(dc + 4));
1928         __m128d vcym2 = _mm_loadu_pd(dc + 6);
1929         __m128d vcym1 = _mm_loadu_pd(dc + 8);
1930         __m128d vy = _mm_loadu_pd(db + 2);
1931         __m128d vym2 = _mm_unpacklo_pd(vy, vy);
1932         __m128d vym1 = _mm_unpackhi_pd(vy, vy);
1933
1934         for (i = 0; i < count; i += 4)
1935         {
1936                 __m256d vin = _mm256_loadu_pd(sp + i);
1937                 __m256d vx0 = _mm256_unpacklo_pd(vin, vin);
1938                 __m256d vx1 = _mm256_unpackhi_pd(vin, vin);
1939                 __m256d vfma2x = MM256_FMA2_PD(vcx0, vx0, vcx1, vx1);
1940
1941                 __m128d vy0 = _mm_add_pd(_mm256_castpd256_pd128(vfma2x), MM_FMA2_PD(vcym2, vym2, vcym1, vym1));
1942                 _mm_storeu_pd(sp + i, vy0);
1943                 vym2 = _mm_unpacklo_pd(vy0, vy0);
1944                 vym1 = _mm_unpackhi_pd(vy0, vy0);
1945
1946                 __m128d vy1 = _mm_add_pd(_mm256_extractf128_pd(vfma2x, 1), MM_FMA2_PD(vcym2, vym2, vcym1, vym1));
1947                 _mm_storeu_pd(sp + i + 2, vy1);
1948                 vym2 = _mm_unpacklo_pd(vy1, vy1);
1949                 vym1 = _mm_unpackhi_pd(vy1, vy1);
1950                 vy = vy1;
1951         }
1952
1953         _mm_storeu_pd(db + 2, vy);
1954 }
1955
1956 #elif (USE_X86_EXT_INTRIN >= 3) && defined(DATA_T_DOUBLE) && defined(FLOAT_T_DOUBLE)
1957 // SIMD optimization (double * 2)
1958 static inline void buffer_filter_LPF12_2(FILTER_T *dc, FILTER_T *db, DATA_T *sp, int32 count)
1959 {
1960         int32 i;
1961         __m128d vcx0 = _mm_loadu_pd(dc + 2);
1962         __m128d vcx1 = _mm_loadu_pd(dc + 4);
1963         __m128d vcym2 = _mm_loadu_pd(dc + 6);
1964         __m128d vcym1 = _mm_loadu_pd(dc + 8);
1965         __m128d vy = _mm_loadu_pd(db + 2);
1966         __m128d vym2 = _mm_unpacklo_pd(vy, vy);
1967         __m128d vym1 = _mm_unpackhi_pd(vy, vy);
1968
1969         for (i = 0; i < count; i += 2) {
1970                 __m128d vin = _mm_loadu_pd(sp + i);
1971                 __m128d vx0 = _mm_unpacklo_pd(vin, vin);
1972                 __m128d vx1 = _mm_unpackhi_pd(vin, vin);
1973                 vy = MM_FMA4_PD(vcx0, vx0,  vcx1, vx1,  vcym2, vym2,  vcym1, vym1);
1974                 _mm_storeu_pd(sp + i, vy);
1975                 vym2 = _mm_unpacklo_pd(vy, vy);
1976                 vym1 = _mm_unpackhi_pd(vy, vy);
1977         }
1978         _mm_storeu_pd(db + 2, vy);
1979 }
1980
1981 #else // scalar
1982 static inline void buffer_filter_LPF12_2(FILTER_T *dc, FILTER_T *db, DATA_T *sp, int32 count)
1983 {
1984         int32 i;
1985         FILTER_T db0 = db[0], db1 = db[1], dc0 = dc[0], dc1 = dc[1];
1986
1987         for (i = 0; i < count; i++) {
1988                 db1 += (sp[i] - db0) * dc1;
1989                 db0 += db1;
1990                 sp[i] = db0;
1991                 db1 *= dc0;
1992         }
1993         db[0] = db0;
1994         db[1] = db1;
1995 }
1996
1997 #endif // (USE_X86_EXT_INTRIN >= 3) && defined(DATA_T_DOUBLE) && defined(FLOAT_T_DOUBLE)
1998
1999 static inline void sample_filter_LPF24_2(FILTER_T *dc, FILTER_T *db, DATA_T *sp)
2000 {
2001         db[0] = *sp;
2002         db[5] = dc[0] * db[0] + db[1];
2003         db[1] = dc[1] * db[0] + dc[3] * db[5] + db[2];
2004         db[2] = dc[2] * db[0] + dc[4] * db[5];
2005         db[0] = db[5];
2006         db[5] = dc[0] * db[0] + db[3];
2007         db[3] = dc[1] * db[0] + dc[3] * db[5] + db[4];
2008         db[4] = dc[2] * db[0] + dc[4] * db[5];
2009         *sp = db[0];
2010 }
2011
2012 static inline void recalc_filter_LPF24_2(FilterCoefficients *fc)
2013 {
2014         FILTER_T *dc = fc->dc, f, q ,p, r, dc0;
2015
2016 // amSynth 24dB/ocatave resonant low-pass filter. Nick Dowell //r
2017         if(FLT_FREQ_MARGIN || FLT_RESO_MARGIN){
2018                 CALC_MARGIN_VAL
2019                 CALC_FREQ_MARGIN
2020                 CALC_RESO_MARGIN
2021                 f = tan(M_PI * fc->freq * fc->div_flt_rate); // cutoff freq rate/2
2022                 q = 2.0 * RESO_DB_CF_M(fc->reso_dB);
2023                 r = f * f;
2024                 p = 1.0 / (1.0 + (q * f) + r);
2025                 dc0 = r * p;
2026                 dc[0] = dc0;
2027                 dc[1] = dc0 * 2;
2028                 dc[2] = dc0;
2029                 dc[3] = -2.0 * (r - 1) * p;
2030                 dc[4] = (-1.0 + (q * f) - r) * p;
2031         }
2032 }
2033
2034 static inline void sample_filter_LPF6(FILTER_T *dc, FILTER_T *db, DATA_T *sp)
2035 {
2036         *sp = (db[1] = dc[0] * *sp + dc[1] * db[1]);
2037 #if defined(DENORMAL_FIX)
2038         db[1] += denormal_add;
2039 #endif  
2040 }
2041
2042 static inline void recalc_filter_LPF6(FilterCoefficients *fc)
2043 {
2044         FILTER_T *dc = fc->dc, f;
2045
2046 // One pole filter, LP 6dB/Oct scoofy no resonance //r
2047         if(FLT_FREQ_MARGIN){
2048                 CALC_MARGIN_VAL
2049                 CALC_FREQ_MARGIN
2050                 f = exp(-M_PI2 * fc->freq * fc->div_flt_rate);
2051                 dc[0] = 1.0 - f;
2052                 dc[1] = f;
2053         }
2054 }
2055
2056 static inline void sample_filter_LPF18(FILTER_T *dc, FILTER_T *db, DATA_T *sp)
2057 {
2058         FILTER_T da[6];
2059
2060         da[0] = db[0];
2061         da[1] = db[1];
2062         da[2] = db[2];
2063         db[0] = *sp - dc[2] * db[3];
2064         db[1] = dc[1] * (db[0] + da[0]) - dc[0] * db[1];
2065         db[2] = dc[1] * (db[1] + da[1]) - dc[0] * db[2];
2066         db[3] = dc[1] * (db[2] + da[2]) - dc[0] * db[3];
2067         *sp = db[3] * dc[3];
2068 }
2069
2070 static inline void sample_filter_LPF18_ov2(FILTER_T *dc, FILTER_T *db, DATA_T *sp)
2071 {
2072         FILTER_T da[6], input = *sp;
2073
2074         da[0] = db[0];
2075         da[1] = db[1];
2076         da[2] = db[2];
2077         db[0] = input - dc[2] * db[3];
2078         db[1] = dc[1] * (db[0] + da[0]) - dc[0] * db[1];
2079         db[2] = dc[1] * (db[1] + da[1]) - dc[0] * db[2];
2080         db[3] = dc[1] * (db[2] + da[2]) - dc[0] * db[3];
2081         *sp = db[3] * dc[3];
2082         // ov2
2083         da[0] = db[0];
2084         da[1] = db[1];
2085         da[2] = db[2];
2086         db[0] = input - dc[2] * db[3];
2087         db[1] = dc[1] * (db[0] + da[0]) - dc[0] * db[1];
2088         db[2] = dc[1] * (db[1] + da[1]) - dc[0] * db[2];
2089         db[3] = dc[1] * (db[2] + da[2]) - dc[0] * db[3];
2090 }
2091
2092 static inline void recalc_filter_LPF18(FilterCoefficients *fc)
2093 {
2094         FILTER_T *dc = fc->dc, f, q , p;
2095 // LPF18 low-pass filter //r
2096         if(FLT_FREQ_MARGIN || FLT_RESO_MARGIN){
2097                 CALC_MARGIN_VAL
2098                 CALC_FREQ_MARGIN
2099                 CALC_RESO_MARGIN
2100                 if(fc->freq < fc->flt_rate_limit1){ // <sr/2.25
2101                         fc->sample_filter = sample_filter_LPF18;
2102                         f = 2.0 * fc->freq * fc->div_flt_rate; // *1.0
2103                 }else{ // <sr*2/2.25
2104                         fc->sample_filter = sample_filter_LPF18_ov2;
2105                         f = 2.0 * fc->freq * fc->div_flt_rate_ov2; // sr*2
2106                 }
2107                 dc[0] = ((-2.7528 * f + 3.0429) * f + 1.718) * f - 0.9984;
2108                 q = 0.789 * (1.0 - RESO_DB_CF_M(fc->reso_dB)); // 0<q<0.78125
2109                 p = dc[0] + 1.0;
2110                 dc[1] = 0.5 * p;
2111                 dc[2] = q * (((-2.7079 * p + 10.963) * p - 14.934) * p + 8.4974);
2112                 dc[3] = 1.0 + (0.25 * (1.5 + 2.0 * dc[2] * (1.0 - f)));
2113         }
2114 }
2115
2116 static inline void sample_filter_LPF_TFO(FILTER_T *dc, FILTER_T *db, DATA_T *sp)
2117 {
2118         db[0] = db[0] + dc[0] * (*sp - db[0] + dc[1] * (db[0] - db[1]));
2119         db[1] = db[1] + dc[0] * (db[0] - db[1]);
2120         *sp = db[1];
2121 }
2122
2123 static inline void recalc_filter_LPF_TFO(FilterCoefficients *fc)
2124 {
2125         FILTER_T *dc = fc->dc, q;
2126
2127 // two first order low-pass filter //r
2128         if(FLT_FREQ_MARGIN || FLT_RESO_MARGIN){
2129                 CALC_MARGIN_VAL
2130                 CALC_FREQ_MARGIN
2131                 CALC_RESO_MARGIN
2132                 dc[0] = 2 * fc->freq * fc->div_flt_rate;
2133                 q = 1.0 - RESO_DB_CF_M(fc->reso_dB);
2134                 dc[1] = q + q / (1.01 - dc[0]);
2135         }
2136 }
2137
2138 static inline void sample_filter_HPF_BW(FILTER_T *dc, FILTER_T *db, DATA_T *sp)
2139 {
2140         // input
2141         db[0] = *sp;    
2142         // LPF
2143         db[2] = dc[0] * db[0] + dc[1] * db[1] + dc[2] * db[2] + dc[3] * db[3] + dc[4] * db[4];
2144 #if defined(DENORMAL_FIX)
2145         db[2] += denormal_add;
2146 #endif  
2147         db[4] = db[3];
2148         db[3] = db[2]; // flt out
2149         db[2] = db[1];
2150         db[1] = db[0]; // flt in
2151         // output
2152         *sp = db[3];
2153 }
2154
2155 static inline void recalc_filter_HPF_BW(FilterCoefficients *fc)
2156 {
2157         FILTER_T *dc = fc->dc;
2158         double q, p, p2, qp, dc0;
2159
2160 // elion butterworth HPF //r
2161         if(FLT_FREQ_MARGIN || FLT_RESO_MARGIN){
2162                 CALC_MARGIN_VAL
2163                 CALC_FREQ_MARGIN
2164                 CALC_RESO_MARGIN
2165                 q = RESO_DB_CF_M(fc->reso_dB) * SQRT_2; // q>0.1
2166                 p = tan(M_PI * fc->freq * fc->div_flt_rate); // hpf ?           
2167                 p2 = p * p;
2168                 qp = q * p;
2169                 dc0 = 1.0 / (1.0 + qp + p2);
2170                 dc[0] = dc0;
2171                 dc[1] = -2 * dc0; // hpf
2172                 dc[2] = dc0;
2173                 dc[3] = -2.0 * (p2 - 1.0) * dc0; // hpf
2174                 dc[4] = -(1.0 - qp + p2) * dc0;         
2175         }
2176 }
2177
2178 static inline void sample_filter_BPF_BW(FILTER_T *dc, FILTER_T *db, DATA_T *sp)
2179 {
2180         // input
2181         db[0] = *sp;    
2182         // LPF
2183         db[2] = dc[0] * db[0] + dc[1] * db[1] + dc[2] * db[2] + dc[3] * db[3] + dc[4] * db[4];
2184         // HPF
2185         db[10] = dc[8] * db[8] + dc[9] * db[9] + dc[10] * db[10] + dc[11] * db[11] + dc[12] * db[12];   
2186 #if defined(DENORMAL_FIX)
2187         db[2] += denormal_add;
2188 #endif  
2189         // HPF
2190         db[12] = db[11];
2191         db[11] = db[10]; // flt out
2192         db[10] = db[9];
2193         db[9] = db[8]; // flt in
2194         // con  
2195         db[8] = db[4]; // db[4]\82©\82çdb[8]\82Ö\82Í\92x\89\84\82µ\82Ä\82à\82¢\82¢
2196         // LPF
2197         db[4] = db[3];
2198         db[3] = db[2]; // flt out
2199         db[2] = db[1];
2200         db[1] = db[0]; // flt in
2201         // output
2202         *sp = db[11];
2203 }
2204
2205 static inline void recalc_filter_BPF_BW(FilterCoefficients *fc)
2206 {
2207         FILTER_T *dc = fc->dc;
2208         FLOAT_T f, q, pl, pl2, qpl, ph, ph2, qph, dc0;
2209         
2210 // elion butterworth
2211         if(FLT_FREQ_MARGIN || FLT_RESO_MARGIN){
2212                 CALC_MARGIN_VAL
2213                 CALC_FREQ_MARGIN
2214                 CALC_RESO_MARGIN
2215                 f = fc->freq * fc->div_flt_rate;
2216                 q = RESO_DB_CF_M(fc->reso_dB) * SQRT_2; // q>0.1
2217                 // LPF
2218                 pl = 1.0 / tan(M_PI * f);
2219                 pl2 = pl * pl;
2220                 qpl = q * pl;
2221                 dc0 = 1.0 / ( 1.0 + qpl + pl2);
2222                 dc[0] = dc0;
2223                 dc[1] = 2.0 * dc0;
2224                 dc[2] = dc0;
2225                 dc[3] = -2.0 * ( 1.0 - pl2) * dc0; // -
2226                 dc[4] = -(1.0 - qpl + pl2) * dc0; // -
2227                 // HPF
2228                 ph = tan(M_PI * f * 0.8); // hpf // f bandwidth = LPF-HPF
2229                 ph2 = ph * ph;
2230                 qph = q * ph;
2231                 dc0 = 1.0 / (1.0 + qph + ph2);
2232                 dc[8] = dc0;
2233                 dc[9] = -2 * dc0; // hpf
2234                 dc[10] = dc0;
2235                 dc[11] = -2.0 * (ph2 - 1.0) * dc0; // hpf
2236                 dc[12] = -(1.0 - qph + ph2) * dc0;
2237         }
2238 }
2239
2240 static inline void sample_filter_peak1(FILTER_T *dc, FILTER_T *db, DATA_T *sp)
2241 {
2242         FILTER_T r;
2243
2244         db[0] = *sp;
2245         r = dc[0] * db[0] + dc[1] * db[1] + dc[2] * db[2];
2246         db[2] = db[1];
2247         db[1] = r;
2248         *sp = r;
2249 }
2250
2251 static inline void recalc_filter_peak1(FilterCoefficients *fc)
2252 {
2253         FILTER_T *dc = fc->dc, f, q, r, pl ,ph, sl, sh;
2254         
2255         if(FLT_FREQ_MARGIN || FLT_RESO_MARGIN){
2256                 CALC_MARGIN_VAL
2257                 CALC_FREQ_MARGIN
2258                 CALC_RESO_MARGIN        
2259                 f = cos(M_PI2 * fc->freq * fc->div_flt_rate);
2260                 r = (1.0 - RESO_DB_CF_M(fc->reso_dB)) * 0.99609375; // r < 0.99609375
2261                 dc[0] = (1 - r) * sqrt(r * (r - 4 * (f * f) + 2.0) + 1.0);
2262                 dc[1] = 2 * f * r;
2263                 dc[2] = -(r * r);
2264         }
2265 }
2266
2267 static inline void sample_filter_notch1(FILTER_T *dc, FILTER_T *db, DATA_T *sp)
2268 {
2269         FILTER_T r;
2270
2271         db[0] = *sp;
2272         r = dc[0] * db[0] + dc[1] * db[1] + dc[2] * db[2];
2273         db[2] = db[1];
2274         db[1] = r;
2275         *sp = db[0] - r; // notch
2276 }
2277
2278 static inline void sample_filter_LPF12_3(FILTER_T *dc, FILTER_T *db, DATA_T *sp)
2279 {
2280         db[0] = db[0] + dc[0] * db[2]; // low
2281         db[1] = dc[1] * *sp - db[0] - dc[1] * db[2]; // high
2282         db[2] = dc[0] * db[1] + db[2]; // band
2283         *sp = db[0]; // db[1] + db[0]; // notch
2284 }
2285
2286 static inline void sample_filter_LPF12_3_ov2(FILTER_T *dc, FILTER_T *db, DATA_T *sp)
2287 {
2288         FILTER_T input = *sp;
2289         
2290         db[0] = db[0] + dc[0] * db[2]; // low
2291         db[1] = dc[1] * input - db[0] - dc[1] * db[2]; // high
2292         db[2] = dc[0] * db[1] + db[2]; // band
2293         *sp = db[0]; // db[1] + db[0]; // notch
2294         // ov2
2295         db[0] = db[0] + dc[0] * db[2]; // low
2296         db[1] = dc[1] * input - db[0] - dc[1] * db[2]; // high
2297         db[2] = dc[0] * db[1] + db[2]; // band
2298 }
2299
2300 static inline void sample_filter_LPF12_3_ov3(FILTER_T *dc, FILTER_T *db, DATA_T *sp)
2301 {
2302         FILTER_T input = *sp;
2303
2304         db[0] = db[0] + dc[0] * db[2]; // low
2305         db[1] = dc[1] * input - db[0] - dc[1] * db[2]; // high
2306         db[2] = dc[0] * db[1] + db[2]; // band
2307         *sp = db[0]; // db[1] + db[0]; // notch
2308         // ov2
2309         db[0] = db[0] + dc[0] * db[2]; // low
2310         db[1] = dc[1] * input - db[0] - dc[1] * db[2]; // high
2311         db[2] = dc[0] * db[1] + db[2]; // band
2312         // ov3
2313         db[0] = db[0] + dc[0] * db[2]; // low
2314         db[1] = dc[1] * input - db[0] - dc[1] * db[2]; // high
2315         db[2] = dc[0] * db[1] + db[2]; // band
2316 }
2317
2318 static inline void recalc_filter_LPF12_3(FilterCoefficients *fc)
2319 {
2320         FILTER_T *dc = fc->dc;
2321
2322 /* Chamberlin2's lowpass filter. */
2323         if(FLT_FREQ_MARGIN || FLT_RESO_MARGIN){
2324                 CALC_MARGIN_VAL
2325                 CALC_FREQ_MARGIN
2326                 CALC_RESO_MARGIN
2327                 if(fc->freq < fc->flt_rate_limit1){ // <sr*0.21875
2328                         fc->sample_filter = sample_filter_LPF12_3;
2329                         dc[0] = 2.0 * sin(M_PI * fc->freq * fc->div_flt_rate); // *1.0
2330                 }else if(fc->freq < fc->flt_rate_limit2){ // <sr*2*0.21875
2331                         fc->sample_filter = sample_filter_LPF12_3_ov2;
2332                         dc[0] = 2.0 * sin(M_PI * fc->freq * fc->div_flt_rate_ov2); // sr*2
2333                 }else{ // <sr*3*0.21875
2334                         fc->sample_filter = sample_filter_LPF12_3_ov3;
2335                         dc[0] = 2.0 * sin(M_PI * fc->freq * fc->div_flt_rate_ov3); // sr*3
2336                 }
2337                 dc[1] = RESO_DB_CF_M(fc->reso_dB);
2338         }
2339 }
2340
2341 static inline void sample_filter_HPF12_3(FILTER_T *dc, FILTER_T *db, DATA_T *sp)
2342 {
2343         db[0] = db[0] + dc[0] * db[2]; // low
2344         db[1] = dc[1] * *sp - db[0] - dc[1] * db[2]; // high
2345         db[2] = dc[0] * db[1] + db[2]; // band
2346         *sp = db[1]; // db[1] + db[0]; // notch
2347 }
2348
2349 static inline void sample_filter_HPF12_3_ov2(FILTER_T *dc, FILTER_T *db, DATA_T *sp)
2350 {
2351         FILTER_T input = *sp;
2352         
2353         db[0] = db[0] + dc[0] * db[2]; // low
2354         db[1] = dc[1] * input - db[0] - dc[1] * db[2]; // high
2355         db[2] = dc[0] * db[1] + db[2]; // band
2356         *sp = db[1]; // db[1] + db[0]; // notch
2357         // ov2
2358         db[0] = db[0] + dc[0] * db[2]; // low
2359         db[1] = dc[1] * input - db[0] - dc[1] * db[2]; // high
2360         db[2] = dc[0] * db[1] + db[2]; // band
2361 }
2362
2363 static inline void sample_filter_HPF12_3_ov3(FILTER_T *dc, FILTER_T *db, DATA_T *sp)
2364 {
2365         FILTER_T input = *sp;
2366         
2367         db[0] = db[0] + dc[0] * db[2]; // low
2368         db[1] = dc[1] * input - db[0] - dc[1] * db[2]; // high
2369         db[2] = dc[0] * db[1] + db[2]; // band
2370         *sp = db[1]; // db[1] + db[0]; // notch
2371         // ov2
2372         db[0] = db[0] + dc[0] * db[2]; // low
2373         db[1] = dc[1] * input - db[0] - dc[1] * db[2]; // high
2374         db[2] = dc[0] * db[1] + db[2]; // band
2375         // ov3
2376         db[0] = db[0] + dc[0] * db[2]; // low
2377         db[1] = dc[1] * input - db[0] - dc[1] * db[2]; // high
2378         db[2] = dc[0] * db[1] + db[2]; // band
2379 }
2380
2381 static inline void recalc_filter_HPF12_3(FilterCoefficients *fc)
2382 {
2383         FILTER_T *dc = fc->dc;
2384
2385 /* Chamberlin2's lowpass filter. */
2386         if(FLT_FREQ_MARGIN || FLT_RESO_MARGIN){
2387                 CALC_MARGIN_VAL
2388                 CALC_FREQ_MARGIN
2389                 CALC_RESO_MARGIN
2390                 if(fc->freq < fc->flt_rate_limit1){ // <sr*0.21875
2391                         fc->sample_filter = sample_filter_HPF12_3;
2392                         dc[0] = 2.0 * sin(M_PI * fc->freq * fc->div_flt_rate); // *1.0
2393                 }else if(fc->freq < fc->flt_rate_limit2){ // <sr*2*0.21875
2394                         fc->sample_filter = sample_filter_HPF12_3_ov2;
2395                         dc[0] = 2.0 * sin(M_PI * fc->freq * fc->div_flt_rate_ov2); // sr*2
2396                 }else{ // <sr*3*0.21875
2397                         fc->sample_filter = sample_filter_HPF12_3_ov3;
2398                         dc[0] = 2.0 * sin(M_PI * fc->freq * fc->div_flt_rate_ov3); // sr*3
2399                 }
2400                 dc[1] = RESO_DB_CF_M(fc->reso_dB);
2401         }
2402 }
2403
2404 static inline void sample_filter_BPF12_3(FILTER_T *dc, FILTER_T *db, DATA_T *sp)
2405 {
2406         db[0] = db[0] + dc[0] * db[2]; // low
2407         db[1] = dc[1] * *sp - db[0] - dc[1] * db[2]; // high
2408         db[2] = dc[0] * db[1] + db[2]; // band
2409         *sp = db[2]; // db[1] + db[0]; // notch
2410 #if defined(DENORMAL_FIX)
2411         db[0] += denormal_add;
2412 #endif  
2413 }
2414
2415 static inline void sample_filter_BPF12_3_ov2(FILTER_T *dc, FILTER_T *db, DATA_T *sp)
2416 {
2417         FILTER_T input = *sp;
2418         
2419         db[0] = db[0] + dc[0] * db[2]; // low
2420         db[1] = dc[1] * input - db[0] - dc[1] * db[2]; // high
2421         db[2] = dc[0] * db[1] + db[2]; // band
2422         *sp = db[2]; // db[1] + db[0]; // notch
2423 #if defined(DENORMAL_FIX)
2424         db[0] += denormal_add;
2425 #endif  
2426         // ov2
2427         db[0] = db[0] + dc[0] * db[2]; // low
2428         db[1] = dc[1] * input - db[0] - dc[1] * db[2]; // high
2429         db[2] = dc[0] * db[1] + db[2]; // band
2430 }
2431
2432 static inline void sample_filter_BPF12_3_ov3(FILTER_T *dc, FILTER_T *db, DATA_T *sp)
2433 {
2434         FILTER_T input = *sp;
2435         
2436         db[0] = db[0] + dc[0] * db[2]; // low
2437         db[1] = dc[1] * input - db[0] - dc[1] * db[2]; // high
2438         db[2] = dc[0] * db[1] + db[2]; // band
2439         *sp = db[2]; // db[1] + db[0]; // notch
2440 #if defined(DENORMAL_FIX)
2441         db[0] += denormal_add;
2442 #endif  
2443         // ov2
2444         db[0] = db[0] + dc[0] * db[2]; // low
2445         db[1] = dc[1] * input - db[0] - dc[1] * db[2]; // high
2446         db[2] = dc[0] * db[1] + db[2]; // band
2447         // ov3
2448         db[0] = db[0] + dc[0] * db[2]; // low
2449         db[1] = dc[1] * input - db[0] - dc[1] * db[2]; // high
2450         db[2] = dc[0] * db[1] + db[2]; // band
2451 }
2452
2453 static inline void recalc_filter_BPF12_3(FilterCoefficients *fc)
2454 {
2455         FILTER_T *dc = fc->dc;
2456
2457 /* Chamberlin2's lowpass filter. */
2458         if(FLT_FREQ_MARGIN || FLT_RESO_MARGIN){
2459                 CALC_MARGIN_VAL
2460                 CALC_FREQ_MARGIN
2461                 CALC_RESO_MARGIN
2462                 if(fc->freq < fc->flt_rate_limit1){ // <sr*0.21875
2463                         fc->sample_filter = sample_filter_BPF12_3;
2464                         dc[0] = 2.0 * sin(M_PI * fc->freq * fc->div_flt_rate); // *1.0
2465                 }else if(fc->freq < fc->flt_rate_limit2){ // <sr*2*0.21875
2466                         fc->sample_filter = sample_filter_BPF12_3_ov2;
2467                         dc[0] = 2.0 * sin(M_PI * fc->freq * fc->div_flt_rate_ov2); // sr*2
2468                 }else{ // <sr*3*0.21875
2469                         fc->sample_filter = sample_filter_BPF12_3_ov3;
2470                         dc[0] = 2.0 * sin(M_PI * fc->freq * fc->div_flt_rate_ov3); // sr*3
2471                 }
2472                 dc[1] = RESO_DB_CF_M(fc->reso_dB);
2473         }
2474 }
2475
2476 static inline void sample_filter_BCF12_3(FILTER_T *dc, FILTER_T *db, DATA_T *sp)
2477 {
2478         db[0] = db[0] + dc[0] * db[2]; // low
2479         db[1] = dc[1] * *sp - db[0] - dc[1] * db[2]; // high
2480         db[2] = dc[0] * db[1] + db[2]; // band
2481         *sp = db[1] + db[0]; // notch
2482 }
2483
2484 static inline void sample_filter_BCF12_3_ov2(FILTER_T *dc, FILTER_T *db, DATA_T *sp)
2485 {
2486         FILTER_T input = *sp;
2487         
2488         db[0] = db[0] + dc[0] * db[2]; // low
2489         db[1] = dc[1] * input - db[0] - dc[1] * db[2]; // high
2490         db[2] = dc[0] * db[1] + db[2]; // band
2491         *sp = db[1] + db[0]; // notch
2492         // ov2
2493         db[0] = db[0] + dc[0] * db[2]; // low
2494         db[1] = dc[1] * input - db[0] - dc[1] * db[2]; // high
2495         db[2] = dc[0] * db[1] + db[2]; // band
2496 }
2497
2498 static inline void sample_filter_BCF12_3_ov3(FILTER_T *dc, FILTER_T *db, DATA_T *sp)
2499 {
2500         FILTER_T input = *sp;
2501
2502         db[0] = db[0] + dc[0] * db[2]; // low
2503         db[1] = dc[1] * input - db[0] - dc[1] * db[2]; // high
2504         db[2] = dc[0] * db[1] + db[2]; // band
2505         db[3] = db[1] + db[0]; // notch
2506         *sp = db[1] + db[0]; // notch
2507         // ov2
2508         db[0] = db[0] + dc[0] * db[2]; // low
2509         db[1] = dc[1] * input - db[0] - dc[1] * db[2]; // high
2510         db[2] = dc[0] * db[1] + db[2]; // band
2511         // ov3
2512         db[0] = db[0] + dc[0] * db[2]; // low
2513         db[1] = dc[1] * input - db[0] - dc[1] * db[2]; // high
2514         db[2] = dc[0] * db[1] + db[2]; // band
2515 }
2516
2517 static inline void recalc_filter_BCF12_3(FilterCoefficients *fc)
2518 {
2519         FILTER_T *dc = fc->dc;
2520
2521 /* Chamberlin2's lowpass filter. */
2522         if(FLT_FREQ_MARGIN || FLT_RESO_MARGIN){
2523                 CALC_MARGIN_VAL
2524                 CALC_FREQ_MARGIN
2525                 CALC_RESO_MARGIN        
2526                 if(fc->freq < fc->flt_rate_limit1){ // <sr*0.21875
2527                         fc->sample_filter = sample_filter_BCF12_3;
2528                         dc[0] = 2.0 * sin(M_PI * fc->freq * fc->div_flt_rate); // *1.0
2529                 }else if(fc->freq < fc->flt_rate_limit2){ // <sr*2*0.21875
2530                         fc->sample_filter = sample_filter_BCF12_3_ov2;
2531                         dc[0] = 2.0 * sin(M_PI * fc->freq * fc->div_flt_rate_ov2); // sr*2
2532                 }else{ // <sr*3*0.21875
2533                         fc->sample_filter = sample_filter_BCF12_3_ov3;
2534                         dc[0] = 2.0 * sin(M_PI * fc->freq * fc->div_flt_rate_ov3); // sr*3
2535                 }
2536                 dc[1] = RESO_DB_CF_M(fc->reso_dB);
2537         }
2538 }
2539
2540 static inline void sample_filter_HPF6(FILTER_T *dc, FILTER_T *db, DATA_T *sp)
2541 {
2542         *sp -= (db[1] = dc[0] * *sp + dc[1] * db[1]);
2543 #if defined(DENORMAL_FIX)
2544         db[1] += denormal_add;
2545 #endif          
2546 }
2547
2548 static inline void sample_filter_HPF12_2(FILTER_T *dc, FILTER_T *db, DATA_T *sp)
2549 {
2550         db[1] += (*sp - db[0]) * dc[1];
2551         db[0] += db[1];
2552         db[1] *= dc[0];
2553         *sp -= db[0];
2554 }
2555
2556
2557 // hybrid
2558 static inline void sample_filter_HBF_L6L12(FILTER_T *dc, FILTER_T *db, DATA_T *sp)
2559 {
2560         FLOAT_T in = *sp, out1, out2;
2561         // filter1
2562         db[1] += (in - db[0]) * dc[1];
2563         db[0] += db[1];
2564         db[1] *= dc[0];
2565         out1 = db[0];
2566         // filter2
2567         db[11] = dc[10] * in + dc[11] * db[11]; 
2568         out2 = db[11];
2569 #if defined(DENORMAL_FIX)
2570         db[11] += denormal_add;
2571 #endif  
2572         // output
2573         dc[16] = dc[16] * 0.75 + dc[15] * 0.25;
2574         *sp = (out1 * dc[16] + out2 * (1.0 - dc[16]));
2575
2576
2577 static inline void recalc_filter_HBF_L6L12(FilterCoefficients *fc)
2578 {
2579         FILTER_T *dc = fc->dc;
2580         FLOAT_T f, r, q, t;
2581
2582         if(FLT_FREQ_MARGIN || FLT_RESO_MARGIN){
2583                 CALC_MARGIN_VAL
2584                 CALC_FREQ_MARGIN
2585                 CALC_RESO_MARGIN
2586                 // filter1
2587                 f = M_PI2 * fc->freq * fc->div_flt_rate;
2588                 q = 1.0 - f / (2.0 * (RESO_DB_CF_P(fc->reso_dB) + 0.5 / (1.0 + f)) + f - 2.0);
2589                 dc[0] = q * q;
2590                 dc[1] = dc[0] + 1.0 - 2.0 * cos(f) * q;
2591                 // filter2
2592                 f = exp(-M_PI2 * fc->freq * fc->div_flt_rate);
2593                 dc[10] = 1.0 - f;
2594                 dc[11] = f;
2595                 // 
2596                 dc[15] = 1.0 - RESO_DB_CF_M(fc->reso_dB);
2597         }
2598 }
2599
2600 static inline void sample_filter_HBF_L12L6(FILTER_T *dc, FILTER_T *db, DATA_T *sp)
2601 {
2602         FLOAT_T in = *sp, out1, out2;
2603         // filter1
2604         db[1] += (in - db[0]) * dc[1];
2605         db[0] += db[1];
2606         db[1] *= dc[0];
2607         out1 = db[0];
2608         // filter2
2609         db[11] = dc[10] * in + dc[11] * db[11]; 
2610         out2 = db[11];
2611 #if defined(DENORMAL_FIX)
2612         db[11] += denormal_add;
2613 #endif  
2614         // output       
2615         *sp = out1 + out2 * DIV_2;
2616
2617
2618 static inline void recalc_filter_HBF_L12L6(FilterCoefficients *fc)
2619 {
2620         FILTER_T *dc = fc->dc;
2621         FLOAT_T f, r, q, t;
2622
2623         if(FLT_FREQ_MARGIN || FLT_RESO_MARGIN){
2624                 CALC_MARGIN_VAL
2625                 CALC_FREQ_MARGIN
2626                 CALC_RESO_MARGIN
2627                 // filter1
2628                 f = M_PI2 * fc->freq * fc->div_flt_rate;
2629                 q = 1.0 - f / (2.0 * (RESO_DB_CF_P(fc->reso_dB) + 0.5 / (1.0 + f)) + f - 2.0);
2630                 dc[0] = q * q;
2631                 dc[1] = dc[0] + 1.0 - 2.0 * cos(f) * q;
2632                 // filter2
2633                 f = exp(-M_PI2 * fc->freq * fc->div_flt_rate);
2634                 dc[10] = 1.0 - f;
2635                 dc[11] = f;
2636         }
2637 }
2638
2639 static inline void sample_filter_HBF_L12H6(FILTER_T *dc, FILTER_T *db, DATA_T *sp)
2640 {
2641         FLOAT_T in = *sp, out1, out2;
2642         // filter1
2643         db[1] += (in - db[0]) * dc[1];
2644         db[0] += db[1];
2645         db[1] *= dc[0];
2646         out1 = db[0];
2647         // filter2
2648         db[11] = dc[10] * in + dc[11] * db[11]; 
2649         out2 = in - db[11];
2650 #if defined(DENORMAL_FIX)
2651         db[11] += denormal_add;
2652 #endif  
2653         // output       
2654         *sp = out1 + out2 * DIV_2;
2655
2656
2657 static inline void recalc_filter_HBF_L12H6(FilterCoefficients *fc)
2658 {
2659         FILTER_T *dc = fc->dc;
2660         FLOAT_T f, r, q, t;
2661
2662         if(FLT_FREQ_MARGIN || FLT_RESO_MARGIN){
2663                 CALC_MARGIN_VAL
2664                 CALC_FREQ_MARGIN
2665                 CALC_RESO_MARGIN
2666                 // filter1
2667                 f = M_PI2 * fc->freq * fc->div_flt_rate;
2668                 q = 1.0 - f / (2.0 * (RESO_DB_CF_P(fc->reso_dB) + 0.5 / (1.0 + f)) + f - 2.0);
2669                 dc[0] = q * q;
2670                 dc[1] = dc[0] + 1.0 - 2.0 * cos(f) * q;
2671                 // filter2
2672                 f = exp(-M_PI2 * fc->freq * fc->div_flt_rate);
2673                 dc[10] = 1.0 - f;
2674                 dc[11] = f;
2675         }
2676 }
2677
2678 static inline void sample_filter_HBF_L24H6(FILTER_T *dc, FILTER_T *db, DATA_T *sp)
2679 {
2680         FLOAT_T in = *sp, out1, out2;
2681         // filter1
2682         db[0] = in;
2683         db[5] = dc[0] * db[0] + db[1];
2684         db[1] = dc[1] * db[0] + dc[3] * db[5] + db[2];
2685         db[2] = dc[2] * db[0] + dc[4] * db[5];
2686         db[0] = db[5];
2687         db[5] = dc[0] * db[0] + db[3];
2688         db[3] = dc[1] * db[0] + dc[3] * db[5] + db[4];
2689         db[4] = dc[2] * db[0] + dc[4] * db[5];
2690         out1 = db[0];
2691         // filter2
2692         db[11] = dc[10] * in + dc[11] * db[11]; 
2693         out2 = in - db[11];
2694 #if defined(DENORMAL_FIX)
2695         db[11] += denormal_add;
2696 #endif  
2697         // output       
2698         *sp = out1 + out2 * DIV_2;
2699
2700
2701 static inline void recalc_filter_HBF_L24H6(FilterCoefficients *fc)
2702 {
2703         FILTER_T *dc = fc->dc;
2704         FLOAT_T f, r, q ,p, dc0;
2705
2706         if(FLT_FREQ_MARGIN || FLT_RESO_MARGIN){
2707                 CALC_MARGIN_VAL
2708                 CALC_FREQ_MARGIN
2709                 CALC_RESO_MARGIN
2710                 // filter1
2711                 f = tan(M_PI * fc->freq * fc->div_flt_rate); // cutoff freq rate/2
2712                 q = 2.0 * RESO_DB_CF_M(fc->reso_dB);
2713                 r = f * f;
2714                 p = 1.0 / (1.0 + (q * f) + r);
2715                 dc0 = r * p;
2716                 dc[0] = dc0;
2717                 dc[1] = dc0 * 2;
2718                 dc[2] = dc0;
2719                 dc[3] = -2.0 * (r - 1) * p;
2720                 dc[4] = (-1.0 + (q * f) - r) * p;
2721                 // filter2
2722                 f = exp(-M_PI2 * fc->freq * fc->div_flt_rate);
2723                 dc[10] = 1.0 - f;
2724                 dc[11] = f;
2725         }
2726 }
2727
2728
2729 static inline void sample_filter_HBF_L24H12(FILTER_T *dc, FILTER_T *db, DATA_T *sp)
2730 {       
2731         FLOAT_T in = *sp, out1, out2;
2732         // filter1
2733         db[0] = in;
2734         db[5] = dc[0] * db[0] + db[1];
2735         db[1] = dc[1] * db[0] + dc[3] * db[5] + db[2];
2736         db[2] = dc[2] * db[0] + dc[4] * db[5];
2737         db[0] = db[5];
2738         db[5] = dc[0] * db[0] + db[3];
2739         db[3] = dc[1] * db[0] + dc[3] * db[5] + db[4];
2740         db[4] = dc[2] * db[0] + dc[4] * db[5];
2741         out1 = db[0];
2742         // filter2
2743         db[11] += (in - db[10]) * dc[11];
2744         db[10] += db[11];
2745         db[11] *= dc[10];
2746         out2 = in - db[10];
2747         // output       
2748         *sp = out1 + out2 * DIV_2;
2749
2750
2751 static inline void recalc_filter_HBF_L24H12(FilterCoefficients *fc)
2752 {
2753         FILTER_T *dc = fc->dc;
2754         FLOAT_T f, r, q ,p, p2, qp, dc0;
2755
2756         if(FLT_FREQ_MARGIN || FLT_RESO_MARGIN){
2757                 CALC_MARGIN_VAL
2758                 CALC_FREQ_MARGIN
2759                 CALC_RESO_MARGIN
2760                 // filter1
2761                 f = tan(M_PI * fc->freq * fc->div_flt_rate); // cutoff freq rate/2
2762                 q = 2.0 * RESO_DB_CF_M(fc->reso_dB);
2763                 r = f * f;
2764                 p = 1.0 / (1.0 + (q * f) + r);
2765                 dc0 = r * p;
2766                 dc[0] = dc0;
2767                 dc[1] = dc0 * 2;
2768                 dc[2] = dc0;
2769                 dc[3] = -2.0 * (r - 1) * p;
2770                 dc[4] = (-1.0 + (q * f) - r) * p;
2771                 // filter2
2772                 f = M_PI2 * fc->freq * fc->div_flt_rate;
2773                 q = 1.0 - f / (2.0 * (RESO_DB_CF_P(0) + 0.5 / (1.0 + f)) + f - 2.0);
2774                 dc0 = q * q;
2775                 dc[10] = dc0;
2776                 dc[11] = dc0 + 1.0 - 2.0 * cos(f) * q;
2777         }
2778 }
2779
2780 static inline void sample_filter_HBF_L12OCT(FILTER_T *dc, FILTER_T *db, DATA_T *sp)
2781 {
2782         FLOAT_T in = *sp, out1, out2;
2783         // filter1
2784         db[1] += (in - db[0]) * dc[1];
2785         db[0] += db[1];
2786         db[1] *= dc[0];
2787         out1 = db[0];
2788         // filter2
2789         db[11] += (in - db[10]) * dc[11];
2790         db[10] += db[11];
2791         db[11] *= dc[10];
2792         out2 = db[10];
2793         // output       
2794         *sp = out1 * DIV_3_2 + out2 * DIV_3;
2795
2796
2797 static inline void recalc_filter_HBF_L12OCT(FilterCoefficients *fc)
2798 {
2799         FILTER_T *dc = fc->dc;
2800         FLOAT_T f, r, q;
2801
2802         if(FLT_FREQ_MARGIN || FLT_RESO_MARGIN){
2803                 CALC_MARGIN_VAL
2804                 CALC_FREQ_MARGIN
2805                 CALC_RESO_MARGIN
2806                 // filter1
2807                 f = M_PI2 * fc->freq * fc->div_flt_rate;
2808                 r = RESO_DB_CF_P(fc->reso_dB);
2809                 q = 1.0 - f / (2.0 * (r + 0.5 / (1.0 + f)) + f - 2.0);
2810                 dc[0] = q * q;
2811                 dc[1] = dc[0] + 1.0 - 2.0 * cos(f) * q;
2812                 // filter2
2813                 f = 2.0 * fc->freq * fc->div_flt_rate;
2814                 if(f > DIV_2)
2815                         f = DIV_2;
2816                 f = M_PI2 * f;
2817                 q = 1.0 - f / (2.0 * (r + 0.5 / (1.0 + f)) + f - 2.0);
2818                 dc[10] = q * q;
2819                 dc[11] = dc[10] + 1.0 - 2.0 * cos(f) * q;
2820         }
2821 }
2822
2823 static inline void sample_filter_HBF_L24OCT(FILTER_T *dc, FILTER_T *db, DATA_T *sp)
2824 {
2825         FLOAT_T in = *sp, out1, out2;
2826         // filter1
2827         db[0] = in;
2828         db[5] = dc[0] * db[0] + db[1];
2829         db[1] = dc[1] * db[0] + dc[3] * db[5] + db[2];
2830         db[2] = dc[2] * db[0] + dc[4] * db[5];
2831         db[0] = db[5];
2832         db[5] = dc[0] * db[0] + db[3];
2833         db[3] = dc[1] * db[0] + dc[3] * db[5] + db[4];
2834         db[4] = dc[2] * db[0] + dc[4] * db[5];
2835         out1 = db[0];
2836         // filter2
2837         db[10] = in;
2838         db[15] = dc[10] * db[10] + db[11];
2839         db[11] = dc[11] * db[10] + dc[13] * db[15] + db[12];
2840         db[12] = dc[12] * db[10] + dc[14] * db[15];
2841         db[10] = db[15];
2842         db[15] = dc[10] * db[10] + db[13];
2843         db[13] = dc[11] * db[10] + dc[13] * db[15] + db[14];
2844         db[14] = dc[12] * db[10] + dc[14] * db[15];
2845         out2 = db[10];
2846         // output       
2847         *sp = out1 * DIV_3_2 + out2 * DIV_3;
2848
2849
2850 static inline void recalc_filter_HBF_L24OCT(FilterCoefficients *fc)
2851 {
2852         FILTER_T *dc = fc->dc;
2853         FLOAT_T f, r, q ,p, dc0;
2854
2855         if(FLT_FREQ_MARGIN || FLT_RESO_MARGIN){
2856                 CALC_MARGIN_VAL
2857                 CALC_FREQ_MARGIN
2858                 CALC_RESO_MARGIN
2859                 // filter1
2860                 f = tan(M_PI * fc->freq * fc->div_flt_rate); // cutoff freq rate/2
2861                 q = 2.0 * RESO_DB_CF_M(fc->reso_dB);
2862                 r = f * f;
2863                 p = 1.0 / (1.0 + (q * f) + r);
2864                 dc0 = r * p;
2865                 dc[0] = dc0;
2866                 dc[1] = dc0 * 2;
2867                 dc[2] = dc0;
2868                 dc[3] = -2.0 * (r - 1) * p;
2869                 dc[4] = (-1.0 + (q * f) - r) * p;
2870                 // filter2
2871                 f = 2.0 * fc->freq * fc->div_flt_rate;
2872                 if(f > 0.4999)
2873                         f = 0.4999;             
2874                 f = tan(M_PI * f); // cutoff freq rate/2
2875         //      q = 2.0 * RESO_DB_CF_M(fc->reso_dB);
2876                 r = f * f;
2877                 p = 1.0 / (1.0 + (q * f) + r);
2878                 dc0 = r * p;
2879                 dc[10] = dc0;
2880                 dc[11] = dc0 * 2;
2881                 dc[12] = dc0;
2882                 dc[13] = -2.0 * (r - 1) * p;
2883                 dc[14] = (-1.0 + (q * f) - r) * p;
2884         }
2885 }
2886
2887
2888 // multi
2889
2890 static inline void sample_filter_LPF_BWx2(FILTER_T *dc, FILTER_T *db, DATA_T *sp)
2891 {
2892         // input
2893         db[0] = *sp;
2894         // filter1              
2895         db[ 2] = dc[ 0] * db[ 0] + dc[ 1] * db[ 1] + dc[ 2] * db[ 2] + dc[ 3] * db[ 3] + dc[ 4] * db[ 4];
2896         db[ 4] = db[ 3];
2897         db[ 3] = db[ 2]; // flt out
2898         db[ 2] = db[ 1];
2899         db[ 1] = db[ 0]; // flt in
2900         // filter2
2901         db[ 6] = dc[ 0] * db[ 3] + dc[ 1] * db[ 5] + dc[ 2] * db[ 6] + dc[ 3] * db[ 7] + dc[ 4] * db[ 8];
2902         db[ 8] = db[ 7];
2903         db[ 7] = db[ 6]; // flt out
2904         db[ 6] = db[ 5];
2905         db[ 5] = db[ 3]; // flt in
2906         // output
2907         *sp = db[ 7];
2908 }
2909
2910 static inline void sample_filter_LPF_BWx3(FILTER_T *dc, FILTER_T *db, DATA_T *sp)
2911 {
2912         db[0] = *sp;
2913         // filter1              
2914         db[ 2] = dc[ 0] * db[ 0] + dc[ 1] * db[ 1] + dc[ 2] * db[ 2] + dc[ 3] * db[ 3] + dc[ 4] * db[ 4];
2915         db[ 4] = db[ 3];
2916         db[ 3] = db[ 2]; // flt out
2917         db[ 2] = db[ 1];
2918         db[ 1] = db[ 0]; // flt in
2919         // filter2
2920         db[ 6] = dc[ 0] * db[ 3] + dc[ 1] * db[ 5] + dc[ 2] * db[ 6] + dc[ 3] * db[ 7] + dc[ 4] * db[ 8];
2921         db[ 8] = db[ 7];
2922         db[ 7] = db[ 6]; // flt out
2923         db[ 6] = db[ 5];
2924         db[ 5] = db[ 3]; // flt in
2925         // filter3
2926         db[10] = dc[ 0] * db[ 7] + dc[ 1] * db[ 9] + dc[ 2] * db[10] + dc[ 3] * db[11] + dc[ 4] * db[12];
2927         db[12] = db[11];
2928         db[11] = db[10]; // flt out
2929         db[10] = db[ 9];
2930         db[ 9] = db[ 7]; // flt in
2931         // output
2932         *sp = db[11];
2933 }
2934
2935 static inline void sample_filter_LPF_BWx4(FILTER_T *dc, FILTER_T *db, DATA_T *sp)
2936 {
2937         // input
2938         db[0] = *sp;
2939         // filter1              
2940         db[ 2] = dc[ 0] * db[ 0] + dc[ 1] * db[ 1] + dc[ 2] * db[ 2] + dc[ 3] * db[ 3] + dc[ 4] * db[ 4];
2941         db[ 4] = db[ 3];
2942         db[ 3] = db[ 2]; // flt out
2943         db[ 2] = db[ 1];
2944         db[ 1] = db[ 0]; // flt in
2945         // filter2
2946         db[ 6] = dc[ 0] * db[ 3] + dc[ 1] * db[ 5] + dc[ 2] * db[ 6] + dc[ 3] * db[ 7] + dc[ 4] * db[ 8];
2947         db[ 8] = db[ 7];
2948         db[ 7] = db[ 6]; // flt out
2949         db[ 6] = db[ 5];
2950         db[ 5] = db[ 3]; // flt in
2951         // filter3
2952         db[10] = dc[ 0] * db[ 7] + dc[ 1] * db[ 9] + dc[ 2] * db[10] + dc[ 3] * db[11] + dc[ 4] * db[12];
2953         db[12] = db[11];
2954         db[11] = db[10]; // flt out
2955         db[10] = db[ 9];
2956         db[ 9] = db[ 7]; // flt in
2957         // filter4
2958         db[14] = dc[ 0] * db[11] + dc[ 1] * db[13] + dc[ 2] * db[14] + dc[ 3] * db[15] + dc[ 4] * db[16];
2959         db[16] = db[15];
2960         db[15] = db[14]; // flt out
2961         db[14] = db[13];
2962         db[13] = db[11]; // flt in
2963         // output
2964         *sp = db[15];
2965 }
2966
2967 static inline void sample_filter_LPF24_2x2(FILTER_T *dc, FILTER_T *db, DATA_T *sp)
2968 {
2969         db[0] = *sp;
2970         // filter1              
2971         db[5] = dc[0] * db[0] + db[1];
2972         db[1] = dc[1] * db[0] + dc[3] * db[5] + db[2];
2973         db[2] = dc[2] * db[0] + dc[4] * db[5];
2974         db[10] = db[0] = db[5];
2975         db[5] = dc[0] * db[0] + db[3];
2976         db[3] = dc[1] * db[0] + dc[3] * db[5] + db[4];
2977         db[4] = dc[2] * db[0] + dc[4] * db[5];
2978         // filter2      
2979         db[15] = dc[0] * db[10] + db[11];
2980         db[11] = dc[1] * db[10] + dc[3] * db[15] + db[12];
2981         db[12] = dc[2] * db[10] + dc[4] * db[15];
2982         db[10] = db[15];
2983         db[15] = dc[0] * db[10] + db[3];
2984         db[13] = dc[1] * db[10] + dc[3] * db[15] + db[14];
2985         db[14] = dc[2] * db[10] + dc[4] * db[15];
2986         *sp = db[10];
2987 }
2988
2989 static inline void sample_filter_LPF6x2(FILTER_T *dc, FILTER_T *db, DATA_T *sp)
2990 {
2991         db[0] = *sp;
2992         db[1] = dc[0] * db[0] + dc[1] * db[1]; // 6db
2993         db[2] = dc[0] * db[1] + dc[1] * db[2]; // 12db
2994         *sp = db[2];
2995 }
2996
2997 static inline void sample_filter_LPF6x3(FILTER_T *dc, FILTER_T *db, DATA_T *sp)
2998 {
2999         db[0] = *sp;
3000         db[1] = dc[0] * db[0] + dc[1] * db[1]; // 6db
3001         db[2] = dc[0] * db[1] + dc[1] * db[2]; // 12db
3002         db[3] = dc[0] * db[2] + dc[1] * db[3]; // 18db
3003         *sp = db[3];
3004 }
3005
3006 static inline void sample_filter_LPF6x4(FILTER_T *dc, FILTER_T *db, DATA_T *sp)
3007 {
3008         db[0] = *sp;
3009         db[1] = dc[0] * db[0] + dc[1] * db[1]; // 6db
3010         db[2] = dc[0] * db[1] + dc[1] * db[2]; // 12db
3011         db[3] = dc[0] * db[2] + dc[1] * db[3]; // 18db
3012         db[4] = dc[0] * db[3] + dc[1] * db[4]; // 24db
3013         *sp = db[4];
3014 }
3015
3016 static inline void sample_filter_LPF6x8(FILTER_T *dc, FILTER_T *db, DATA_T *sp)
3017 {
3018         db[0] = *sp;
3019         db[1] = dc[0] * db[0] + dc[1] * db[1]; // 6db
3020         db[2] = dc[0] * db[1] + dc[1] * db[2]; // 12db
3021         db[3] = dc[0] * db[2] + dc[1] * db[3];
3022         db[4] = dc[0] * db[3] + dc[1] * db[4]; // 24db
3023         db[5] = dc[0] * db[4] + dc[1] * db[5];
3024         db[6] = dc[0] * db[5] + dc[1] * db[6]; // 36db
3025         db[7] = dc[0] * db[6] + dc[1] * db[7];
3026         db[8] = dc[0] * db[7] + dc[1] * db[8]; // 48db
3027         *sp = db[8];
3028 }
3029
3030 static inline void sample_filter_LPF6x16(FILTER_T *dc, FILTER_T *db, DATA_T *sp)
3031 {
3032         db[0] = *sp;
3033         db[1] = dc[0] * db[0] + dc[1] * db[1]; // 6db
3034         db[2] = dc[0] * db[1] + dc[1] * db[2]; // 12db
3035         db[3] = dc[0] * db[2] + dc[1] * db[3];
3036         db[4] = dc[0] * db[3] + dc[1] * db[4]; // 24db
3037         db[5] = dc[0] * db[4] + dc[1] * db[5];
3038         db[6] = dc[0] * db[5] + dc[1] * db[6]; // 36db
3039         db[7] = dc[0] * db[6] + dc[1] * db[7];
3040         db[8] = dc[0] * db[7] + dc[1] * db[8]; // 48db
3041         db[9] = dc[0] * db[8] + dc[1] * db[9];
3042         db[10] = dc[0] * db[9] + dc[1] * db[10]; // 60db
3043         db[11] = dc[0] * db[10] + dc[1] * db[11];
3044         db[12] = dc[0] * db[11] + dc[1] * db[12]; // 72db
3045         db[13] = dc[0] * db[12] + dc[1] * db[13];
3046         db[14] = dc[0] * db[13] + dc[1] * db[14]; // 84db
3047         db[15] = dc[0] * db[14] + dc[1] * db[15];
3048         db[16] = dc[0] * db[15] + dc[1] * db[16]; // 96db
3049         *sp = db[16];
3050 }
3051
3052
3053 // antialias
3054
3055 static inline void sample_filter_LPF_FIR(FILTER_T *dc, FILTER_T *db, DATA_T *sp)
3056 {
3057 #if (LPF_FIR_ORDER == 20) // optimize           
3058 #if (USE_X86_EXT_INTRIN >= 3) && defined(FLOAT_T_DOUBLE)        
3059          FLOAT_T input = *sp;
3060         __m128d xdc0 = _mm_loadu_pd(&dc[0]), xdc2 = _mm_loadu_pd(&dc[2]), 
3061                 xdc4 = _mm_loadu_pd(&dc[4]), xdc6 = _mm_loadu_pd(&dc[6]), 
3062                 xdc8 = _mm_loadu_pd(&dc[8]), xdc10 = _mm_loadu_pd(&dc[10]), 
3063                 xdc12 = _mm_loadu_pd(&dc[12]), xdc14 = _mm_loadu_pd(&dc[14]), 
3064                 xdc16 = _mm_loadu_pd(&dc[16]), xdc18 = _mm_loadu_pd(&dc[18]);
3065         __m128d xdb0 = _mm_loadu_pd(&db[0]), xdb2 = _mm_loadu_pd(&db[2]), 
3066                 xdb4 = _mm_loadu_pd(&db[4]), xdb6 = _mm_loadu_pd(&db[6]), 
3067                 xdb8 = _mm_loadu_pd(&db[8]), xdb10 = _mm_loadu_pd(&db[10]), 
3068                 xdb12 = _mm_loadu_pd(&db[12]), xdb14 = _mm_loadu_pd(&db[14]), 
3069                 xdb16 = _mm_loadu_pd(&db[16]), xdb18 = _mm_loadu_pd(&db[18]);
3070         __m128d xsum = _mm_setzero_pd();        
3071         xsum = MM_FMA5_PD(xdb0, xdc0, xdb2, xdc2, xdb4, xdc4, xdb6, xdc6, xdb8, xdc8);
3072         xsum = MM_FMA5_PD(xdb10, xdc10, xdb12, xdc12, xdb14, xdc14, xdb16, xdc16, xdb18, xdc18);        
3073         xsum = _mm_add_pd(xsum, _mm_shuffle_pd(xsum, xsum, 0x1)); // v0=v0+v1 v1=v1+v0
3074 #if defined(DATA_T_FLOAT)
3075         _mm_store_ss(sp, _mm_cvtsd_ss(_mm_setzero_ps(), xsum));
3076 #else
3077         _mm_store_sd(sp, xsum); 
3078 #endif  
3079         _mm_storeu_pd(&db[19], xdb18);
3080         _mm_storeu_pd(&db[17], xdb16);
3081         _mm_storeu_pd(&db[15], xdb14);
3082         _mm_storeu_pd(&db[13], xdb12);
3083         _mm_storeu_pd(&db[11], xdb10);
3084         _mm_storeu_pd(&db[9], xdb8);
3085         _mm_storeu_pd(&db[7], xdb6);
3086         _mm_storeu_pd(&db[5], xdb4);
3087         _mm_storeu_pd(&db[3], xdb2);
3088         _mm_storeu_pd(&db[1], xdb0);
3089         db[0] = input;
3090 #elif (USE_X86_EXT_INTRIN >= 2) && defined(FLOAT_T_FLOAT)       
3091          FLOAT_T input = *sp;
3092         __m128 xdc0 = _mm_loadu_ps(&dc[0]), xdc4 = _mm_loadu_ps(&dc[4]),
3093                 xdc8 = _mm_loadu_ps(&dc[8]), xdc12 = _mm_loadu_ps(&dc[12]),
3094                 xdc16 = _mm_loadu_ps(&dc[16]);
3095         __m128 xdb0 = _mm_loadu_ps(&db[0]), xdb4 = _mm_loadu_ps(&db[4]),
3096                 xdb8 = _mm_loadu_ps(&db[8]), xdb12 = _mm_loadu_ps(&db[12]),
3097                 xdb16 = _mm_loadu_ps(&db[16]);
3098         __m128 xsum = _mm_setzero_ps(); 
3099         xsum = MM_FMA5_PS(xdb0, xdc0, xdb0, xdc0, xdb4, xdc4, xdb8, xdc8, xdb12, xdc12, xdb16, xdc16);
3100         xsum = _mm_add_ps(xsum, _mm_movehl_ps(xsum, xsum)); // v0=v0+v2 v1=v1+v3 v2=-- v3=--
3101         xsum = _mm_add_ps(xsum, _mm_shuffle_ps(xsum, xsum, 0xe1)); // v0=v0+v1  
3102 #if defined(DATA_T_FLOAT)
3103         _mm_store_ss(sp, xsum);
3104 #else   
3105 #if (USE_X86_EXT_INTRIN >= 3)
3106         _mm_store_sd(sp, _mm_cvtss_sd(xsum));
3107 #else
3108         {
3109                 float out;
3110                 _mm_store_ss(&out, xsum);
3111                 *sp = (double)out;
3112         }
3113 #endif  
3114 #endif  
3115         _mm_storeu_ps(&db[17], xdb16);
3116         _mm_storeu_ps(&db[13], xdb12);
3117         _mm_storeu_ps(&db[9], xdb8);
3118         _mm_storeu_ps(&db[5], xdb4);
3119         _mm_storeu_ps(&db[1], xdb0);
3120         db[0] = input;
3121 #else
3122     FLOAT_T sum = 0.0;
3123         sum += db[0] * dc[0];
3124         sum += db[1] * dc[1];
3125         sum += db[2] * dc[2];
3126         sum += db[3] * dc[3];
3127         sum += db[4] * dc[4];
3128         sum += db[5] * dc[5];
3129         sum += db[6] * dc[6];
3130         sum += db[7] * dc[7];
3131         sum += db[8] * dc[8];
3132         sum += db[9] * dc[9];
3133         sum += db[10] * dc[10];
3134         sum += db[11] * dc[11];
3135         sum += db[12] * dc[12];
3136         sum += db[13] * dc[13];
3137         sum += db[14] * dc[14];
3138         sum += db[15] * dc[15];
3139         sum += db[16] * dc[16];
3140         sum += db[17] * dc[17];
3141         sum += db[18] * dc[18];
3142         sum += db[19] * dc[19];
3143         db[19] = db[18];
3144         db[18] = db[17];
3145         db[17] = db[16];
3146         db[16] = db[15];
3147         db[15] = db[14];
3148         db[14] = db[13];
3149         db[13] = db[12];
3150         db[12] = db[11];
3151         db[11] = db[10];
3152         db[10] = db[9];
3153         db[9] = db[8];
3154         db[8] = db[7];
3155         db[7] = db[6];
3156         db[6] = db[5];
3157         db[5] = db[4];
3158         db[4] = db[3];
3159         db[3] = db[2];
3160         db[2] = db[1];
3161         db[1] = db[0];
3162         db[0] = *sp;    
3163         *sp = sum;      
3164 #endif // INTRIN
3165 #else // ! (LPF_FIR_ORDER == 20)
3166     FLOAT_T sum = 0.0;
3167         int i;
3168         for (i = 0; i < LPF_FIR_ORDER ;i++)
3169                 sum += db[i] * dc[i];
3170         for (i = LPF_FIR_ORDER - 1; i >= 0; i--)
3171                 db[i + 1] = db[i];
3172         db[0] = *sp;    
3173         *sp = sum;
3174 #endif
3175 }
3176
3177 static void designfir(FLOAT_T *g , FLOAT_T fc, FLOAT_T att);
3178
3179 static inline void recalc_filter_LPF_FIR(FilterCoefficients *fc)
3180 {
3181         FILTER_T *dc = fc->dc;  
3182     FLOAT_T fir_coef[LPF_FIR_ORDER2];
3183         FLOAT_T f;
3184         int i;
3185
3186         if(FLT_FREQ_MARGIN){
3187                 CALC_MARGIN_VAL
3188                 CALC_FREQ_MARGIN
3189                 f = fc->freq * fc->div_flt_rate * 2.0;
3190                 designfir(fir_coef, f, 40.0);
3191                 for (i = 0; i < LPF_FIR_ORDER2; i++)
3192                         dc[LPF_FIR_ORDER-1 - i] = dc[i] = fir_coef[LPF_FIR_ORDER2 - 1 - i];
3193         }
3194 }
3195
3196 // shelving \8b¤\92Ê 
3197 static inline void sample_filter_shelving(FILTER_T *dc, FILTER_T *db, DATA_T *sp)
3198 {       
3199         // input
3200         db[0] = *sp;    
3201         // LPF
3202         db[2] = dc[0] * db[0] + dc[1] * db[1] + dc[2] * db[2] + dc[3] * db[3] + dc[4] * db[4];
3203 #if defined(DENORMAL_FIX)
3204         db[2] += denormal_add;
3205 #endif  
3206         db[4] = db[3];
3207         db[3] = db[2]; // flt out
3208         db[2] = db[1];
3209         db[1] = db[0]; // flt in
3210         // output
3211         *sp = db[3] * dc[8]; // spgain
3212 }
3213
3214 static inline void recalc_filter_shelving_low(FilterCoefficients *fc)
3215 {
3216         FILTER_T *dc = fc->dc;
3217         FLOAT_T a0, a1, a2, b1, b2, b0, omega, sn, cs, A, beta;
3218
3219         if(FLT_FREQ_MARGIN || FLT_RESO_MARGIN || FLT_WIDTH_MARGIN){
3220                 CALC_MARGIN_VAL
3221                 CALC_FREQ_MARGIN
3222                 CALC_RESO_MARGIN
3223                 CALC_WIDTH_MARGIN               
3224                 A = pow(10.0, fc->reso_dB * DIV_40 * ext_filter_shelving_gain);
3225                 if(fc->reso_dB > 0)
3226                         dc[8] = pow((FLOAT_T)10.0, -(fc->reso_dB) * DIV_80 * ext_filter_shelving_reduce); // spgain
3227                 else
3228                         dc[8] = 1.0;
3229                 omega = (FLOAT_T)2.0 * M_PI * fc->freq * fc->div_flt_rate;
3230                 sn = sin(omega);
3231                 cs = cos(omega);
3232                 beta = sqrt(A) / (fc->q * ext_filter_shelving_q); // q > 0
3233                 a0 = 1.0 / ((A + 1) + (A - 1) * cs + beta * sn);
3234                 a1 = 2.0 * ((A - 1) + (A + 1) * cs);
3235                 a2 = -((A + 1) + (A - 1) * cs - beta * sn);
3236                 b0 = A * ((A + 1) - (A - 1) * cs + beta * sn);
3237                 b1 = 2.0 * A * ((A - 1) - (A + 1) * cs);
3238                 b2 = A * ((A + 1) - (A - 1) * cs - beta * sn);
3239                 dc[4] = a2 * a0;
3240                 dc[3] = a1 * a0;
3241                 dc[2] = b2 * a0;
3242                 dc[1] = b1 * a0;
3243                 dc[0] = b0 * a0;
3244         }
3245 }
3246
3247 static inline void recalc_filter_shelving_hi(FilterCoefficients *fc)
3248 {
3249         FILTER_T *dc = fc->dc;
3250         FLOAT_T a0, a1, a2, b1, b2, b0, omega, sn, cs, A, beta;
3251
3252         if(FLT_FREQ_MARGIN || FLT_RESO_MARGIN || FLT_WIDTH_MARGIN){
3253                 CALC_MARGIN_VAL
3254                 CALC_FREQ_MARGIN
3255                 CALC_RESO_MARGIN
3256                 CALC_WIDTH_MARGIN               
3257                 A = pow(10.0, fc->reso_dB * DIV_40 * ext_filter_shelving_gain);
3258                 if(fc->reso_dB > 0)
3259                         dc[8] = pow((FLOAT_T)10.0, -(fc->reso_dB) * DIV_80 * ext_filter_shelving_reduce); // spgain
3260                 else
3261                         dc[8] = 1.0;
3262                 omega = (FLOAT_T)2.0 * M_PI * fc->freq * fc->div_flt_rate;
3263                 sn = sin(omega);
3264                 cs = cos(omega);
3265                 beta = sqrt(A) / (fc->q * ext_filter_shelving_q); // q > 0
3266                 a0 = 1.0 / ((A + 1) - (A - 1) * cs + beta * sn);
3267                 a1 = (-2.0 * ((A - 1) - (A + 1) * cs));
3268                 a2 = -((A + 1) - (A - 1) * cs - beta * sn);
3269                 b0 = A * ((A + 1) + (A - 1) * cs + beta * sn);
3270                 b1 = -2.0 * A * ((A - 1) + (A + 1) * cs);
3271                 b2 = A * ((A + 1) + (A - 1) * cs - beta * sn);
3272                 dc[4] = a2 * a0;
3273                 dc[3] = a1 * a0;
3274                 dc[2] = b2 * a0;
3275                 dc[1] = b1 * a0;
3276                 dc[0] = b0 * a0;
3277         }
3278 }
3279
3280 // peaking \8b¤\92Ê 
3281 static inline void sample_filter_peaking(FILTER_T *dc, FILTER_T *db, DATA_T *sp)
3282 {
3283         // input
3284         db[0] = *sp;    
3285         // LPF
3286         db[2] = dc[0] * db[0] + dc[1] * db[1] + dc[2] * db[2] + dc[3] * db[3] + dc[4] * db[4];
3287 #if defined(DENORMAL_FIX)
3288         db[2] += denormal_add;
3289 #endif  
3290         db[4] = db[3];
3291         db[3] = db[2]; // flt out
3292         db[2] = db[1];
3293         db[1] = db[0]; // flt in
3294         // output
3295         *sp = db[3] * dc[8]; // spgain
3296 }
3297
3298 static inline void recalc_filter_peaking(FilterCoefficients *fc)
3299 {
3300         FILTER_T *dc = fc->dc;
3301         FLOAT_T a0, a1, a2, b1, b2, b0, omega, sn, cs, A, beta;
3302
3303         if(FLT_FREQ_MARGIN || FLT_RESO_MARGIN || FLT_WIDTH_MARGIN){
3304                 CALC_MARGIN_VAL
3305                 CALC_FREQ_MARGIN
3306                 CALC_RESO_MARGIN
3307                 CALC_WIDTH_MARGIN               
3308                 A = pow(10.0, fc->reso_dB * DIV_40 * ext_filter_peaking_gain);
3309                 if(fc->reso_dB > 0)
3310                         dc[8] = pow((FLOAT_T)10.0, -(fc->reso_dB) * DIV_80 * ext_filter_peaking_reduce); // spgain
3311                 else
3312                         dc[8] = 1.0;
3313                 omega = (FLOAT_T)2.0 * M_PI * fc->freq * fc->div_flt_rate;
3314                 sn = sin(omega);
3315                 cs = cos(omega);
3316                 beta = sn / (2.0 * fc->q * ext_filter_peaking_q); // q > 0
3317                 a0 = 1.0 / (1.0 + beta / A);
3318                 a1 = -2.0 * cs;
3319                 dc[4] = -(1.0 - beta / A) * a0; // -
3320                 dc[3] = -a1 * a0; // -
3321                 dc[2] = (1.0 - beta * A) * a0;
3322                 dc[1] = a1 * a0; // b1 = a1
3323                 dc[0] = (1.0 + beta * A) * a0;
3324                 dc[5] = 0.0;
3325         }
3326 }
3327
3328 // biquad \8b¤\92Ê 
3329 static inline void sample_filter_biquad(FILTER_T *dc, FILTER_T *db, DATA_T *sp)
3330 {
3331 //      db[2] = db[0] * dc[0] + db[1] * dc[1] + db[2] * dc[2] + db[3] * dc[3] + db[4] * dc[4]; // dc[0]=dc[2] BW\82Æ\93¯\82¶ 
3332         db[2] = db[1] * dc[1] + (*sp + db[2]) * dc[2] + db[3] * dc[3] + db[4] * dc[4]; // -dc3 -dc4 
3333 #if defined(DENORMAL_FIX)
3334         db[2] += denormal_add;
3335 #endif  
3336         db[4] = db[3];
3337         db[3] = db[2];
3338         db[2] = db[1];
3339         db[1] = *sp;
3340         *sp = db[3];
3341 }
3342
3343 static inline void recalc_filter_biquad_low(FilterCoefficients *fc)
3344 {
3345         FILTER_T *dc = fc->dc;
3346         double a0, omega, sn, cs, alpha;
3347
3348         if(FLT_FREQ_MARGIN || FLT_WIDTH_MARGIN){
3349                 CALC_MARGIN_VAL
3350                 CALC_FREQ_MARGIN
3351                 CALC_RESO_MARGIN
3352                 CALC_WIDTH_MARGIN               
3353                 omega = 2.0 * M_PI * fc->freq * fc->div_flt_rate;
3354                 sn = sin(omega);
3355                 cs = cos(omega);
3356                 alpha = sn / (2.0 * fc->q); // q > 0
3357                 a0 = 1.0 / (1.0 + alpha);
3358                 dc[1] = (1.0 - cs) * a0;
3359                 dc[2] = dc[0] = ((1.0 - cs) * DIV_2) * a0;
3360                 dc[3] = -(-2.0 * cs) * a0; // -
3361                 dc[4] = -(1.0 - alpha) * a0; // -
3362         }
3363 }
3364
3365 static inline void recalc_filter_biquad_hi(FilterCoefficients *fc)
3366 {
3367         FILTER_T *dc = fc->dc;
3368         double a0, omega, sn, cs, alpha;
3369
3370         if(FLT_FREQ_MARGIN || FLT_WIDTH_MARGIN){
3371                 CALC_MARGIN_VAL
3372                 CALC_FREQ_MARGIN
3373                 CALC_RESO_MARGIN
3374                 CALC_WIDTH_MARGIN                       
3375                 omega = 2.0 * M_PI * fc->freq * fc->div_flt_rate;
3376                 sn = sin(omega);
3377                 cs = cos(omega);
3378                 alpha = sn / (2.0 * fc->q); // q > 0
3379                 a0 = 1.0 / (1.0 + alpha);
3380                 dc[1] = (-(1.0 + cs)) * a0;
3381                 dc[2] = dc[0] = ((1.0 + cs) * DIV_2) * a0;
3382                 dc[3] = -(-2.0 * cs) * a0; // -
3383                 dc[4] = -(1.0 - alpha) * a0; // -
3384         }
3385 }
3386
3387 #endif /* OPT_MODE == 1 */
3388
3389
3390
3391
3392 // 1sample filter
3393
3394 const char *filter_name[] = 
3395 {
3396         "NONE",
3397         "LPF12",
3398         "LPF24",
3399         "LPF_BW",
3400         "LPF12_2",
3401         "LPF24_2",
3402         "LPF6",
3403         "LPF18",
3404         "LPF_TFO",
3405 // test
3406         "HPF_BW",
3407         "BPF_BW",
3408         "PEAK1",
3409         "NOTCH1",
3410         "LPF12_3", // ov
3411         "HPF12_3", // ov
3412         "BPF12_3", // ov
3413         "BCF12_3", // ov
3414         "HPF6",
3415         "HPF12_2",
3416 // hybrid
3417         "HBF_L6L12",
3418         "HBF_L12L6",
3419         "HBF_L12H6",
3420         "HBF_L24H6",
3421         "HBF_L24H12",
3422         "HBF_L12OCT",
3423         "HBF_L24OCT",
3424 // multi
3425         "LPF6x2",
3426         "LPF6x3",
3427         "LPF6x4",
3428         "LPF6x8",
3429         "LPF6x16",
3430         "LPF_BWx2",
3431         "LPF_BWx3",
3432         "LPF_BWx4",
3433         "LPF24_2x2",
3434 //
3435         "LPF_FIR",
3436 // equalizer
3437         "SHELVING_LOW",
3438         "SHELVING_HI",
3439         "PEAKING",
3440         "BIQUAD_LOW",
3441         "BIQUAD_HI",
3442         "LIST_MAX", // last
3443 };
3444
3445 typedef void (*recalc_filter_t)(FilterCoefficients *fc);
3446
3447 static recalc_filter_t recalc_filters[] = {
3448 // cfg sort
3449         recalc_filter_none,
3450         recalc_filter_LPF12,
3451         recalc_filter_LPF24,
3452         recalc_filter_LPF_BW,
3453         recalc_filter_LPF12_2,
3454         recalc_filter_LPF24_2,
3455         recalc_filter_LPF6,
3456         recalc_filter_LPF18,
3457         recalc_filter_LPF_TFO,
3458         recalc_filter_HPF_BW,
3459         recalc_filter_BPF_BW,
3460         recalc_filter_peak1,
3461         recalc_filter_peak1, // notch1
3462         recalc_filter_LPF12_3,
3463         recalc_filter_HPF12_3, // HPF12_3
3464         recalc_filter_BPF12_3, // BPF12_3
3465         recalc_filter_BCF12_3, // BCF12_3
3466         recalc_filter_LPF6, // HPF6
3467         recalc_filter_LPF12_2, // HPF12_2
3468         // hybrid
3469         recalc_filter_HBF_L6L12,
3470         recalc_filter_HBF_L12L6,
3471         recalc_filter_HBF_L12H6,
3472         recalc_filter_HBF_L24H6,
3473         recalc_filter_HBF_L24H12,
3474         recalc_filter_HBF_L12OCT,
3475         recalc_filter_HBF_L24OCT,
3476         // multi
3477         recalc_filter_LPF6, // LPF6x2
3478         recalc_filter_LPF6, // LPF6x3
3479         recalc_filter_LPF6, // LPF6x4
3480         recalc_filter_LPF6, // LPF6x8
3481         recalc_filter_LPF6, // LPF6x16
3482         recalc_filter_LPF_BW, // LPF_BWx2
3483         recalc_filter_LPF_BW, // LPF_BWx3
3484         recalc_filter_LPF_BW, // LPF_BWx4
3485         recalc_filter_LPF24_2, // LPF24_2x2
3486         //
3487         recalc_filter_LPF_FIR, // LPF_FIR
3488         // equalizer
3489         recalc_filter_shelving_low, // eq_low
3490         recalc_filter_shelving_hi, // eq_hi
3491         recalc_filter_peaking, // eq_mid
3492         recalc_filter_biquad_low,
3493         recalc_filter_biquad_hi,
3494 };
3495
3496 typedef void (*sample_filter_t)(FILTER_T *dc, FILTER_T *db, DATA_T *sp);
3497
3498 static sample_filter_t sample_filters[] = {
3499 // cfg sort
3500         sample_filter_none,
3501         sample_filter_LPF12,
3502         sample_filter_LPF24,
3503         sample_filter_LPF_BW,
3504         sample_filter_LPF12_2,
3505         sample_filter_LPF24_2,
3506         sample_filter_LPF6,
3507         sample_filter_LPF18,
3508         sample_filter_LPF_TFO,
3509         sample_filter_HPF_BW,
3510         sample_filter_BPF_BW,
3511         sample_filter_peak1,
3512         sample_filter_notch1,
3513         sample_filter_LPF12_3,
3514         sample_filter_HPF12_3,
3515         sample_filter_BPF12_3,
3516         sample_filter_BCF12_3,
3517         sample_filter_HPF6,
3518         sample_filter_HPF12_2,
3519         // hybrid
3520         sample_filter_HBF_L6L12,
3521         sample_filter_HBF_L12L6,
3522         sample_filter_HBF_L12H6,
3523         sample_filter_HBF_L24H6,
3524         sample_filter_HBF_L24H12,
3525         sample_filter_HBF_L12OCT,
3526         sample_filter_HBF_L24OCT,
3527         // multi
3528         sample_filter_LPF6x2,
3529         sample_filter_LPF6x3,
3530         sample_filter_LPF6x4,
3531         sample_filter_LPF6x8,
3532         sample_filter_LPF6x16,
3533         sample_filter_LPF_BWx2,
3534         sample_filter_LPF_BWx3,
3535         sample_filter_LPF_BWx4,
3536         sample_filter_LPF24_2x2,
3537         // 
3538         sample_filter_LPF_FIR,
3539         // equalizer
3540         sample_filter_shelving, // eq_low
3541         sample_filter_shelving, // eq_hi
3542         sample_filter_peaking, // eq_mid
3543         sample_filter_biquad,
3544         sample_filter_biquad,
3545 };
3546
3547 void set_sample_filter_type(FilterCoefficients *fc, int type)
3548 {               
3549         if(type < FILTER_NONE || type >= FILTER_LIST_MAX)
3550                 type = FILTER_NONE;
3551         if(!fc->init || fc->type != type)
3552                 memset(fc, 0, sizeof(FilterCoefficients));
3553         fc->type = type;
3554         fc->recalc_filter = recalc_filters[type];
3555         fc->sample_filter = sample_filters[type];
3556         INIT_MARGIN_VAL
3557         fc->init = 1;
3558 }
3559
3560 const double sample_filter_limit_rate[] = {
3561         0.16666, // type0 OFF
3562         0.16666, // type1 Chamberlin 12dB/oct fc < rate / 6
3563         0.50000, // type2 Moog VCF 24dB/oct fc < rate / 2
3564         0.50000, // type3 butterworth fc < rate / 2 elion
3565         0.50000, // type4 Resonant IIR 12dB/oct fc < rate / 2
3566         0.50000, // type5 amSynth 24dB/oct fc < rate / 2
3567         0.50000, // type6 One pole 6dB/oct non rez fc < rate / 2
3568         0.44444, // type7 resonant 3 pole 18dB/oct fc < rate / 2.25
3569         0.50000, // type8 two first order fc < rate / 2
3570         // test
3571         0.50000, // type9 HPF butterworth fc < rate / 2 elion + 
3572         0.50000, // type10 BPF butterworth fc < rate / 2 elion + 
3573         0.50000, // type11 peak fc < rate / 2
3574         0.50000, // type12 notch fc < rate / 2
3575         0.21875, // type13 LPF Chamberlin2 12dB/oct fc < rate / 2
3576         0.21875, // type14 HPF Chamberlin2 12dB/oct fc < rate / 2
3577         0.21875, // type15 BPF Chamberlin2 12dB/oct fc < rate / 2
3578         0.21875, // type16 notch Chamberlin2 12dB/oct fc < rate / 2
3579         0.50000, // type17 HPF6
3580         0.50000, // type18 HPF12_2
3581         // hybrid
3582         0.50000, // type19 L6L12
3583         0.50000, // type20 L12L6
3584         0.50000, // type21 L12H6
3585         0.50000, // type22 L24H6
3586         0.50000, // type23 L24H12
3587         0.50000, // type24 L12OCT
3588         0.50000, // type25 L24OCT
3589         // multi
3590         0.50000, // LPF6x2
3591         0.50000, // LPF6x3
3592         0.50000, // LPF6x4
3593         0.50000, // LPF6x8
3594         0.50000, // LPF6x16
3595         0.50000, // LPFBWx2
3596         0.50000, // LPFBWx3
3597         0.50000, // LPFBWx4
3598         0.50000, // LPF24_2x2
3599         // 
3600         0.50000, // LPF_FIR
3601         // equalizer
3602         0.50000, // FILTER_SHELVING_LOW, // q
3603         0.50000, // FILTER_SHELVING_HI, // q
3604         0.50000, // FILTER_PEAKING, // q
3605         0.50000, // FILTER_BIQUAD_LOW, // q
3606         0.50000, // FILTER_BIQUAD_HI, // q
3607 };
3608
3609 void set_sample_filter_ext_rate(FilterCoefficients *fc, FLOAT_T freq)
3610 {
3611         if(freq > 0){
3612                 fc->flt_rate = freq;
3613                 fc->div_flt_rate = 1.0 / fc->flt_rate;
3614                 fc->flt_rate_div2 = fc->flt_rate * DIV_2;
3615         }else{ // default
3616                 fc->flt_rate = play_mode->rate;
3617                 fc->div_flt_rate = div_playmode_rate;
3618                 fc->flt_rate_div2 = playmode_rate_div2;
3619         }
3620         // for ov
3621         fc->flt_rate_limit1 = fc->flt_rate * sample_filter_limit_rate[fc->type]; // sr*limit
3622         fc->flt_rate_limit2 = fc->flt_rate_limit1 * 2.0; // sr*2*limit
3623         fc->div_flt_rate_ov2 = fc->div_flt_rate * DIV_2; // 1/sr*2
3624         fc->div_flt_rate_ov3 = fc->div_flt_rate * DIV_3; // 1/sr*3
3625 }
3626
3627 void set_sample_filter_freq(FilterCoefficients *fc, FLOAT_T freq)
3628 {
3629         if(fc->flt_rate == 0) // not init filter rate
3630                 set_sample_filter_ext_rate(fc, 0);      
3631         if(freq < 0 || freq > fc->flt_rate_div2) // sr/2
3632                 fc->freq = fc->flt_rate_div2;
3633         else if(freq < 10.0)
3634                 fc->freq = 10.0;
3635         else
3636                 fc->freq = freq;
3637 }
3638
3639 void set_sample_filter_reso(FilterCoefficients *fc, FLOAT_T reso)
3640 {
3641         const FLOAT_T limit = 96.0;
3642
3643         if(reso > limit)
3644                 fc->reso_dB = limit;
3645         else if(reso < 0.0)
3646                 fc->reso_dB = 0.0;
3647         else
3648                 fc->reso_dB = reso;
3649 }
3650
3651 void set_sample_filter_q(FilterCoefficients *fc, FLOAT_T q)
3652 {
3653         const FLOAT_T def = 0.7;
3654         const FLOAT_T limit = 12.0;
3655         const FLOAT_T min = 0.01;
3656
3657         if(q <= 0)
3658                 fc->q = def;
3659         else if(q > limit)
3660                 fc->q = limit;
3661         else if(q < min)
3662                 fc->q = min;
3663         else
3664                 fc->q = q;
3665 }
3666
3667 void init_sample_filter(FilterCoefficients *fc, FLOAT_T freq, FLOAT_T reso, int type)
3668 {
3669         set_sample_filter_type(fc, type);
3670         set_sample_filter_freq(fc, freq);
3671         set_sample_filter_reso(fc, reso);
3672         recalc_filter(fc);
3673 }
3674
3675 // eq q
3676 void init_sample_filter2(FilterCoefficients *fc, FLOAT_T freq, FLOAT_T reso, FLOAT_T q, int type)
3677 {
3678         set_sample_filter_type(fc, type);
3679         set_sample_filter_freq(fc, freq);
3680         set_sample_filter_reso(fc, reso);
3681         set_sample_filter_q(fc, q);
3682         recalc_filter(fc);
3683 }
3684
3685
3686 void recalc_filter(FilterCoefficients *fc)
3687 {
3688 #ifdef _DEBUG
3689         if(!fc)
3690                 return; // error not init
3691 #endif
3692         fc->recalc_filter(fc);
3693 }
3694
3695 // sample_filter (1ch mono / 2ch left) 
3696 inline void sample_filter(FilterCoefficients *fc, DATA_T *sp)
3697 {
3698         fc->sample_filter(fc->dc, &fc->db[FILTER_FB_L], sp);
3699 }
3700
3701 // sample_filter (2ch stereo)
3702 inline void sample_filter_stereo(FilterCoefficients *fc, DATA_T *spL, DATA_T *spR)
3703 {
3704         fc->sample_filter(fc->dc, &fc->db[FILTER_FB_L], spL);
3705         fc->sample_filter(fc->dc, &fc->db[FILTER_FB_R], spR);
3706 }
3707
3708 inline void sample_filter_stereo2(FilterCoefficients *fc, DATA_T *spLR)
3709 {
3710         fc->sample_filter(fc->dc, &fc->db[FILTER_FB_L], &spLR[0]);
3711         fc->sample_filter(fc->dc, &fc->db[FILTER_FB_R], &spLR[1]);
3712 }
3713
3714 // sample_filter (2ch left) 
3715 inline void sample_filter_left(FilterCoefficients *fc, DATA_T *sp)
3716 {
3717         fc->sample_filter(fc->dc, &fc->db[FILTER_FB_L], sp);
3718 }
3719
3720 // sample_filter (2ch left) 
3721 inline void sample_filter_right(FilterCoefficients *fc, DATA_T *sp)
3722 {
3723         fc->sample_filter(fc->dc, &fc->db[FILTER_FB_R], sp);
3724 }
3725
3726 // buffer filter (1ch mono)
3727 inline void buffer_filter(FilterCoefficients *fc, DATA_T *sp, int32 count)
3728 {
3729         int32 i;
3730         
3731 #ifdef _DEBUG
3732         if(!fc)
3733                 return; // error not init
3734 #endif
3735         if(!fc->type)
3736                 return; // filter none
3737
3738         if (fc->type == FILTER_LPF12_2) {
3739                 recalc_filter_LPF12_2(fc);
3740                 buffer_filter_LPF12_2(fc->dc, &fc->db[FILTER_FB_L], sp, count);
3741                 return;
3742         }
3743         
3744         fc->recalc_filter(fc);
3745         for(i = 0; i < count; i++)
3746                 fc->sample_filter(fc->dc, &fc->db[FILTER_FB_L], &sp[i]);
3747 }
3748
3749 // buffer filter (2ch stereo)
3750 inline void buffer_filter_stereo(FilterCoefficients *fc, DATA_T *sp, int32 count)
3751 {
3752         int32 i;
3753
3754 #ifdef _DEBUG
3755         if(!fc)
3756                 return; // error not init
3757 #endif
3758         if(!fc->type)
3759                 return; // filter none
3760         fc->recalc_filter(fc);
3761         for(i = 0; i < count; i++){
3762                 fc->sample_filter(fc->dc, &fc->db[FILTER_FB_L], &sp[i]);
3763                 i++;
3764                 fc->sample_filter(fc->dc, &fc->db[FILTER_FB_R], &sp[i]);
3765         }
3766 }
3767
3768 // buffer filter (2ch left)
3769 inline void buffer_filter_left(FilterCoefficients *fc, DATA_T *sp, int32 count)
3770 {
3771         int32 i;
3772         
3773 #ifdef _DEBUG
3774         if(!fc)
3775                 return; // error not init
3776 #endif
3777         if(!fc->type)
3778                 return; // filter none
3779         fc->recalc_filter(fc);
3780         for(i = 0; i < count; i++)
3781                 fc->sample_filter(fc->dc, &fc->db[FILTER_FB_L], &sp[i++]);
3782 }
3783
3784 // buffer filter (2ch right)
3785 inline void buffer_filter_right(FilterCoefficients *fc, DATA_T *sp, int32 count)
3786 {
3787         int32 i;
3788         
3789 #ifdef _DEBUG
3790         if(!fc)
3791                 return; // error not init
3792 #endif
3793         if(!fc->type)
3794                 return; // filter none
3795         fc->recalc_filter(fc);
3796         for(i = 0; i < count; i++)
3797                 fc->sample_filter(fc->dc, &fc->db[FILTER_FB_R], &sp[++i]);
3798 }
3799
3800
3801
3802 /// voice_filter1
3803
3804 void set_voice_filter1_type(FilterCoefficients *fc, int type)
3805 {
3806         fc->init = 0;
3807         set_sample_filter_type(fc, type);       
3808 }
3809
3810 void set_voice_filter1_ext_rate(FilterCoefficients *fc, FLOAT_T freq)
3811 {
3812         set_sample_filter_ext_rate(fc, freq);
3813 }
3814
3815 void set_voice_filter1_freq(FilterCoefficients *fc, FLOAT_T freq)
3816 {
3817         set_sample_filter_freq(fc, freq);
3818 }
3819
3820 void set_voice_filter1_reso(FilterCoefficients *fc, FLOAT_T reso)
3821 {
3822         set_sample_filter_reso(fc, reso);
3823 }
3824
3825 void voice_filter1(FilterCoefficients *fc, DATA_T *sp, int32 count)
3826 {
3827         buffer_filter(fc, sp, count);
3828 }
3829
3830
3831
3832
3833 /// voice_filter2
3834
3835 static int conv_type_voice_filter2[] = {
3836 // cfg sort
3837         FILTER_NONE,
3838         FILTER_HPF_BW, // 1
3839         FILTER_HPF12_3, // 2
3840         FILTER_HPF6, // 3
3841         FILTER_HPF12_2, // 4
3842 };
3843
3844 void set_voice_filter2_type(FilterCoefficients *fc, int type)
3845 {       
3846         fc->init = 0;
3847         if(type < VOICE_FILTER2_NONE || type >= VOICE_FILTER2_LIST_MAX)
3848                 type = VOICE_FILTER2_NONE;
3849         set_sample_filter_type(fc, conv_type_voice_filter2[type]);
3850 }
3851
3852 void set_voice_filter2_ext_rate(FilterCoefficients *fc, FLOAT_T freq)
3853 {
3854         set_sample_filter_ext_rate(fc, freq);   
3855 }
3856
3857 void set_voice_filter2_freq(FilterCoefficients *fc, FLOAT_T freq)
3858 {
3859         set_sample_filter_freq(fc, freq);
3860 }
3861
3862 void set_voice_filter2_reso(FilterCoefficients *fc, FLOAT_T reso)
3863 {
3864         set_sample_filter_reso(fc, reso);
3865 }
3866
3867 void voice_filter2(FilterCoefficients *fc, DATA_T *sp, int32 count)
3868 {
3869         buffer_filter(fc, sp, count);
3870 }
3871
3872 /// voice_filter1 + voice_filter2
3873 void voice_filter(int v, DATA_T *sp, int32 count)
3874 {
3875         Voice *vp = &voice[v];
3876
3877         buffer_filter(&vp->fc, sp, count); // lpf
3878         buffer_filter(&vp->fc2, sp, count); // hpf
3879 }
3880
3881
3882
3883
3884 /// resample_filter
3885
3886 static int conv_type_resample_filter[] = {
3887 // cfg sort
3888         FILTER_NONE, // 0
3889         FILTER_LPF_BW, // 1
3890         FILTER_LPF_BWx2,
3891         FILTER_LPF_BWx3,
3892         FILTER_LPF_BWx4,
3893         FILTER_LPF24_2,
3894         FILTER_LPF24_2x2,
3895         FILTER_LPF6x8,
3896         FILTER_LPF6x16,
3897         FILTER_LPF_FIR,
3898 };
3899
3900 void set_resample_filter_type(FilterCoefficients *fc, int type)
3901 {       
3902         fc->init = 0;
3903         if(type < RESAMPLE_FILTER_NONE || type >= RESAMPLE_FILTER_LIST_MAX)
3904                 type = RESAMPLE_FILTER_NONE;
3905         set_sample_filter_type(fc, conv_type_resample_filter[type]);
3906 }
3907
3908 void set_resample_filter_ext_rate(FilterCoefficients *fc, FLOAT_T freq)
3909 {
3910         set_sample_filter_ext_rate(fc, freq);   
3911 }
3912
3913 void set_resample_filter_freq(FilterCoefficients *fc, FLOAT_T freq)
3914 {
3915         set_sample_filter_freq(fc, freq);
3916 }
3917
3918 void resample_filter(int v, DATA_T *sp, int32 count)
3919 {
3920         buffer_filter(&voice[v].rf_fc, sp, count);
3921 }
3922
3923
3924 #ifdef MIX_VOICE_BATCH
3925
3926 #if MIX_VOICE_BATCH_SIZE != 8
3927 #error invalid MIX_VOICE_BATCH_SIZE
3928 #endif
3929
3930 #if (USE_X86_EXT_INTRIN >= 10) && defined(DATA_T_DOUBLE) && defined(FLOAT_T_DOUBLE)
3931
3932 static inline __mmask8 generate_mask8_for_count(int32 offset, int32 count)
3933 {
3934         if (offset < count) {
3935                 if (offset + 8 <= count)
3936                         return 0xFF;
3937                 else
3938                         return (1 << (count - offset)) - 1;
3939         }
3940         else
3941                 return 0;
3942 }
3943
3944 #endif
3945
3946 #if (USE_X86_EXT_INTRIN >= 10) && defined(DATA_T_DOUBLE) && defined(FLOAT_T_DOUBLE)
3947
3948 static void sample_filter_LPF_BW_batch(int batch_size, FILTER_T **dcs, FILTER_T **dbs, DATA_T **sps, int32 *counts)
3949 {
3950         for (int i = 0; i < MIX_VOICE_BATCH_SIZE; i += 8) {
3951                 if (i >= batch_size)
3952                         break;
3953
3954                 __m256i vcounts = _mm256_set_epi32(
3955                         i + 7 < batch_size ? counts[i + 7] : 0,
3956                         i + 6 < batch_size ? counts[i + 6] : 0,
3957                         i + 5 < batch_size ? counts[i + 5] : 0,
3958                         i + 4 < batch_size ? counts[i + 4] : 0,
3959                         i + 3 < batch_size ? counts[i + 3] : 0,
3960                         i + 2 < batch_size ? counts[i + 2] : 0,
3961                         i + 1 < batch_size ? counts[i + 1] : 0,
3962                         counts[i]
3963                 );
3964
3965                 __m256d vdb0123_0 = _mm256_loadu_pd(&dbs[i][0]);
3966                 __m256d vdb0123_1 = i + 1 < batch_size ? _mm256_loadu_pd(&dbs[i + 1][0]) : _mm256_setzero_pd();
3967                 __m256d vdb0123_2 = i + 2 < batch_size ? _mm256_loadu_pd(&dbs[i + 2][0]) : _mm256_setzero_pd();
3968                 __m256d vdb0123_3 = i + 3 < batch_size ? _mm256_loadu_pd(&dbs[i + 3][0]) : _mm256_setzero_pd();
3969                 __m256d vdb0123_4 = i + 4 < batch_size ? _mm256_loadu_pd(&dbs[i + 4][0]) : _mm256_setzero_pd();
3970                 __m256d vdb0123_5 = i + 5 < batch_size ? _mm256_loadu_pd(&dbs[i + 5][0]) : _mm256_setzero_pd();
3971                 __m256d vdb0123_6 = i + 6 < batch_size ? _mm256_loadu_pd(&dbs[i + 6][0]) : _mm256_setzero_pd();
3972                 __m256d vdb0123_7 = i + 7 < batch_size ? _mm256_loadu_pd(&dbs[i + 7][0]) : _mm256_setzero_pd();
3973
3974                 __m512d vdb0123_02 = _mm512_insertf64x4(_mm512_castpd256_pd512(vdb0123_0), vdb0123_2, 1);
3975                 __m512d vdb0123_13 = _mm512_insertf64x4(_mm512_castpd256_pd512(vdb0123_1), vdb0123_3, 1);
3976                 __m512d vdb0123_46 = _mm512_insertf64x4(_mm512_castpd256_pd512(vdb0123_4), vdb0123_6, 1);
3977                 __m512d vdb0123_57 = _mm512_insertf64x4(_mm512_castpd256_pd512(vdb0123_5), vdb0123_7, 1);
3978
3979                 __m512d vdb01_0246 = _mm512_shuffle_f64x2(vdb0123_02, vdb0123_46, (2 << 6) | (0 << 4) | (2 << 2) | 0);
3980                 __m512d vdb01_1357 = _mm512_shuffle_f64x2(vdb0123_13, vdb0123_57, (2 << 6) | (0 << 4) | (2 << 2) | 0);
3981                 __m512d vdb23_0246 = _mm512_shuffle_f64x2(vdb0123_02, vdb0123_46, (3 << 6) | (1 << 4) | (3 << 2) | 1);
3982                 __m512d vdb23_1357 = _mm512_shuffle_f64x2(vdb0123_13, vdb0123_57, (3 << 6) | (1 << 4) | (3 << 2) | 1);
3983
3984                 __m512d vdb0 = _mm512_unpacklo_pd(vdb01_0246, vdb01_1357);
3985                 __m512d vdb1 = _mm512_unpackhi_pd(vdb01_0246, vdb01_1357);
3986                 __m512d vdb2 = _mm512_unpacklo_pd(vdb23_0246, vdb23_1357);
3987                 __m512d vdb3 = _mm512_unpackhi_pd(vdb23_0246, vdb23_1357);
3988                 __m512d vdb4 = _mm512_set_pd(
3989                         i + 7 < batch_size ? dbs[i + 7][4] : 0.0,
3990                         i + 6 < batch_size ? dbs[i + 6][4] : 0.0,
3991                         i + 5 < batch_size ? dbs[i + 5][4] : 0.0,
3992                         i + 4 < batch_size ? dbs[i + 4][4] : 0.0,
3993                         i + 3 < batch_size ? dbs[i + 3][4] : 0.0,
3994                         i + 2 < batch_size ? dbs[i + 2][4] : 0.0,
3995                         i + 1 < batch_size ? dbs[i + 1][4] : 0.0,
3996                         dbs[i][4]
3997                 );
3998
3999                 __m256d vdc0123_0 = _mm256_loadu_pd(&dcs[i][0]);
4000                 __m256d vdc0123_1 = i + 1 < batch_size ? _mm256_loadu_pd(&dcs[i + 1][0]) : _mm256_setzero_pd();
4001                 __m256d vdc0123_2 = i + 2 < batch_size ? _mm256_loadu_pd(&dcs[i + 2][0]) : _mm256_setzero_pd();
4002                 __m256d vdc0123_3 = i + 3 < batch_size ? _mm256_loadu_pd(&dcs[i + 3][0]) : _mm256_setzero_pd();
4003                 __m256d vdc0123_4 = i + 4 < batch_size ? _mm256_loadu_pd(&dcs[i + 4][0]) : _mm256_setzero_pd();
4004                 __m256d vdc0123_5 = i + 5 < batch_size ? _mm256_loadu_pd(&dcs[i + 5][0]) : _mm256_setzero_pd();
4005                 __m256d vdc0123_6 = i + 6 < batch_size ? _mm256_loadu_pd(&dcs[i + 6][0]) : _mm256_setzero_pd();
4006                 __m256d vdc0123_7 = i + 7 < batch_size ? _mm256_loadu_pd(&dcs[i + 7][0]) : _mm256_setzero_pd();
4007
4008                 __m512d vdc0123_02 = _mm512_insertf64x4(_mm512_castpd256_pd512(vdc0123_0), vdc0123_2, 1);
4009                 __m512d vdc0123_13 = _mm512_insertf64x4(_mm512_castpd256_pd512(vdc0123_1), vdc0123_3, 1);
4010                 __m512d vdc0123_46 = _mm512_insertf64x4(_mm512_castpd256_pd512(vdc0123_4), vdc0123_6, 1);
4011                 __m512d vdc0123_57 = _mm512_insertf64x4(_mm512_castpd256_pd512(vdc0123_5), vdc0123_7, 1);
4012
4013                 __m512d vdc01_0246 = _mm512_shuffle_f64x2(vdc0123_02, vdc0123_46, (2 << 6) | (0 << 4) | (2 << 2) | 0);
4014                 __m512d vdc01_1357 = _mm512_shuffle_f64x2(vdc0123_13, vdc0123_57, (2 << 6) | (0 << 4) | (2 << 2) | 0);
4015                 __m512d vdc23_0246 = _mm512_shuffle_f64x2(vdc0123_02, vdc0123_46, (3 << 6) | (1 << 4) | (3 << 2) | 1);
4016                 __m512d vdc23_1357 = _mm512_shuffle_f64x2(vdc0123_13, vdc0123_57, (3 << 6) | (1 << 4) | (3 << 2) | 1);
4017
4018                 __m512d vdc0 = _mm512_unpacklo_pd(vdc01_0246, vdc01_1357);
4019                 __m512d vdc1 = _mm512_unpackhi_pd(vdc01_0246, vdc01_1357);
4020                 __m512d vdc2 = _mm512_unpacklo_pd(vdc23_0246, vdc23_1357);
4021                 __m512d vdc3 = _mm512_unpackhi_pd(vdc23_0246, vdc23_1357);
4022                 __m512d vdc4 = _mm512_set_pd(
4023                         i + 7 < batch_size ? dcs[i + 7][4] : 0.0,
4024                         i + 6 < batch_size ? dcs[i + 6][4] : 0.0,
4025                         i + 5 < batch_size ? dcs[i + 5][4] : 0.0,
4026                         i + 4 < batch_size ? dcs[i + 4][4] : 0.0,
4027                         i + 3 < batch_size ? dcs[i + 3][4] : 0.0,
4028                         i + 2 < batch_size ? dcs[i + 2][4] : 0.0,
4029                         i + 1 < batch_size ? dcs[i + 1][4] : 0.0,
4030                         dcs[i][4]
4031                 );
4032
4033                 __m128i vcounts_halfmax = _mm_max_epi32(_mm256_castsi256_si128(vcounts), _mm256_extracti128_si256(vcounts, 1));
4034                 vcounts_halfmax = _mm_max_epi32(vcounts_halfmax, _mm_shuffle_epi32(vcounts_halfmax, (3 << 2) | 2));
4035                 int32 count_max = _mm_cvtsi128_si32(_mm_max_epi32(vcounts_halfmax, _mm_shuffle_epi32(vcounts_halfmax, 1)));
4036
4037                 for (int32 j = 0; j < count_max; j += 8) {
4038                         __m512d vin[8];
4039                         vin[0] = _mm512_maskz_loadu_pd(generate_mask8_for_count(j, counts[i]), &sps[i][j]);
4040
4041                         for (int k = 1; k < 8; k++)
4042                                 vin[k] = _mm512_maskz_loadu_pd(i + k < batch_size ? generate_mask8_for_count(j, counts[i + k]) : 0, & sps[i + k][j]);
4043
4044                         __m512d vsp0246_01 = _mm512_unpacklo_pd(vin[0], vin[1]);
4045                         __m512d vsp1357_01 = _mm512_unpackhi_pd(vin[0], vin[1]);
4046                         __m512d vsp0246_23 = _mm512_unpacklo_pd(vin[2], vin[3]);
4047                         __m512d vsp1357_23 = _mm512_unpackhi_pd(vin[2], vin[3]);
4048                         __m512d vsp0246_45 = _mm512_unpacklo_pd(vin[4], vin[5]);
4049                         __m512d vsp1357_45 = _mm512_unpackhi_pd(vin[4], vin[5]);
4050                         __m512d vsp0246_67 = _mm512_unpacklo_pd(vin[6], vin[7]);
4051                         __m512d vsp1357_67 = _mm512_unpackhi_pd(vin[6], vin[7]);
4052
4053                         __m512d vsp04_0123 = _mm512_shuffle_f64x2(vsp0246_01, vsp0246_23, (2 << 6) | (0 << 4) | (2 << 2) | 0);
4054                         __m512d vsp26_0123 = _mm512_shuffle_f64x2(vsp0246_01, vsp0246_23, (3 << 6) | (1 << 4) | (3 << 2) | 1);
4055                         __m512d vsp15_0123 = _mm512_shuffle_f64x2(vsp1357_01, vsp1357_23, (2 << 6) | (0 << 4) | (2 << 2) | 0);
4056                         __m512d vsp37_0123 = _mm512_shuffle_f64x2(vsp1357_01, vsp1357_23, (3 << 6) | (1 << 4) | (3 << 2) | 1);
4057                         __m512d vsp04_4567 = _mm512_shuffle_f64x2(vsp0246_45, vsp0246_67, (2 << 6) | (0 << 4) | (2 << 2) | 0);
4058                         __m512d vsp26_4567 = _mm512_shuffle_f64x2(vsp0246_45, vsp0246_67, (3 << 6) | (1 << 4) | (3 << 2) | 1);
4059                         __m512d vsp15_4567 = _mm512_shuffle_f64x2(vsp1357_45, vsp1357_67, (2 << 6) | (0 << 4) | (2 << 2) | 0);
4060                         __m512d vsp37_4567 = _mm512_shuffle_f64x2(vsp1357_45, vsp1357_67, (3 << 6) | (1 << 4) | (3 << 2) | 1);
4061
4062                         __m512d vsps[8];
4063                         vsps[0] = _mm512_shuffle_f64x2(vsp04_0123, vsp04_4567, (2 << 6) | (0 << 4) | (2 << 2) | 0);
4064                         vsps[4] = _mm512_shuffle_f64x2(vsp04_0123, vsp04_4567, (3 << 6) | (1 << 4) | (3 << 2) | 1);
4065                         vsps[1] = _mm512_shuffle_f64x2(vsp15_0123, vsp15_4567, (2 << 6) | (0 << 4) | (2 << 2) | 0);
4066                         vsps[5] = _mm512_shuffle_f64x2(vsp15_0123, vsp15_4567, (3 << 6) | (1 << 4) | (3 << 2) | 1);
4067                         vsps[2] = _mm512_shuffle_f64x2(vsp26_0123, vsp26_4567, (2 << 6) | (0 << 4) | (2 << 2) | 0);
4068                         vsps[6] = _mm512_shuffle_f64x2(vsp26_0123, vsp26_4567, (3 << 6) | (1 << 4) | (3 << 2) | 1);
4069                         vsps[3] = _mm512_shuffle_f64x2(vsp37_0123, vsp37_4567, (2 << 6) | (0 << 4) | (2 << 2) | 0);
4070                         vsps[7] = _mm512_shuffle_f64x2(vsp37_0123, vsp37_4567, (3 << 6) | (1 << 4) | (3 << 2) | 1);
4071
4072                         for (int k = 0; k < 8; k++) {
4073                                 __mmask8 kmask = _mm256_cmplt_epi32_mask(_mm256_set1_epi32(j + k), vcounts);
4074
4075                                 vdb0 = _mm512_mask_mov_pd(vdb0, kmask, vsps[k]);
4076                                 vdb2 = _mm512_mask_fmadd_pd(vdb2, kmask, vdc2, _mm512_add_pd(_mm512_fmadd_pd(vdc0, vdb0, _mm512_mul_pd(vdc1, vdb1)), _mm512_fmadd_pd(vdc3, vdb3, _mm512_mul_pd(vdc4, vdb4))));
4077
4078 #ifdef DENORMAL_FIX
4079                                 vdb2 = _mm512_mask_add_pd(vdb2, kmask, vdb2, _mm512_set1_pd(denormal_add));
4080 #endif
4081                                 vdb4 = _mm512_mask_mov_pd(vdb4, kmask, vdb3);
4082                                 vdb3 = _mm512_mask_mov_pd(vdb3, kmask, vdb2);
4083                                 vdb2 = _mm512_mask_mov_pd(vdb2, kmask, vdb1);
4084                                 vdb1 = _mm512_mask_mov_pd(vdb1, kmask, vdb0);
4085                                 vsps[k] = vdb3;
4086                         }
4087
4088                         __m512d vsp01_0246 = _mm512_unpacklo_pd(vsps[0], vsps[1]);
4089                         __m512d vsp01_1357 = _mm512_unpackhi_pd(vsps[0], vsps[1]);
4090                         __m512d vsp23_0246 = _mm512_unpacklo_pd(vsps[2], vsps[3]);
4091                         __m512d vsp23_1357 = _mm512_unpackhi_pd(vsps[2], vsps[3]);
4092                         __m512d vsp45_0246 = _mm512_unpacklo_pd(vsps[4], vsps[5]);
4093                         __m512d vsp45_1357 = _mm512_unpackhi_pd(vsps[4], vsps[5]);
4094                         __m512d vsp67_0246 = _mm512_unpacklo_pd(vsps[6], vsps[7]);
4095                         __m512d vsp67_1357 = _mm512_unpackhi_pd(vsps[6], vsps[7]);
4096
4097                         __m512d vsp0123_04 = _mm512_shuffle_f64x2(vsp01_0246, vsp23_0246, (2 << 6) | (0 << 4) | (2 << 2) | 0);
4098                         __m512d vsp0123_26 = _mm512_shuffle_f64x2(vsp01_0246, vsp23_0246, (3 << 6) | (1 << 4) | (3 << 2) | 1);
4099                         __m512d vsp0123_15 = _mm512_shuffle_f64x2(vsp01_1357, vsp23_1357, (2 << 6) | (0 << 4) | (2 << 2) | 0);
4100                         __m512d vsp0123_37 = _mm512_shuffle_f64x2(vsp01_1357, vsp23_1357, (3 << 6) | (1 << 4) | (3 << 2) | 1);
4101                         __m512d vsp4567_04 = _mm512_shuffle_f64x2(vsp45_0246, vsp67_0246, (2 << 6) | (0 << 4) | (2 << 2) | 0);
4102                         __m512d vsp4567_26 = _mm512_shuffle_f64x2(vsp45_0246, vsp67_0246, (3 << 6) | (1 << 4) | (3 << 2) | 1);
4103                         __m512d vsp4567_15 = _mm512_shuffle_f64x2(vsp45_1357, vsp67_1357, (2 << 6) | (0 << 4) | (2 << 2) | 0);
4104                         __m512d vsp4567_37 = _mm512_shuffle_f64x2(vsp45_1357, vsp67_1357, (3 << 6) | (1 << 4) | (3 << 2) | 1);
4105
4106                         __m512d vout[8];
4107                         vout[0] = _mm512_shuffle_f64x2(vsp0123_04, vsp4567_04, (2 << 6) | (0 << 4) | (2 << 2) | 0);
4108                         vout[4] = _mm512_shuffle_f64x2(vsp0123_04, vsp4567_04, (3 << 6) | (1 << 4) | (3 << 2) | 1);
4109                         vout[1] = _mm512_shuffle_f64x2(vsp0123_15, vsp4567_15, (2 << 6) | (0 << 4) | (2 << 2) | 0);
4110                         vout[5] = _mm512_shuffle_f64x2(vsp0123_15, vsp4567_15, (3 << 6) | (1 << 4) | (3 << 2) | 1);
4111                         vout[2] = _mm512_shuffle_f64x2(vsp0123_26, vsp4567_26, (2 << 6) | (0 << 4) | (2 << 2) | 0);
4112                         vout[6] = _mm512_shuffle_f64x2(vsp0123_26, vsp4567_26, (3 << 6) | (1 << 4) | (3 << 2) | 1);
4113                         vout[3] = _mm512_shuffle_f64x2(vsp0123_37, vsp4567_37, (2 << 6) | (0 << 4) | (2 << 2) | 0);
4114                         vout[7] = _mm512_shuffle_f64x2(vsp0123_37, vsp4567_37, (3 << 6) | (1 << 4) | (3 << 2) | 1);
4115
4116                         for (int k = 0; k < batch_size; k++)
4117                                 _mm512_mask_storeu_pd(&sps[i + k][j], generate_mask8_for_count(j, counts[i + k]), vout[k]);
4118                 }
4119
4120                 vdb01_0246 = _mm512_unpacklo_pd(vdb0, vdb1);
4121                 vdb01_1357 = _mm512_unpackhi_pd(vdb0, vdb1);
4122                 vdb23_0246 = _mm512_unpacklo_pd(vdb2, vdb3);
4123                 vdb23_1357 = _mm512_unpackhi_pd(vdb2, vdb3);
4124
4125                 __m512d vdb0123_04 = _mm512_permutex2var_pd(vdb01_0246, _mm512_set_epi64(13, 12, 5, 4, 9, 8, 1, 0), vdb23_0246);
4126                 __m512d vdb0123_15 = _mm512_permutex2var_pd(vdb01_1357, _mm512_set_epi64(13, 12, 5, 4, 9, 8, 1, 0), vdb23_1357);
4127                 __m512d vdb0123_26 = _mm512_permutex2var_pd(vdb01_0246, _mm512_set_epi64(15, 14, 7, 6, 11, 10, 3, 2), vdb23_0246);
4128                 __m512d vdb0123_37 = _mm512_permutex2var_pd(vdb01_1357, _mm512_set_epi64(15, 14, 7, 6, 11, 10, 3, 2), vdb23_1357);
4129
4130                 _mm256_storeu_pd(&dbs[i][0], _mm512_castpd512_pd256(vdb0123_04));
4131                 _mm_storel_pd(&dbs[i][4], _mm512_castpd512_pd128(vdb4));
4132
4133                 if (i + 1 < batch_size) {
4134                         _mm256_storeu_pd(&dbs[i + 1][0], _mm512_castpd512_pd256(vdb0123_15));
4135                         _mm_storeh_pd(&dbs[i + 1][4], _mm512_castpd512_pd128(vdb4));
4136                 }
4137
4138                 if (i + 2 < batch_size) {
4139                         _mm256_storeu_pd(&dbs[i + 2][0], _mm512_castpd512_pd256(vdb0123_26));
4140                         _mm_storel_pd(&dbs[i + 2][4], _mm256_extractf128_pd(_mm512_castpd512_pd256(vdb4), 1));
4141                 }
4142
4143                 if (i + 3 < batch_size) {
4144                         _mm256_storeu_pd(&dbs[i + 3][0], _mm512_castpd512_pd256(vdb0123_37));
4145                         _mm_storeh_pd(&dbs[i + 3][4], _mm256_extractf128_pd(_mm512_castpd512_pd256(vdb4), 1));
4146                 }
4147
4148                 if (i + 4 < batch_size) {
4149                         _mm256_storeu_pd(&dbs[i + 4][0], _mm512_extractf64x4_pd(vdb0123_04, 1));
4150                         _mm_storel_pd(&dbs[i + 4][4], _mm512_extractf64x2_pd(vdb4, 2));
4151                 }
4152
4153                 if (i + 5 < batch_size) {
4154                         _mm256_storeu_pd(&dbs[i + 5][0], _mm512_extractf64x4_pd(vdb0123_15, 1));
4155                         _mm_storeh_pd(&dbs[i + 5][4], _mm512_extractf64x2_pd(vdb4, 2));
4156                 }
4157
4158                 if (i + 6 < batch_size) {
4159                         _mm256_storeu_pd(&dbs[i + 6][0], _mm512_extractf64x4_pd(vdb0123_26, 1));
4160                         _mm_storel_pd(&dbs[i + 6][4], _mm512_extractf64x2_pd(vdb4, 3));
4161                 }
4162
4163                 if (i + 7 < batch_size) {
4164                         _mm256_storeu_pd(&dbs[i + 7][0], _mm512_extractf64x4_pd(vdb0123_37, 1));
4165                         _mm_storeh_pd(&dbs[i + 7][4], _mm512_extractf64x2_pd(vdb4, 3));
4166                 }
4167         }
4168 }
4169
4170 #elif (USE_X86_EXT_INTRIN >= 8) && defined(DATA_T_DOUBLE) && defined(FLOAT_T_DOUBLE)
4171
4172 static void sample_filter_LPF_BW_batch(int batch_size, FILTER_T **dcs, FILTER_T **dbs, DATA_T **sps, int32 *counts)
4173 {
4174         for (int i = 0; i < MIX_VOICE_BATCH_SIZE; i += 4) {
4175                 if (i >= batch_size)
4176                         break;
4177
4178                 __m128i vcounts = _mm_set_epi32(
4179                         i + 3 < batch_size ? counts[i + 3] : 0,
4180                         i + 2 < batch_size ? counts[i + 2] : 0,
4181                         i + 1 < batch_size ? counts[i + 1] : 0,
4182                         counts[i]
4183                 );
4184
4185                 __m256d vdb0123_0 = _mm256_loadu_pd(&dbs[i][0]);
4186                 __m256d vdb0123_1 = i + 1 < batch_size ? _mm256_loadu_pd(&dbs[i + 1][0]) : _mm256_setzero_pd();
4187                 __m256d vdb0123_2 = i + 2 < batch_size ? _mm256_loadu_pd(&dbs[i + 2][0]) : _mm256_setzero_pd();
4188                 __m256d vdb0123_3 = i + 3 < batch_size ? _mm256_loadu_pd(&dbs[i + 3][0]) : _mm256_setzero_pd();
4189
4190                 __m256d vdb01_02 = _mm256_permute2f128_pd(vdb0123_0, vdb0123_2, (2 << 4) | 0);
4191                 __m256d vdb01_13 = _mm256_permute2f128_pd(vdb0123_1, vdb0123_3, (2 << 4) | 0);
4192                 __m256d vdb23_02 = _mm256_permute2f128_pd(vdb0123_0, vdb0123_2, (3 << 4) | 1);
4193                 __m256d vdb23_13 = _mm256_permute2f128_pd(vdb0123_1, vdb0123_3, (3 << 4) | 1);
4194
4195                 __m256d vdb0 = _mm256_unpacklo_pd(vdb01_02, vdb01_13);
4196                 __m256d vdb1 = _mm256_unpackhi_pd(vdb01_02, vdb01_13);
4197                 __m256d vdb2 = _mm256_unpacklo_pd(vdb23_02, vdb23_13);
4198                 __m256d vdb3 = _mm256_unpackhi_pd(vdb23_02, vdb23_13);
4199                 __m256d vdb4 = _mm256_set_pd(
4200                         i + 3 < batch_size ? dbs[i + 3][4] : 0.0,
4201                         i + 2 < batch_size ? dbs[i + 2][4] : 0.0,
4202                         i + 1 < batch_size ? dbs[i + 1][4] : 0.0,
4203                         dbs[i][4]
4204                 );
4205
4206                 __m256d vdc0123_0 = _mm256_loadu_pd(&dcs[i][0]);
4207                 __m256d vdc0123_1 = i + 1 < batch_size ? _mm256_loadu_pd(&dcs[i + 1][0]) : _mm256_setzero_pd();
4208                 __m256d vdc0123_2 = i + 2 < batch_size ? _mm256_loadu_pd(&dcs[i + 2][0]) : _mm256_setzero_pd();
4209                 __m256d vdc0123_3 = i + 3 < batch_size ? _mm256_loadu_pd(&dcs[i + 3][0]) : _mm256_setzero_pd();
4210
4211                 __m256d vdc01_02 = _mm256_permute2f128_pd(vdc0123_0, vdc0123_2, (2 << 4) | 0);
4212                 __m256d vdc01_13 = _mm256_permute2f128_pd(vdc0123_1, vdc0123_3, (2 << 4) | 0);
4213                 __m256d vdc23_02 = _mm256_permute2f128_pd(vdc0123_0, vdc0123_2, (3 << 4) | 1);
4214                 __m256d vdc23_13 = _mm256_permute2f128_pd(vdc0123_1, vdc0123_3, (3 << 4) | 1);
4215
4216                 __m256d vdc0 = _mm256_unpacklo_pd(vdc01_02, vdc01_13);
4217                 __m256d vdc1 = _mm256_unpackhi_pd(vdc01_02, vdc01_13);
4218                 __m256d vdc2 = _mm256_unpacklo_pd(vdc23_02, vdc23_13);
4219                 __m256d vdc3 = _mm256_unpackhi_pd(vdc23_02, vdc23_13);
4220                 __m256d vdc4 = _mm256_set_pd(
4221                         i + 3 < batch_size ? dcs[i + 3][4] : 0.0,
4222                         i + 2 < batch_size ? dcs[i + 2][4] : 0.0,
4223                         i + 1 < batch_size ? dcs[i + 1][4] : 0.0,
4224                         dcs[i][4]
4225                 );
4226
4227                 __m128i vcounts_halfmax = _mm_max_epi32(vcounts, _mm_shuffle_epi32(vcounts, (3 << 2) | 2));
4228                 int32 count_max = _mm_cvtsi128_si32(_mm_max_epi32(vcounts_halfmax, _mm_shuffle_epi32(vcounts_halfmax, 1)));
4229
4230                 for (int32 j = 0; j < count_max; j += 4) {
4231                         __m256d vsp0123_0 = j < counts[i] ? _mm256_loadu_pd(&sps[i][j]) : _mm256_setzero_pd();
4232                         __m256d vsp0123_1 = i + 1 < batch_size && j < counts[i + 1] ? _mm256_loadu_pd(&sps[i + 1][j]) : _mm256_setzero_pd();
4233                         __m256d vsp0123_2 = i + 1 < batch_size && j < counts[i + 2] ? _mm256_loadu_pd(&sps[i + 2][j]) : _mm256_setzero_pd();
4234                         __m256d vsp0123_3 = i + 1 < batch_size && j < counts[i + 3] ? _mm256_loadu_pd(&sps[i + 3][j]) : _mm256_setzero_pd();
4235
4236                         __m256d vsp01_02 = _mm256_permute2f128_pd(vsp0123_0, vsp0123_2, (2 << 4) | 0);
4237                         __m256d vsp01_13 = _mm256_permute2f128_pd(vsp0123_1, vsp0123_3, (2 << 4) | 0);
4238                         __m256d vsp23_02 = _mm256_permute2f128_pd(vsp0123_0, vsp0123_2, (3 << 4) | 1);
4239                         __m256d vsp23_13 = _mm256_permute2f128_pd(vsp0123_1, vsp0123_3, (3 << 4) | 1);
4240
4241                         __m256d vsps[4];
4242                         vsps[0] = _mm256_unpacklo_pd(vsp01_02, vsp01_13);
4243                         vsps[1] = _mm256_unpackhi_pd(vsp01_02, vsp01_13);
4244                         vsps[2] = _mm256_unpacklo_pd(vsp23_02, vsp23_13);
4245                         vsps[3] = _mm256_unpackhi_pd(vsp23_02, vsp23_13);
4246
4247                         for (int k = 0; k < 4; k++) {
4248                                 __m256d vmask = _mm256_castsi256_pd(_mm256_cvtepi32_epi64(_mm_cmplt_epi32(_mm_set1_epi32(j + k), vcounts)));
4249
4250                                 vdb0 = _mm256_blendv_pd(vdb0, vsps[k], vmask);
4251                                 vdb2 = _mm256_blendv_pd(vdb2, MM256_FMA_PD(vdc0, vdb0, MM256_FMA4_PD(vdc1, vdb1, vdc2, vdb2, vdc3, vdb3, vdc4, vdb4)), vmask);
4252
4253 #ifdef DENORMAL_FIX
4254                                 vdb2 = _mm256_blendv_pd(vdb2, _mm256_add_pd(vdb2, _mm_set1_pd(denormal_add)), vmask);
4255 #endif
4256                                 vdb4 = _mm256_blendv_pd(vdb4, vdb3, vmask);
4257                                 vdb3 = _mm256_blendv_pd(vdb3, vdb2, vmask);
4258                                 vdb2 = _mm256_blendv_pd(vdb2, vdb1, vmask);
4259                                 vdb1 = _mm256_blendv_pd(vdb1, vdb0, vmask);
4260                                 vsps[k] = vdb3;
4261                         }
4262
4263                         vsp01_02 = _mm256_unpacklo_pd(vsps[0], vsps[1]);
4264                         vsp01_13 = _mm256_unpackhi_pd(vsps[0], vsps[1]);
4265                         vsp23_02 = _mm256_unpacklo_pd(vsps[2], vsps[3]);
4266                         vsp23_13 = _mm256_unpackhi_pd(vsps[2], vsps[3]);
4267
4268                         vsp0123_0 = _mm256_permute2f128_pd(vsp01_02, vsp23_02, (2 << 4) | 0);
4269                         vsp0123_1 = _mm256_permute2f128_pd(vsp01_13, vsp23_13, (2 << 4) | 0);
4270                         vsp0123_2 = _mm256_permute2f128_pd(vsp01_02, vsp23_02, (3 << 4) | 1);
4271                         vsp0123_3 = _mm256_permute2f128_pd(vsp01_13, vsp23_13, (3 << 4) | 1);
4272
4273                         if (j < counts[i])
4274                                 _mm256_storeu_pd(&sps[i][j], vsp0123_0);
4275
4276                         if (i + 1 < batch_size && j < counts[i + 1])
4277                                 _mm256_storeu_pd(&sps[i + 1][j], vsp0123_1);
4278
4279                         if (i + 2 < batch_size && j < counts[i + 2])
4280                                 _mm256_storeu_pd(&sps[i + 2][j], vsp0123_2);
4281
4282                         if (i + 3 < batch_size && j < counts[i + 3])
4283                                 _mm256_storeu_pd(&sps[i + 3][j], vsp0123_3);
4284                 }
4285
4286                 vdb01_02 = _mm256_unpacklo_pd(vdb0, vdb1);
4287                 vdb01_13 = _mm256_unpackhi_pd(vdb0, vdb1);
4288                 vdb23_02 = _mm256_unpacklo_pd(vdb2, vdb3);
4289                 vdb23_13 = _mm256_unpackhi_pd(vdb2, vdb3);
4290
4291                 vdb0123_0 = _mm256_permute2f128_pd(vdb01_02, vdb23_02, (2 << 4) | 0);
4292                 vdb0123_1 = _mm256_permute2f128_pd(vdb01_13, vdb23_13, (2 << 4) | 0);
4293                 vdb0123_2 = _mm256_permute2f128_pd(vdb01_02, vdb23_02, (3 << 4) | 1);
4294                 vdb0123_3 = _mm256_permute2f128_pd(vdb01_13, vdb23_13, (3 << 4) | 1);
4295
4296                 _mm256_storeu_pd(&dbs[i][0], vdb0123_0);
4297                 _mm_storel_pd(&dbs[i][4], _mm256_castpd256_pd128(vdb4));
4298
4299                 if (i + 1 < batch_size) {
4300                         _mm256_storeu_pd(&dbs[i + 1][0], vdb0123_1);
4301                         _mm_storeh_pd(&dbs[i + 1][4], _mm256_castpd256_pd128(vdb4));
4302                 }
4303
4304                 if (i + 2 < batch_size) {
4305                         _mm256_storeu_pd(&dbs[i + 2][0], vdb0123_2);
4306                         _mm_storel_pd(&dbs[i + 2][4], _mm256_extractf128_pd(vdb4, 1));
4307                 }
4308
4309                 if (i + 3 < batch_size) {
4310                         _mm256_storeu_pd(&dbs[i + 3][0], vdb0123_3);
4311                         _mm_storeh_pd(&dbs[i + 3][4], _mm256_extractf128_pd(vdb4, 1));
4312                 }
4313         }
4314 }
4315
4316 #elif (USE_X86_EXT_INTRIN >= 3) && defined(DATA_T_DOUBLE) && defined(FLOAT_T_DOUBLE)
4317
4318 static void sample_filter_LPF_BW_batch(int batch_size, FILTER_T **dcs, FILTER_T **dbs, DATA_T **sps, int32 *counts)
4319 {
4320         for (int i = 0; i < MIX_VOICE_BATCH_SIZE; i += 2) {
4321                 if (i >= batch_size)
4322                         break;
4323
4324                 __m128i vcounts = _mm_set_epi32(
4325                         0,
4326                         0,
4327                         i + 1 < batch_size ? counts[i + 1] : 0,
4328                         counts[i]
4329                 );
4330
4331                 __m128d vdb01_0 = _mm_loadu_pd(&dbs[i][0]);
4332                 __m128d vdb23_0 = _mm_loadu_pd(&dbs[i][2]);
4333                 __m128d vdb01_1 = i + 1 < batch_size ? _mm_loadu_pd(&dbs[i + 1][0]) : _mm_setzero_pd();
4334                 __m128d vdb23_1 = i + 1 < batch_size ? _mm_loadu_pd(&dbs[i + 1][2]) : _mm_setzero_pd();
4335
4336                 __m128d vdb0 = _mm_unpacklo_pd(vdb01_0, vdb01_1);
4337                 __m128d vdb1 = _mm_unpackhi_pd(vdb01_0, vdb01_1);
4338                 __m128d vdb2 = _mm_unpacklo_pd(vdb23_0, vdb23_1);
4339                 __m128d vdb3 = _mm_unpackhi_pd(vdb23_0, vdb23_1);
4340                 __m128d vdb4 = _mm_set_pd(
4341                         i + 1 < batch_size ? dbs[i + 1][4] : 0.0,
4342                         dbs[i][4]
4343                 );
4344
4345                 __m128d vdc01_0 = _mm_loadu_pd(&dcs[i][0]);
4346                 __m128d vdc23_0 = _mm_loadu_pd(&dcs[i][2]);
4347                 __m128d vdc01_1 = i + 1 < batch_size ? _mm_loadu_pd(&dcs[i + 1][0]) : _mm_setzero_pd();
4348                 __m128d vdc23_1 = i + 1 < batch_size ? _mm_loadu_pd(&dcs[i + 1][2]) : _mm_setzero_pd();
4349
4350                 __m128d vdc0 = _mm_unpacklo_pd(vdc01_0, vdc01_1);
4351                 __m128d vdc1 = _mm_unpackhi_pd(vdc01_0, vdc01_1);
4352                 __m128d vdc2 = _mm_unpacklo_pd(vdc23_0, vdc23_1);
4353                 __m128d vdc3 = _mm_unpackhi_pd(vdc23_0, vdc23_1);
4354                 __m128d vdc4 = _mm_set_pd(
4355                         i + 1 < batch_size ? dcs[i + 1][4] : 0.0,
4356                         dcs[i][4]
4357                 );
4358
4359                 int32 count_max = _mm_cvtsi128_si32(_mm_max_epi32(vcounts, _mm_shuffle_epi32(vcounts, 1)));
4360
4361                 for (int32 j = 0; j < count_max; j += 2) {
4362                         __m128d vsp01_0 = j < counts[i] ? _mm_loadu_pd(&sps[i][j]) : _mm_setzero_pd();
4363                         __m128d vsp01_1 = i + 1 < batch_size && j < counts[i + 1] ? _mm_loadu_pd(&sps[i + 1][j]) : _mm_setzero_pd();
4364
4365                         __m128d vsps[2];
4366                         vsps[0] = _mm_unpacklo_pd(vsp01_0, vsp01_1);
4367                         vsps[1] = _mm_unpackhi_pd(vsp01_0, vsp01_1);
4368
4369                         for (int k = 0; k < 2; k++) {
4370                                 __m128d vmask = _mm_castsi128_pd(_mm_cvtepi32_epi64(_mm_cmplt_epi32(_mm_set1_epi32(j + k), vcounts)));
4371
4372 #if USE_X86_EXT_INTRIN >= 6
4373                                 vdb0 = _mm_blendv_pd(vdb0, vsps[k], vmask);
4374                                 vdb2 = _mm_blendv_pd(vdb2, MM_FMA5_PD(vdc0, vdb0, vdc1, vdb1, vdc2, vdb2, vdc3, vdb3, vdc4, vdb4), vmask);
4375
4376 #ifdef DENORMAL_FIX
4377                                 vdb2 = _mm_blendv_pd(vdb2, _mm_add_pd(vdb2, _mm_set1_pd(denormal_add)), vmask);
4378 #endif
4379                                 vdb4 = _mm_blendv_pd(vdb4, vdb3, vmask);
4380                                 vdb3 = _mm_blendv_pd(vdb3, vdb2, vmask);
4381                                 vdb2 = _mm_blendv_pd(vdb2, vdb1, vmask);
4382                                 vdb1 = _mm_blendv_pd(vdb1, vdb0, vmask);
4383 #else
4384                                 vdb0 = _mm_or_pd(_mm_andnot_pd(vmask, vdb0), _mm_and_pd(vmask, vsps[k]));
4385                                 vdb2 = _mm_or_pd(_mm_andnot_pd(vmask, vdb2), _mm_and_pd(vmask, MM_FMA5_PD(vdc0, vdb0, vdc1, vdb1, vdc2, vdb2, vdc3, vdb3, vdc4, vdb4)));
4386
4387 #ifdef DENORMAL_FIX
4388                                 vdb2 = _mm_or_pd(_mm_andnot_pd(vmask, vdb2), _mm_and_pd(vmask, _mm_add_pd(vdb2, _mm_set1_pd(denormal_add))));
4389 #endif
4390                                 vdb4 = _mm_or_pd(_mm_andnot_pd(vmask, vdb4), _mm_and_pd(vmask, vdb3));
4391                                 vdb3 = _mm_or_pd(_mm_andnot_pd(vmask, vdb3), _mm_and_pd(vmask, vdb2));
4392                                 vdb2 = _mm_or_pd(_mm_andnot_pd(vmask, vdb2), _mm_and_pd(vmask, vdb1));
4393                                 vdb1 = _mm_or_pd(_mm_andnot_pd(vmask, vdb1), _mm_and_pd(vmask, vdb0));
4394 #endif
4395                                 vsps[k] = vdb3;
4396                         }
4397
4398                         vsp01_0 = _mm_unpacklo_pd(vsps[0], vsps[1]);
4399                         vsp01_1 = _mm_unpackhi_pd(vsps[0], vsps[1]);
4400
4401                         if (j < counts[i])
4402                                 _mm_storeu_pd(&sps[i][j], vsp01_0);
4403
4404                         if (i + 1 < batch_size && j < counts[i + 1])
4405                                 _mm_storeu_pd(&sps[i + 1][j], vsp01_1);
4406                 }
4407
4408                 vdb01_0 = _mm_unpacklo_pd(vdb0, vdb1);
4409                 vdb01_1 = _mm_unpackhi_pd(vdb0, vdb1);
4410                 vdb23_0 = _mm_unpacklo_pd(vdb2, vdb3);
4411                 vdb23_1 = _mm_unpackhi_pd(vdb2, vdb3);
4412
4413                 _mm_storeu_pd(&dbs[i][0], vdb01_0);
4414                 _mm_storeu_pd(&dbs[i][2], vdb23_0);
4415                 _mm_storel_pd(&dbs[i][4], vdb4);
4416
4417                 if (i + 1 < batch_size) {
4418                         _mm_storeu_pd(&dbs[i + 1][0], vdb01_1);
4419                         _mm_storeu_pd(&dbs[i + 1][2], vdb23_1);
4420                         _mm_storeh_pd(&dbs[i + 1][4], vdb4);
4421                 }
4422         }
4423
4424
4425 #endif
4426
4427 #if (USE_X86_EXT_INTRIN >= 10) && defined(DATA_T_DOUBLE) && defined(FLOAT_T_DOUBLE)
4428
4429 static void recalc_filter_LPF_BW_batch(int batch_size, FilterCoefficients **fcs)
4430 {
4431         for (int i = 0; i < MIX_VOICE_BATCH_SIZE; i += 8) {
4432                 if (i >= batch_size)
4433                         break;
4434
4435                 __m256d vfcrange0123[8];
4436                 vfcrange0123[0] = _mm256_loadu_pd(fcs[i]->range);
4437
4438                 for (int j = 1; j < 8; j++)
4439                         vfcrange0123[j] = i + j < batch_size ? _mm256_loadu_pd(fcs[i + j]->range) : _mm256_setzero_pd();
4440
4441                 __m512d vfcrange0123_02 = _mm512_insertf64x4(_mm512_castpd256_pd512(vfcrange0123[0]), vfcrange0123[2], 1);
4442                 __m512d vfcrange0123_13 = _mm512_insertf64x4(_mm512_castpd256_pd512(vfcrange0123[1]), vfcrange0123[3], 1);
4443                 __m512d vfcrange0123_46 = _mm512_insertf64x4(_mm512_castpd256_pd512(vfcrange0123[4]), vfcrange0123[6], 1);
4444                 __m512d vfcrange0123_57 = _mm512_insertf64x4(_mm512_castpd256_pd512(vfcrange0123[5]), vfcrange0123[7], 1);
4445
4446                 __m512d vfcrange01_0246 = _mm512_shuffle_f64x2(vfcrange0123_02, vfcrange0123_46, (2 << 6) | (0 << 4) | (2 << 2) | 0);
4447                 __m512d vfcrange01_1357 = _mm512_shuffle_f64x2(vfcrange0123_13, vfcrange0123_57, (2 << 6) | (0 << 4) | (2 << 2) | 0);
4448                 __m512d vfcrange23_0246 = _mm512_shuffle_f64x2(vfcrange0123_02, vfcrange0123_46, (3 << 6) | (1 << 4) | (3 << 2) | 1);
4449                 __m512d vfcrange23_1357 = _mm512_shuffle_f64x2(vfcrange0123_13, vfcrange0123_57, (3 << 6) | (1 << 4) | (3 << 2) | 1);
4450
4451                 __m512d vfcrange0 = _mm512_unpacklo_pd(vfcrange01_0246, vfcrange01_1357);
4452                 __m512d vfcrange1 = _mm512_unpackhi_pd(vfcrange01_0246, vfcrange01_1357);
4453                 __m512d vfcrange2 = _mm512_unpacklo_pd(vfcrange23_0246, vfcrange23_1357);
4454                 __m512d vfcrange3 = _mm512_unpackhi_pd(vfcrange23_0246, vfcrange23_1357);
4455
4456                 __m512d vfcfreq = _mm512_set_pd(
4457                         7 < batch_size ? fcs[7]->freq : 0.0,
4458                         6 < batch_size ? fcs[6]->freq : 0.0,
4459                         5 < batch_size ? fcs[5]->freq : 0.0,
4460                         4 < batch_size ? fcs[4]->freq : 0.0,
4461                         3 < batch_size ? fcs[3]->freq : 0.0,
4462                         2 < batch_size ? fcs[2]->freq : 0.0,
4463                         1 < batch_size ? fcs[1]->freq : 0.0,
4464                         fcs[0]->freq
4465                 );
4466
4467                 __m512d vfcreso_DB = _mm512_set_pd(
4468                         7 < batch_size ? fcs[7]->reso_dB : 0.0,
4469                         6 < batch_size ? fcs[6]->reso_dB : 0.0,
4470                         5 < batch_size ? fcs[5]->reso_dB : 0.0,
4471                         4 < batch_size ? fcs[4]->reso_dB : 0.0,
4472                         3 < batch_size ? fcs[3]->reso_dB : 0.0,
4473                         2 < batch_size ? fcs[2]->reso_dB : 0.0,
4474                         1 < batch_size ? fcs[1]->reso_dB : 0.0,
4475                         fcs[0]->reso_dB
4476                 );
4477
4478                 uint8 imask = _kor_mask8(
4479                         _kor_mask8(_mm512_cmp_pd_mask(vfcfreq, vfcrange0, _CMP_LT_OS), _mm512_cmp_pd_mask(vfcfreq, vfcrange1, _CMP_GT_OS)),
4480                         _kor_mask8(_mm512_cmp_pd_mask(vfcreso_DB, vfcrange2, _CMP_LT_OS), _mm512_cmp_pd_mask(vfcreso_DB, vfcrange3, _CMP_GT_OS))
4481                 ) & ((1 << (batch_size - i)) - 1);
4482
4483                 if (imask) {
4484                         __m512d v1mmargin = _mm512_set1_pd(1.0 - ext_filter_margin);
4485                         __m512d v1pmargin = _mm512_set1_pd(1.0 + ext_filter_margin);
4486
4487                         vfcrange0 = _mm512_mul_pd(vfcfreq, v1mmargin);
4488                         vfcrange1 = _mm512_mul_pd(vfcfreq, v1pmargin);
4489                         vfcrange2 = _mm512_mul_pd(vfcreso_DB, v1mmargin);
4490                         vfcrange3 = _mm512_mul_pd(vfcreso_DB, v1pmargin);
4491
4492                         vfcrange01_0246 = _mm512_unpacklo_pd(vfcrange0, vfcrange1);
4493                         vfcrange01_1357 = _mm512_unpackhi_pd(vfcrange0, vfcrange1);
4494                         vfcrange23_0246 = _mm512_unpacklo_pd(vfcrange2, vfcrange3);
4495                         vfcrange23_1357 = _mm512_unpackhi_pd(vfcrange2, vfcrange3);
4496
4497 #if 1
4498                         __m512d vfcrange0123_04 = _mm512_permutex2var_pd(vfcrange01_0246, _mm512_set_epi64(13, 12, 5, 4, 9, 8, 1, 0), vfcrange23_0246);
4499                         __m512d vfcrange0123_26 = _mm512_permutex2var_pd(vfcrange01_0246, _mm512_set_epi64(15, 14, 7, 6, 11, 10, 3, 2), vfcrange23_0246);
4500                         __m512d vfcrange0123_15 = _mm512_permutex2var_pd(vfcrange01_1357, _mm512_set_epi64(13, 12, 5, 4, 9, 8, 1, 0), vfcrange23_1357);
4501                         __m512d vfcrange0123_37 = _mm512_permutex2var_pd(vfcrange01_1357, _mm512_set_epi64(15, 14, 7, 6, 11, 10, 3, 2), vfcrange23_1357);
4502 #else
4503                         __m512d vfcrange0123_04 = _mm512_mask_permutex_pd(vfcrange01_0246, 0xCC, vfcrange23_0246, (1 << 6) | (0 << 4) | 0);
4504                         __m512d vfcrange0123_26 = _mm512_mask_permutex_pd(vfcrange01_0246, 0x33, vfcrange23_0246, (3 << 2) | 2);
4505                         __m512d vfcrange0123_15 = _mm512_mask_permutex_pd(vfcrange01_1357, 0xCC, vfcrange23_1357, (1 << 6) | (0 << 4) | 0);
4506                         __m512d vfcrange0123_37 = _mm512_mask_permutex_pd(vfcrange01_1357, 0x33, vfcrange23_1357, (3 << 2) | 2);
4507 #endif
4508
4509                         if (imask & 1)
4510                                 _mm256_storeu_pd(fcs[0]->range, _mm512_castpd512_pd256(vfcrange0123_04));
4511
4512                         if (imask & (1 << 1))
4513                                 _mm256_storeu_pd(fcs[1]->range, _mm512_castpd512_pd256(vfcrange0123_15));
4514
4515                         if (imask & (1 << 2))
4516                                 _mm256_storeu_pd(fcs[2]->range, _mm512_castpd512_pd256(vfcrange0123_26));
4517
4518                         if (imask & (1 << 3))
4519                                 _mm256_storeu_pd(fcs[3]->range, _mm512_castpd512_pd256(vfcrange0123_37));
4520
4521                         if (imask & (1 << 4))
4522                                 _mm256_storeu_pd(fcs[4]->range, _mm512_extractf64x4_pd(vfcrange0123_04, 1));
4523
4524                         if (imask & (1 << 5))
4525                                 _mm256_storeu_pd(fcs[5]->range, _mm512_extractf64x4_pd(vfcrange0123_15, 1));
4526
4527                         if (imask & (1 << 6))
4528                                 _mm256_storeu_pd(fcs[6]->range, _mm512_extractf64x4_pd(vfcrange0123_26, 1));
4529
4530                         if (imask & (1 << 7))
4531                                 _mm256_storeu_pd(fcs[7]->range, _mm512_extractf64x4_pd(vfcrange0123_37, 1));
4532
4533                         __m512d vfcdiv_flt_rate = _mm512_set_pd(
4534                                 7 < batch_size ? fcs[7]->div_flt_rate : fcs[0]->div_flt_rate,
4535                                 6 < batch_size ? fcs[6]->div_flt_rate : fcs[0]->div_flt_rate,
4536                                 5 < batch_size ? fcs[5]->div_flt_rate : fcs[0]->div_flt_rate,
4537                                 4 < batch_size ? fcs[4]->div_flt_rate : fcs[0]->div_flt_rate,
4538                                 3 < batch_size ? fcs[3]->div_flt_rate : fcs[0]->div_flt_rate,
4539                                 2 < batch_size ? fcs[2]->div_flt_rate : fcs[0]->div_flt_rate,
4540                                 1 < batch_size ? fcs[1]->div_flt_rate : fcs[0]->div_flt_rate,
4541                                 fcs[0]->div_flt_rate
4542                         );
4543
4544                         __m512d vf = _mm512_mul_pd(_mm512_mul_pd(_mm512_set1_pd(M_PI), vfcfreq), vfcdiv_flt_rate);
4545
4546 #ifdef USE_SVML
4547                         __m512d vtanf = _mm512_tan_pd(vf);
4548 #else
4549                         ALIGN FLOAT_T af[8];
4550                         _mm512_storeu_pd(af, vf);
4551                         __m512d vtanf = _mm512_set_pd(tan(af[7]), tan(af[6]), tan(af[5]), tan(af[4]), tan(af[3]), tan(af[2]), tan(af[1]), tan(af[0]));
4552 #endif
4553
4554                         __m512d v1 = _mm512_set1_pd(1.0);
4555                         __m512d v2 = _mm512_set1_pd(2.0);
4556                         __m512d vp = _mm512_div_pd(v1, vtanf);
4557
4558                         FLOAT_T reso_db_cf_p = RESO_DB_CF_P(fcs[i]->reso_dB);
4559
4560                         __m512d vreso_db_cf_p = _mm512_set_pd(
4561                                 i + 7 < batch_size ? RESO_DB_CF_P(fcs[i + 7]->reso_dB) : reso_db_cf_p,
4562                                 i + 6 < batch_size ? RESO_DB_CF_P(fcs[i + 6]->reso_dB) : reso_db_cf_p,
4563                                 i + 5 < batch_size ? RESO_DB_CF_P(fcs[i + 5]->reso_dB) : reso_db_cf_p,
4564                                 i + 4 < batch_size ? RESO_DB_CF_P(fcs[i + 4]->reso_dB) : reso_db_cf_p,
4565                                 i + 3 < batch_size ? RESO_DB_CF_P(fcs[i + 3]->reso_dB) : reso_db_cf_p,
4566                                 i + 2 < batch_size ? RESO_DB_CF_P(fcs[i + 2]->reso_dB) : reso_db_cf_p,
4567                                 i + 1 < batch_size ? RESO_DB_CF_P(fcs[i + 1]->reso_dB) : reso_db_cf_p,
4568                                 reso_db_cf_p
4569                         );
4570
4571                         __m512d vq = _mm512_mul_pd(vreso_db_cf_p, _mm512_set1_pd(SQRT_2));
4572                         __m512d vp2 = _mm512_mul_pd(vp, vp);
4573                         __m512d vqp = _mm512_mul_pd(vq, vp);
4574                         __m512d vdc0 = _mm512_div_pd(v1, _mm512_add_pd(_mm512_add_pd(v1, vqp), vp2));
4575                         __m512d vdc1 = _mm512_mul_pd(v2, vdc0);
4576                         __m512d vdc2 = vdc0;
4577                         __m512d vdc3 = _mm512_mul_pd(_mm512_mul_pd(v2, _mm512_sub_pd(vp2, v1)), vdc0);
4578                         __m512d vdc4 = _mm512_mul_pd(_mm512_sub_pd(_mm512_sub_pd(vqp, v1), vp2), vdc0);
4579
4580                         __m512d vdc01_0246 = _mm512_unpacklo_pd(vdc0, vdc1);
4581                         __m512d vdc01_1357 = _mm512_unpackhi_pd(vdc0, vdc1);
4582                         __m512d vdc23_0246 = _mm512_unpacklo_pd(vdc2, vdc3);
4583                         __m512d vdc23_1357 = _mm512_unpackhi_pd(vdc2, vdc3);
4584
4585                         __m512d vdc0123_04 = _mm512_permutex2var_pd(vdc01_0246, _mm512_set_epi64(13, 12, 5, 4, 9, 8, 1, 0), vdc23_0246);
4586                         __m512d vdc0123_26 = _mm512_permutex2var_pd(vdc01_0246, _mm512_set_epi64(15, 14, 7, 6, 11, 10, 3, 2), vdc23_0246);
4587                         __m512d vdc0123_15 = _mm512_permutex2var_pd(vdc01_1357, _mm512_set_epi64(13, 12, 5, 4, 9, 8, 1, 0), vdc23_1357);
4588                         __m512d vdc0123_37 = _mm512_permutex2var_pd(vdc01_1357, _mm512_set_epi64(15, 14, 7, 6, 11, 10, 3, 2), vdc23_1357);
4589
4590                         if (imask & 1) {
4591                                 _mm256_storeu_pd(&fcs[i]->dc[0], _mm512_castpd512_pd256(vdc0123_04));
4592                                 _mm_storel_pd(&fcs[i]->dc[4], _mm512_castpd512_pd128(vdc4));
4593                         }
4594
4595                         if (imask & (1 << 1)) {
4596                                 _mm256_storeu_pd(&fcs[i + 1]->dc[0], _mm512_castpd512_pd256(vdc0123_15));
4597                                 _mm_storeh_pd(&fcs[i + 1]->dc[4], _mm512_castpd512_pd128(vdc4));
4598                         }
4599
4600                         if (imask & (1 << 2)) {
4601                                 _mm256_storeu_pd(&fcs[i + 2]->dc[0], _mm512_castpd512_pd256(vdc0123_26));
4602                                 _mm_storel_pd(&fcs[i + 2]->dc[4], _mm256_extractf128_pd(_mm512_castpd512_pd256(vdc4), 1));
4603                         }
4604
4605                         if (imask & (1 << 3)) {
4606                                 _mm256_storeu_pd(&fcs[i + 3]->dc[0], _mm512_castpd512_pd256(vdc0123_37));
4607                                 _mm_storeh_pd(&fcs[i + 3]->dc[4], _mm256_extractf128_pd(_mm512_castpd512_pd256(vdc4), 1));
4608                         }
4609
4610                         if (imask & (1 << 4)) {
4611                                 _mm256_storeu_pd(&fcs[i + 4]->dc[0], _mm512_extractf64x4_pd(vdc0123_04, 1));
4612                                 _mm_storel_pd(&fcs[i + 4]->dc[4], _mm512_extractf64x2_pd(vdc4, 2));
4613                         }
4614
4615                         if (imask & (1 << 5)) {
4616                                 _mm256_storeu_pd(&fcs[i + 5]->dc[0], _mm512_extractf64x4_pd(vdc0123_15, 1));
4617                                 _mm_storeh_pd(&fcs[i + 5]->dc[4], _mm512_extractf64x2_pd(vdc4, 2));
4618                         }
4619
4620                         if (imask & (1 << 6)) {
4621                                 _mm256_storeu_pd(&fcs[i + 6]->dc[0], _mm512_extractf64x4_pd(vdc0123_26, 1));
4622                                 _mm_storel_pd(&fcs[i + 6]->dc[4], _mm512_extractf64x2_pd(vdc4, 3));
4623                         }
4624
4625                         if (imask & (1 << 7)) {
4626                                 _mm256_storeu_pd(&fcs[i + 7]->dc[0], _mm512_extractf64x4_pd(vdc0123_37, 1));
4627                                 _mm_storeh_pd(&fcs[i + 7]->dc[4], _mm512_extractf64x2_pd(vdc4, 3));
4628                         }
4629                 }
4630         }
4631 }
4632
4633 #elif (USE_X86_EXT_INTRIN >= 8) && defined(DATA_T_DOUBLE) && defined(FLOAT_T_DOUBLE)
4634
4635 static void recalc_filter_LPF_BW_batch(int batch_size, FilterCoefficients **fcs)
4636 {
4637         for (int i = 0; i < MIX_VOICE_BATCH_SIZE; i += 4) {
4638                 if (i >= batch_size)
4639                         break;
4640
4641                 __m256d vfcrange0123_0 = _mm256_loadu_pd(fcs[i]->range);
4642                 __m256d vfcrange0123_1 = i + 1 < batch_size ? _mm256_loadu_pd(fcs[i + 1]->range) : _mm256_setzero_pd();
4643                 __m256d vfcrange0123_2 = i + 2 < batch_size ? _mm256_loadu_pd(fcs[i + 2]->range) : _mm256_setzero_pd();
4644                 __m256d vfcrange0123_3 = i + 3 < batch_size ? _mm256_loadu_pd(fcs[i + 3]->range) : _mm256_setzero_pd();
4645
4646                 __m256d vfcrange01_02 = _mm256_permute2f128_pd(vfcrange0123_0, vfcrange0123_2, (2 << 4) | 0);
4647                 __m256d vfcrange01_13 = _mm256_permute2f128_pd(vfcrange0123_1, vfcrange0123_3, (2 << 4) | 0);
4648                 __m256d vfcrange23_02 = _mm256_permute2f128_pd(vfcrange0123_0, vfcrange0123_2, (3 << 4) | 1);
4649                 __m256d vfcrange23_13 = _mm256_permute2f128_pd(vfcrange0123_1, vfcrange0123_3, (3 << 4) | 1);
4650
4651                 __m256d vfcrange0 = _mm256_unpacklo_pd(vfcrange01_02, vfcrange01_13);
4652                 __m256d vfcrange1 = _mm256_unpackhi_pd(vfcrange01_02, vfcrange01_13);
4653                 __m256d vfcrange2 = _mm256_unpacklo_pd(vfcrange23_02, vfcrange23_13);
4654                 __m256d vfcrange3 = _mm256_unpackhi_pd(vfcrange23_02, vfcrange23_13);
4655
4656                 __m256d vfcfreq = _mm256_set_pd(
4657                         i + 3 < batch_size ? fcs[i + 3]->freq : 0.0,
4658                         i + 2 < batch_size ? fcs[i + 2]->freq : 0.0,
4659                         i + 1 < batch_size ? fcs[i + 1]->freq : 0.0,
4660                         fcs[i]->freq
4661                 );
4662
4663                 __m256d vfcreso_DB = _mm256_set_pd(
4664                         i + 3 < batch_size ? fcs[i + 3]->reso_dB : 0.0,
4665                         i + 2 < batch_size ? fcs[i + 2]->reso_dB : 0.0,
4666                         i + 1 < batch_size ? fcs[i + 1]->reso_dB : 0.0,
4667                         fcs[i]->reso_dB
4668                 );
4669
4670                 __m256d vmask = _mm256_or_pd(
4671                         _mm256_or_pd(_mm256_cmp_pd(vfcfreq, vfcrange0, _CMP_LT_OS), _mm256_cmp_pd(vfcfreq, vfcrange1, _CMP_GT_OS)),
4672                         _mm256_or_pd(_mm256_cmp_pd(vfcreso_DB, vfcrange2, _CMP_LT_OS), _mm256_cmp_pd(vfcreso_DB, vfcrange3, _CMP_GT_OS))
4673                 );
4674
4675                 int imask = _mm256_movemask_pd(vmask) & ((1 << (batch_size - i)) - 1);
4676
4677                 if (imask) {
4678                         __m256d v1mmargin = _mm256_set1_pd(1.0 - ext_filter_margin);
4679                         __m256d v1pmargin = _mm256_set1_pd(1.0 + ext_filter_margin);
4680
4681                         vfcrange0 = _mm256_mul_pd(vfcfreq, v1mmargin);
4682                         vfcrange1 = _mm256_mul_pd(vfcfreq, v1pmargin);
4683                         vfcrange2 = _mm256_mul_pd(vfcreso_DB, v1mmargin);
4684                         vfcrange3 = _mm256_mul_pd(vfcreso_DB, v1pmargin);
4685
4686                         vfcrange01_02 = _mm256_unpacklo_pd(vfcrange0, vfcrange1);
4687                         vfcrange01_13 = _mm256_unpackhi_pd(vfcrange0, vfcrange1);
4688                         vfcrange23_02 = _mm256_unpacklo_pd(vfcrange2, vfcrange3);
4689                         vfcrange23_13 = _mm256_unpackhi_pd(vfcrange2, vfcrange3);
4690
4691                         vfcrange0123_0 = _mm256_permute2f128_pd(vfcrange01_02, vfcrange23_02, (2 << 4) | 0);
4692                         vfcrange0123_1 = _mm256_permute2f128_pd(vfcrange01_13, vfcrange23_13, (2 << 4) | 0);
4693                         vfcrange0123_2 = _mm256_permute2f128_pd(vfcrange01_02, vfcrange23_02, (3 << 4) | 1);
4694                         vfcrange0123_3 = _mm256_permute2f128_pd(vfcrange01_13, vfcrange23_13, (3 << 4) | 1);
4695
4696                         if (imask & 1)
4697                                 _mm256_storeu_pd(fcs[i]->range, vfcrange0123_0);
4698
4699                         if (imask & (1 << 1))
4700                                 _mm256_storeu_pd(fcs[i + 1]->range, vfcrange0123_1);
4701
4702                         if (imask & (1 << 2))
4703                                 _mm256_storeu_pd(fcs[i + 2]->range, vfcrange0123_2);
4704
4705                         if (imask & (1 << 3))
4706                                 _mm256_storeu_pd(fcs[i + 3]->range, vfcrange0123_3);
4707
4708                         __m256d vfcdiv_flt_rate = _mm256_set_pd(
4709                                 i + 3 < batch_size ? fcs[i + 3]->div_flt_rate : fcs[i]->div_flt_rate,
4710                                 i + 2 < batch_size ? fcs[i + 2]->div_flt_rate : fcs[i]->div_flt_rate,
4711                                 i + 1 < batch_size ? fcs[i + 1]->div_flt_rate : fcs[i]->div_flt_rate,
4712                                 fcs[i]->div_flt_rate
4713                         );
4714
4715                         __m256d vf = _mm256_mul_pd(_mm256_mul_pd(_mm256_set1_pd(M_PI), vfcfreq), vfcdiv_flt_rate);
4716
4717 #ifdef USE_SVML
4718                         __m256d vtanf = _mm256_tan_pd(vf);
4719 #else
4720                         ALIGN FLOAT_T af[4];
4721                         _mm256_storeu_pd(af, vf);
4722                         __m256d vtanf = _mm256_set_pd(tan(af[3]), tan(af[2]), tan(af[1]), tan(af[0]));
4723 #endif
4724
4725                         __m256d v1 = _mm256_set1_pd(1.0);
4726                         __m256d v2 = _mm256_set1_pd(2.0);
4727                         __m256d vp = _mm256_div_pd(v1, vtanf);
4728
4729                         FLOAT_T reso_db_cf_p = RESO_DB_CF_P(fcs[i]->reso_dB);
4730
4731                         __m256d vreso_db_cf_p = _mm256_set_pd(
4732                                 i + 3 < batch_size ? RESO_DB_CF_P(fcs[i + 3]->reso_dB) : reso_db_cf_p,
4733                                 i + 2 < batch_size ? RESO_DB_CF_P(fcs[i + 2]->reso_dB) : reso_db_cf_p,
4734                                 i + 1 < batch_size ? RESO_DB_CF_P(fcs[i + 1]->reso_dB) : reso_db_cf_p,
4735                                 reso_db_cf_p
4736                         );
4737
4738                         __m256d vq = _mm256_mul_pd(vreso_db_cf_p, _mm256_set1_pd(SQRT_2));
4739                         __m256d vp2 = _mm256_mul_pd(vp, vp);
4740                         __m256d vqp = _mm256_mul_pd(vq, vp);
4741                         __m256d vdc0 = _mm256_div_pd(v1, _mm256_add_pd(_mm256_add_pd(v1, vqp), vp2));
4742                         __m256d vdc1 = _mm256_mul_pd(v2, vdc0);
4743                         __m256d vdc2 = vdc0;
4744                         __m256d vdc3 = _mm256_mul_pd(_mm256_mul_pd(v2, _mm256_sub_pd(vp2, v1)), vdc0);
4745                         __m256d vdc4 = _mm256_mul_pd(_mm256_sub_pd(_mm256_sub_pd(vqp, v1), vp2), vdc0);
4746
4747                         __m256d vdc01_02 = _mm256_unpacklo_pd(vdc0, vdc1);
4748                         __m256d vdc01_13 = _mm256_unpackhi_pd(vdc0, vdc1);
4749                         __m256d vdc23_02 = _mm256_unpacklo_pd(vdc2, vdc3);
4750                         __m256d vdc23_13 = _mm256_unpackhi_pd(vdc2, vdc3);
4751
4752                         __m256d vdc0123_0 = _mm256_permute2f128_pd(vdc01_02, vdc23_02, (2 << 4) | 0);
4753                         __m256d vdc0123_1 = _mm256_permute2f128_pd(vdc01_13, vdc23_13, (2 << 4) | 0);
4754                         __m256d vdc0123_2 = _mm256_permute2f128_pd(vdc01_02, vdc23_02, (3 << 4) | 1);
4755                         __m256d vdc0123_3 = _mm256_permute2f128_pd(vdc01_13, vdc23_13, (3 << 4) | 1);
4756
4757                         if (imask & 1) {
4758                                 _mm256_storeu_pd(&fcs[i]->dc[0], vdc0123_0);
4759                                 _mm_storel_pd(&fcs[i]->dc[4], _mm256_castpd256_pd128(vdc4));
4760                         }
4761
4762                         if (imask & (1 << 1)) {
4763                                 _mm256_storeu_pd(&fcs[i + 1]->dc[0], vdc0123_1);
4764                                 _mm_storeh_pd(&fcs[i + 1]->dc[4], _mm256_castpd256_pd128(vdc4));
4765                         }
4766
4767                         if (imask & (1 << 2)) {
4768                                 _mm256_storeu_pd(&fcs[i + 2]->dc[0], vdc0123_2);
4769                                 _mm_storel_pd(&fcs[i + 2]->dc[4], _mm256_extractf128_pd(vdc4, 1));
4770                         }
4771
4772                         if (imask & (1 << 3)) {
4773                                 _mm256_storeu_pd(&fcs[i + 3]->dc[0], vdc0123_3);
4774                                 _mm_storeh_pd(&fcs[i + 3]->dc[4], _mm256_extractf128_pd(vdc4, 1));
4775                         }
4776                 }
4777         }
4778 }
4779
4780 #elif (USE_X86_EXT_INTRIN >= 3) && defined(DATA_T_DOUBLE) && defined(FLOAT_T_DOUBLE)
4781
4782 static void recalc_filter_LPF_BW_batch(int batch_size, FilterCoefficients **fcs)
4783 {
4784         for (int i = 0; i < MIX_VOICE_BATCH_SIZE; i += 2) {
4785                 if (i >= batch_size)
4786                         break;
4787
4788                 __m128d vfcrange01_0 = _mm_loadu_pd(fcs[i]->range);
4789                 __m128d vfcrange23_0 = _mm_loadu_pd(&fcs[i]->range[2]);
4790                 __m128d vfcrange01_1 = i + 1 < batch_size ? _mm_loadu_pd(fcs[i + 1]->range) : _mm_setzero_pd();
4791                 __m128d vfcrange23_1 = i + 1 < batch_size ? _mm_loadu_pd(&fcs[i + 1]->range[2]) : _mm_setzero_pd();
4792
4793                 __m128d vfcrange0 = _mm_unpacklo_pd(vfcrange01_0, vfcrange01_1);
4794                 __m128d vfcrange1 = _mm_unpackhi_pd(vfcrange01_0, vfcrange01_1);
4795                 __m128d vfcrange2 = _mm_unpacklo_pd(vfcrange23_0, vfcrange23_1);
4796                 __m128d vfcrange3 = _mm_unpackhi_pd(vfcrange23_0, vfcrange23_1);
4797
4798                 __m128d vfcfreq = _mm_set_pd(
4799                         i + 1 < batch_size ? fcs[i + 1]->freq : 0.0,
4800                         fcs[i]->freq
4801                 );
4802
4803                 __m128d vfcreso_DB = _mm_set_pd(
4804                         i + 1 < batch_size ? fcs[i + 1]->reso_dB : 0.0,
4805                         fcs[i]->reso_dB
4806                 );
4807
4808                 __m128d vmask = _mm_or_pd(
4809                         _mm_or_pd(_mm_cmplt_pd(vfcfreq, vfcrange0), _mm_cmpgt_pd(vfcfreq, vfcrange1)),
4810                         _mm_or_pd(_mm_cmplt_pd(vfcreso_DB, vfcrange2), _mm_cmpgt_pd(vfcreso_DB, vfcrange3))
4811                 );
4812
4813                 int imask = _mm_movemask_pd(vmask) & ((1 << (batch_size - i)) - 1);
4814
4815                 if (imask) {
4816                         __m128d v1mmargin = _mm_set1_pd(1.0 - ext_filter_margin);
4817                         __m128d v1pmargin = _mm_set1_pd(1.0 + ext_filter_margin);
4818
4819                         vfcrange0 = _mm_mul_pd(vfcfreq, v1mmargin);
4820                         vfcrange1 = _mm_mul_pd(vfcfreq, v1pmargin);
4821                         vfcrange2 = _mm_mul_pd(vfcreso_DB, v1mmargin);
4822                         vfcrange3 = _mm_mul_pd(vfcreso_DB, v1pmargin);
4823
4824                         vfcrange01_0 = _mm_unpacklo_pd(vfcrange0, vfcrange1);
4825                         vfcrange01_1 = _mm_unpackhi_pd(vfcrange0, vfcrange1);
4826                         vfcrange23_0 = _mm_unpacklo_pd(vfcrange2, vfcrange3);
4827                         vfcrange23_1 = _mm_unpackhi_pd(vfcrange2, vfcrange3);
4828
4829                         if (imask & 1) {
4830                                 _mm_storeu_pd(fcs[i]->range, vfcrange01_0);
4831                                 _mm_storeu_pd(&fcs[i]->range[2], vfcrange23_0);
4832                         }
4833
4834                         if (imask & (1 << 1)) {
4835                                 _mm_storeu_pd(fcs[i + 1]->range, vfcrange01_1);
4836                                 _mm_storeu_pd(&fcs[i + 1]->range[2], vfcrange23_1);
4837                         }
4838
4839                         __m128d vfcdiv_flt_rate = _mm_set_pd(
4840                                 i + 1 < batch_size ? fcs[i + 1]->div_flt_rate : fcs[i]->div_flt_rate,
4841                                 fcs[i]->div_flt_rate
4842                         );
4843
4844                         __m128d vf = _mm_mul_pd(_mm_mul_pd(_mm_set1_pd(M_PI), vfcfreq), vfcdiv_flt_rate);
4845
4846 #ifdef USE_SVML
4847                         __m128d vtanf = _mm_tan_pd(vf);
4848 #else
4849                         ALIGN FLOAT_T af[2];
4850                         _mm_storeu_pd(af, vf);
4851                         __m128d vtanf = _mm_set_pd(tan(af[1]), tan(af[0]));
4852 #endif
4853
4854                         __m128d v1 = _mm_set1_pd(1.0);
4855                         __m128d v2 = _mm_set1_pd(2.0);
4856                         __m128d vp = _mm_div_pd(v1, vtanf);
4857
4858                         FLOAT_T reso_db_cf_p = RESO_DB_CF_P(fcs[i]->reso_dB);
4859
4860                         __m128d vreso_db_cf_p = _mm_set_pd(
4861                                 i + 1 < batch_size ? RESO_DB_CF_P(fcs[i + 1]->reso_dB) : reso_db_cf_p,
4862                                 reso_db_cf_p
4863                         );
4864
4865                         __m128d vq = _mm_mul_pd(vreso_db_cf_p, _mm_set1_pd(SQRT_2));
4866                         __m128d vp2 = _mm_mul_pd(vp, vp);
4867                         __m128d vqp = _mm_mul_pd(vq, vp);
4868                         __m128d vdc0 = _mm_div_pd(v1, _mm_add_pd(_mm_add_pd(v1, vqp), vp2));
4869                         __m128d vdc1 = _mm_mul_pd(v2, vdc0);
4870                         __m128d vdc2 = vdc0;
4871                         __m128d vdc3 = _mm_mul_pd(_mm_mul_pd(v2, _mm_sub_pd(vp2, v1)), vdc0);
4872                         __m128d vdc4 = _mm_mul_pd(_mm_sub_pd(_mm_sub_pd(vqp, v1), vp2), vdc0);
4873
4874                         __m128d vdc01_0 = _mm_unpacklo_pd(vdc0, vdc1);
4875                         __m128d vdc01_1 = _mm_unpackhi_pd(vdc0, vdc1);
4876                         __m128d vdc23_0 = _mm_unpacklo_pd(vdc2, vdc3);
4877                         __m128d vdc23_1 = _mm_unpackhi_pd(vdc2, vdc3);
4878
4879                         if (imask & 1) {
4880                                 _mm_storeu_pd(&fcs[i]->dc[0], vdc01_0);
4881                                 _mm_storeu_pd(&fcs[i]->dc[2], vdc23_0);
4882                                 _mm_storel_pd(&fcs[i]->dc[4], vdc4);
4883                         }
4884
4885                         if (imask & (1 << 1)) {
4886                                 _mm_storeu_pd(&fcs[i + 1]->dc[0], vdc01_1);
4887                                 _mm_storeu_pd(&fcs[i + 1]->dc[2], vdc23_1);
4888                                 _mm_storeh_pd(&fcs[i + 1]->dc[4], vdc4);
4889                         }
4890                 }
4891         }
4892 }
4893
4894 #endif
4895
4896 #if (USE_X86_EXT_INTRIN >= 10) && defined(DATA_T_DOUBLE) && defined(FLOAT_T_DOUBLE)
4897
4898 static void sample_filter_LPF12_2_batch(int batch_size, FILTER_T **dcs, FILTER_T **dbs, DATA_T **sps, int32 *counts)
4899 {
4900         __m256i vcounts = _mm256_maskz_loadu_epi32(generate_mask8_for_count(0, batch_size), counts);
4901
4902         __m128d vdb01_0 = _mm_loadu_pd(dbs[0]);
4903         __m128d vdb01_1 = 1 < batch_size ? _mm_loadu_pd(dbs[1]) : _mm_setzero_pd();
4904         __m128d vdb01_2 = 2 < batch_size ? _mm_loadu_pd(dbs[2]) : _mm_setzero_pd();
4905         __m128d vdb01_3 = 3 < batch_size ? _mm_loadu_pd(dbs[3]) : _mm_setzero_pd();
4906         __m128d vdb01_4 = 4 < batch_size ? _mm_loadu_pd(dbs[4]) : _mm_setzero_pd();
4907         __m128d vdb01_5 = 5 < batch_size ? _mm_loadu_pd(dbs[5]) : _mm_setzero_pd();
4908         __m128d vdb01_6 = 6 < batch_size ? _mm_loadu_pd(dbs[6]) : _mm_setzero_pd();
4909         __m128d vdb01_7 = 7 < batch_size ? _mm_loadu_pd(dbs[7]) : _mm_setzero_pd();
4910
4911         __m256d vdb01_02 = _mm256_insertf128_pd(_mm256_castpd128_pd256(vdb01_0), vdb01_2, 1);
4912         __m256d vdb01_13 = _mm256_insertf128_pd(_mm256_castpd128_pd256(vdb01_1), vdb01_3, 1);
4913         __m256d vdb01_46 = _mm256_insertf128_pd(_mm256_castpd128_pd256(vdb01_4), vdb01_6, 1);
4914         __m256d vdb01_57 = _mm256_insertf128_pd(_mm256_castpd128_pd256(vdb01_5), vdb01_7, 1);
4915
4916         __m512d vdb01_0246 = _mm512_insertf64x4(_mm512_castpd256_pd512(vdb01_02), vdb01_46, 1);
4917         __m512d vdb01_1357 = _mm512_insertf64x4(_mm512_castpd256_pd512(vdb01_13), vdb01_57, 1);
4918
4919         __m512d vdb0 = _mm512_unpacklo_pd(vdb01_0246, vdb01_1357);
4920         __m512d vdb1 = _mm512_unpackhi_pd(vdb01_0246, vdb01_1357);
4921
4922         __m128d vdc01_0 = _mm_loadu_pd(dcs[0]);
4923         __m128d vdc01_1 = 1 < batch_size ? _mm_loadu_pd(dcs[1]) : _mm_setzero_pd();
4924         __m128d vdc01_2 = 2 < batch_size ? _mm_loadu_pd(dcs[2]) : _mm_setzero_pd();
4925         __m128d vdc01_3 = 3 < batch_size ? _mm_loadu_pd(dcs[3]) : _mm_setzero_pd();
4926         __m128d vdc01_4 = 4 < batch_size ? _mm_loadu_pd(dcs[4]) : _mm_setzero_pd();
4927         __m128d vdc01_5 = 5 < batch_size ? _mm_loadu_pd(dcs[5]) : _mm_setzero_pd();
4928         __m128d vdc01_6 = 6 < batch_size ? _mm_loadu_pd(dcs[6]) : _mm_setzero_pd();
4929         __m128d vdc01_7 = 7 < batch_size ? _mm_loadu_pd(dcs[7]) : _mm_setzero_pd();
4930
4931         __m256d vdc01_02 = _mm256_insertf128_pd(_mm256_castpd128_pd256(vdc01_0), vdc01_2, 1);
4932         __m256d vdc01_13 = _mm256_insertf128_pd(_mm256_castpd128_pd256(vdc01_1), vdc01_3, 1);
4933         __m256d vdc01_46 = _mm256_insertf128_pd(_mm256_castpd128_pd256(vdc01_4), vdc01_6, 1);
4934         __m256d vdc01_57 = _mm256_insertf128_pd(_mm256_castpd128_pd256(vdc01_5), vdc01_7, 1);
4935
4936         __m512d vdc01_0246 = _mm512_insertf64x4(_mm512_castpd256_pd512(vdc01_02), vdc01_46, 1);
4937         __m512d vdc01_1357 = _mm512_insertf64x4(_mm512_castpd256_pd512(vdc01_13), vdc01_57, 1);
4938
4939         __m512d vdc0 = _mm512_unpacklo_pd(vdc01_0246, vdc01_1357);
4940         __m512d vdc1 = _mm512_unpackhi_pd(vdc01_0246, vdc01_1357);
4941
4942         __m128i vcounts_max = _mm_max_epi32(_mm256_castsi256_si128(vcounts), _mm256_extracti128_si256(vcounts, 1));
4943         vcounts_max = _mm_max_epi32(vcounts_max, _mm_shuffle_epi32(vcounts_max, (3 << 2) | 2));
4944         int32 count_max = _mm_cvtsi128_si32(_mm_max_epi32(vcounts_max, _mm_shuffle_epi32(vcounts_max, 1)));
4945
4946         for (int32 j = 0; j < count_max; j += 8) {
4947                 __m512d vin[8];
4948                 vin[0] = _mm512_maskz_loadu_pd(generate_mask8_for_count(j, counts[0]), &sps[0][j]);
4949
4950                 for (int k = 1; k < 8; k++)
4951                         vin[k] = _mm512_maskz_loadu_pd(k < batch_size ? generate_mask8_for_count(j, counts[k]) : 0, &sps[k][j]);
4952
4953                 __m512d vsp0246_01 = _mm512_unpacklo_pd(vin[0], vin[1]);
4954                 __m512d vsp1357_01 = _mm512_unpackhi_pd(vin[0], vin[1]);
4955                 __m512d vsp0246_23 = _mm512_unpacklo_pd(vin[2], vin[3]);
4956                 __m512d vsp1357_23 = _mm512_unpackhi_pd(vin[2], vin[3]);
4957                 __m512d vsp0246_45 = _mm512_unpacklo_pd(vin[4], vin[5]);
4958                 __m512d vsp1357_45 = _mm512_unpackhi_pd(vin[4], vin[5]);
4959                 __m512d vsp0246_67 = _mm512_unpacklo_pd(vin[6], vin[7]);
4960                 __m512d vsp1357_67 = _mm512_unpackhi_pd(vin[6], vin[7]);
4961
4962                 __m512d vsp04_0123 = _mm512_shuffle_f64x2(vsp0246_01, vsp0246_23, (2 << 6) | (0 << 4) | (2 << 2) | 0);
4963                 __m512d vsp26_0123 = _mm512_shuffle_f64x2(vsp0246_01, vsp0246_23, (3 << 6) | (1 << 4) | (3 << 2) | 1);
4964                 __m512d vsp15_0123 = _mm512_shuffle_f64x2(vsp1357_01, vsp1357_23, (2 << 6) | (0 << 4) | (2 << 2) | 0);
4965                 __m512d vsp37_0123 = _mm512_shuffle_f64x2(vsp1357_01, vsp1357_23, (3 << 6) | (1 << 4) | (3 << 2) | 1);
4966                 __m512d vsp04_4567 = _mm512_shuffle_f64x2(vsp0246_45, vsp0246_67, (2 << 6) | (0 << 4) | (2 << 2) | 0);
4967                 __m512d vsp26_4567 = _mm512_shuffle_f64x2(vsp0246_45, vsp0246_67, (3 << 6) | (1 << 4) | (3 << 2) | 1);
4968                 __m512d vsp15_4567 = _mm512_shuffle_f64x2(vsp1357_45, vsp1357_67, (2 << 6) | (0 << 4) | (2 << 2) | 0);
4969                 __m512d vsp37_4567 = _mm512_shuffle_f64x2(vsp1357_45, vsp1357_67, (3 << 6) | (1 << 4) | (3 << 2) | 1);
4970
4971                 __m512d vsps[8];
4972                 vsps[0] = _mm512_shuffle_f64x2(vsp04_0123, vsp04_4567, (2 << 6) | (0 << 4) | (2 << 2) | 0);
4973                 vsps[4] = _mm512_shuffle_f64x2(vsp04_0123, vsp04_4567, (3 << 6) | (1 << 4) | (3 << 2) | 1);
4974                 vsps[1] = _mm512_shuffle_f64x2(vsp15_0123, vsp15_4567, (2 << 6) | (0 << 4) | (2 << 2) | 0);
4975                 vsps[5] = _mm512_shuffle_f64x2(vsp15_0123, vsp15_4567, (3 << 6) | (1 << 4) | (3 << 2) | 1);
4976                 vsps[2] = _mm512_shuffle_f64x2(vsp26_0123, vsp26_4567, (2 << 6) | (0 << 4) | (2 << 2) | 0);
4977                 vsps[6] = _mm512_shuffle_f64x2(vsp26_0123, vsp26_4567, (3 << 6) | (1 << 4) | (3 << 2) | 1);
4978                 vsps[3] = _mm512_shuffle_f64x2(vsp37_0123, vsp37_4567, (2 << 6) | (0 << 4) | (2 << 2) | 0);
4979                 vsps[7] = _mm512_shuffle_f64x2(vsp37_0123, vsp37_4567, (3 << 6) | (1 << 4) | (3 << 2) | 1);
4980
4981                 for (int k = 0; k < 8; k++) {
4982                         __mmask8 kmask = _mm256_cmplt_epi32_mask(_mm256_set1_epi32(j + k), vcounts);
4983
4984                         vdb1 = _mm512_mask3_fmadd_pd(_mm512_sub_pd(vsps[k], vdb0), vdc1, vdb1, kmask);
4985                         vdb0 = _mm512_mask_add_pd(vdb0, kmask, vdb0, vdb1);
4986                         vdb1 = _mm512_mask_mul_pd(vdb1, kmask, vdb1, vdc0);
4987                         vsps[k] = vdb0;
4988                 }
4989
4990                 __m512d vsp01_0246 = _mm512_unpacklo_pd(vsps[0], vsps[1]);
4991                 __m512d vsp01_1357 = _mm512_unpackhi_pd(vsps[0], vsps[1]);
4992                 __m512d vsp23_0246 = _mm512_unpacklo_pd(vsps[2], vsps[3]);
4993                 __m512d vsp23_1357 = _mm512_unpackhi_pd(vsps[2], vsps[3]);
4994                 __m512d vsp45_0246 = _mm512_unpacklo_pd(vsps[4], vsps[5]);
4995                 __m512d vsp45_1357 = _mm512_unpackhi_pd(vsps[4], vsps[5]);
4996                 __m512d vsp67_0246 = _mm512_unpacklo_pd(vsps[6], vsps[7]);
4997                 __m512d vsp67_1357 = _mm512_unpackhi_pd(vsps[6], vsps[7]);
4998
4999                 __m512d vsp0123_04 = _mm512_shuffle_f64x2(vsp01_0246, vsp23_0246, (2 << 6) | (0 << 4) | (2 << 2) | 0);
5000                 __m512d vsp0123_26 = _mm512_shuffle_f64x2(vsp01_0246, vsp23_0246, (3 << 6) | (1 << 4) | (3 << 2) | 1);
5001                 __m512d vsp0123_15 = _mm512_shuffle_f64x2(vsp01_1357, vsp23_1357, (2 << 6) | (0 << 4) | (2 << 2) | 0);
5002                 __m512d vsp0123_37 = _mm512_shuffle_f64x2(vsp01_1357, vsp23_1357, (3 << 6) | (1 << 4) | (3 << 2) | 1);
5003                 __m512d vsp4567_04 = _mm512_shuffle_f64x2(vsp45_0246, vsp67_0246, (2 << 6) | (0 << 4) | (2 << 2) | 0);
5004                 __m512d vsp4567_26 = _mm512_shuffle_f64x2(vsp45_0246, vsp67_0246, (3 << 6) | (1 << 4) | (3 << 2) | 1);
5005                 __m512d vsp4567_15 = _mm512_shuffle_f64x2(vsp45_1357, vsp67_1357, (2 << 6) | (0 << 4) | (2 << 2) | 0);
5006                 __m512d vsp4567_37 = _mm512_shuffle_f64x2(vsp45_1357, vsp67_1357, (3 << 6) | (1 << 4) | (3 << 2) | 1);
5007
5008                 __m512d vout[8];
5009                 vout[0] = _mm512_shuffle_f64x2(vsp0123_04, vsp4567_04, (2 << 6) | (0 << 4) | (2 << 2) | 0);
5010                 vout[4] = _mm512_shuffle_f64x2(vsp0123_04, vsp4567_04, (3 << 6) | (1 << 4) | (3 << 2) | 1);
5011                 vout[1] = _mm512_shuffle_f64x2(vsp0123_15, vsp4567_15, (2 << 6) | (0 << 4) | (2 << 2) | 0);
5012                 vout[5] = _mm512_shuffle_f64x2(vsp0123_15, vsp4567_15, (3 << 6) | (1 << 4) | (3 << 2) | 1);
5013                 vout[2] = _mm512_shuffle_f64x2(vsp0123_26, vsp4567_26, (2 << 6) | (0 << 4) | (2 << 2) | 0);
5014                 vout[6] = _mm512_shuffle_f64x2(vsp0123_26, vsp4567_26, (3 << 6) | (1 << 4) | (3 << 2) | 1);
5015                 vout[3] = _mm512_shuffle_f64x2(vsp0123_37, vsp4567_37, (2 << 6) | (0 << 4) | (2 << 2) | 0);
5016                 vout[7] = _mm512_shuffle_f64x2(vsp0123_37, vsp4567_37, (3 << 6) | (1 << 4) | (3 << 2) | 1);
5017
5018                 for (int k = 0; k < batch_size; k++)
5019                         _mm512_mask_storeu_pd(&sps[k][j], generate_mask8_for_count(j, counts[k]), vout[k]);
5020         }
5021
5022         vdb01_0246 = _mm512_unpacklo_pd(vdb0, vdb1);
5023         vdb01_1357 = _mm512_unpackhi_pd(vdb0, vdb1);
5024
5025         _mm_storeu_pd(dbs[0], _mm512_castpd512_pd128(vdb01_0246));
5026
5027         if (1 < batch_size)
5028                 _mm_storeu_pd(dbs[1], _mm512_castpd512_pd128(vdb01_1357));
5029
5030         if (2 < batch_size)
5031                 _mm_storeu_pd(dbs[2], _mm256_extractf128_pd(_mm512_castpd512_pd256(vdb01_0246), 1));
5032
5033         if (3 < batch_size)
5034                 _mm_storeu_pd(dbs[3], _mm256_extractf128_pd(_mm512_castpd512_pd256(vdb01_1357), 1));
5035
5036         if (4 < batch_size)
5037                 _mm_storeu_pd(dbs[4], _mm512_extractf64x2_pd(vdb01_0246, 2));
5038
5039         if (5 < batch_size)
5040                 _mm_storeu_pd(dbs[5], _mm512_extractf64x2_pd(vdb01_1357, 2));
5041
5042         if (6 < batch_size)
5043                 _mm_storeu_pd(dbs[6], _mm512_extractf64x2_pd(vdb01_0246, 3));
5044
5045         if (7 < batch_size)
5046                 _mm_storeu_pd(dbs[7], _mm512_extractf64x2_pd(vdb01_1357, 3));
5047 }
5048
5049 #elif (USE_X86_EXT_INTRIN >= 8) && defined(DATA_T_DOUBLE) && defined(FLOAT_T_DOUBLE)
5050
5051 static void sample_filter_LPF12_2_batch(int batch_size, FILTER_T **dcs, FILTER_T **dbs, DATA_T **sps, int32 *counts)
5052 {
5053         for (int i = 0; i < MIX_VOICE_BATCH_SIZE; i += 4) {
5054                 if (i >= batch_size)
5055                         break;
5056
5057                 __m128i vcounts = _mm_set_epi32(
5058                         i + 3 < batch_size ? counts[i + 3] : 0,
5059                         i + 2 < batch_size ? counts[i + 2] : 0,
5060                         i + 1 < batch_size ? counts[i + 1] : 0,
5061                         counts[i]
5062                 );
5063
5064                 __m128d vdb01_0 = _mm_loadu_pd(dbs[i]);
5065                 __m128d vdb01_1 = i + 1 < batch_size ? _mm_loadu_pd(dbs[i + 1]) : _mm_setzero_pd();
5066                 __m128d vdb01_2 = i + 2 < batch_size ? _mm_loadu_pd(dbs[i + 2]) : _mm_setzero_pd();
5067                 __m128d vdb01_3 = i + 3 < batch_size ? _mm_loadu_pd(dbs[i + 3]) : _mm_setzero_pd();
5068
5069                 __m256d vdb01_02 = _mm256_insertf128_pd(_mm256_castpd128_pd256(vdb01_0), vdb01_2, 1);
5070                 __m256d vdb01_13 = _mm256_insertf128_pd(_mm256_castpd128_pd256(vdb01_1), vdb01_3, 1);
5071
5072                 __m256d vdb0 = _mm256_unpacklo_pd(vdb01_02, vdb01_13);
5073                 __m256d vdb1 = _mm256_unpackhi_pd(vdb01_02, vdb01_13);
5074
5075                 __m128d vdc01_0 = _mm_loadu_pd(dcs[i]);
5076                 __m128d vdc01_1 = i + 1 < batch_size ? _mm_loadu_pd(dcs[i + 1]) : _mm_setzero_pd();
5077                 __m128d vdc01_2 = i + 2 < batch_size ? _mm_loadu_pd(dcs[i + 2]) : _mm_setzero_pd();
5078                 __m128d vdc01_3 = i + 3 < batch_size ? _mm_loadu_pd(dcs[i + 3]) : _mm_setzero_pd();
5079
5080                 __m256d vdc01_02 = _mm256_insertf128_pd(_mm256_castpd128_pd256(vdc01_0), vdc01_2, 1);
5081                 __m256d vdc01_13 = _mm256_insertf128_pd(_mm256_castpd128_pd256(vdc01_1), vdc01_3, 1);
5082
5083                 __m256d vdc0 = _mm256_unpacklo_pd(vdc01_02, vdc01_13);
5084                 __m256d vdc1 = _mm256_unpackhi_pd(vdc01_02, vdc01_13);
5085
5086                 __m128i vcounts_halfmax = _mm_max_epi32(vcounts, _mm_shuffle_epi32(vcounts, (3 << 2) | 2));
5087                 int32 count_max = _mm_cvtsi128_si32(_mm_max_epi32(vcounts_halfmax, _mm_shuffle_epi32(vcounts_halfmax, 1)));
5088
5089                 for (int32 j = 0; j < count_max; j += 4) {
5090                         __m256d vsp0123_0 = j < counts[i] ? _mm256_loadu_pd(&sps[i][j]) : _mm256_setzero_pd();
5091                         __m256d vsp0123_1 = i + 1 < batch_size && j < counts[i + 1] ? _mm256_loadu_pd(&sps[i + 1][j]) : _mm256_setzero_pd();
5092                         __m256d vsp0123_2 = i + 2 < batch_size && j < counts[i + 2] ? _mm256_loadu_pd(&sps[i + 2][j]) : _mm256_setzero_pd();
5093                         __m256d vsp0123_3 = i + 3 < batch_size && j < counts[i + 3] ? _mm256_loadu_pd(&sps[i + 3][j]) : _mm256_setzero_pd();
5094
5095                         __m256d vsp01_02 = _mm256_permute2f128_pd(vsp0123_0, vsp0123_2, (2 << 4) | 0);
5096                         __m256d vsp01_13 = _mm256_permute2f128_pd(vsp0123_1, vsp0123_3, (2 << 4) | 0);
5097                         __m256d vsp23_02 = _mm256_permute2f128_pd(vsp0123_0, vsp0123_2, (3 << 4) | 1);
5098                         __m256d vsp23_13 = _mm256_permute2f128_pd(vsp0123_1, vsp0123_3, (3 << 4) | 1);
5099
5100                         __m256d vsps[4];
5101                         vsps[0] = _mm256_unpacklo_pd(vsp01_02, vsp01_13);
5102                         vsps[1] = _mm256_unpackhi_pd(vsp01_02, vsp01_13);
5103                         vsps[2] = _mm256_unpacklo_pd(vsp23_02, vsp23_13);
5104                         vsps[3] = _mm256_unpackhi_pd(vsp23_02, vsp23_13);
5105
5106                         for (int k = 0; k < 4; k++) {
5107                                 __m256d vmask = _mm256_castsi256_pd(_mm256_cvtepi32_epi64(_mm_cmplt_epi32(_mm_set1_epi32(j + k), vcounts)));
5108
5109                                 vdb1 = _mm256_blendv_pd(vdb1, MM256_FMA_PD(_mm256_sub_pd(vsps[k], vdb0), vdc1, vdb1), vmask);
5110                                 vdb0 = _mm256_blendv_pd(vdb0, _mm256_add_pd(vdb0, vdb1), vmask);
5111                                 vdb1 = _mm256_blendv_pd(vdb1, _mm256_mul_pd(vdb1, vdc0), vmask);
5112                                 vsps[k] = vdb0;
5113                         }
5114
5115                         vsp01_02 = _mm256_unpacklo_pd(vsps[0], vsps[1]);
5116                         vsp01_13 = _mm256_unpackhi_pd(vsps[0], vsps[1]);
5117                         vsp23_02 = _mm256_unpacklo_pd(vsps[2], vsps[3]);
5118                         vsp23_13 = _mm256_unpackhi_pd(vsps[2], vsps[3]);
5119
5120                         vsp0123_0 = _mm256_permute2f128_pd(vsp01_02, vsp23_02, (2 << 4) | 0);
5121                         vsp0123_1 = _mm256_permute2f128_pd(vsp01_13, vsp23_13, (2 << 4) | 0);
5122                         vsp0123_2 = _mm256_permute2f128_pd(vsp01_02, vsp23_02, (3 << 4) | 1);
5123                         vsp0123_3 = _mm256_permute2f128_pd(vsp01_13, vsp23_13, (3 << 4) | 1);
5124
5125                         if (j < counts[i])
5126                                 _mm256_storeu_pd(&sps[i][j], vsp0123_0);
5127
5128                         if (i + 1 < batch_size && j < counts[i + 1])
5129                                 _mm256_storeu_pd(&sps[i + 1][j], vsp0123_1);
5130
5131                         if (i + 2 < batch_size && j < counts[i + 2])
5132                                 _mm256_storeu_pd(&sps[i + 2][j], vsp0123_2);
5133
5134                         if (i + 3 < batch_size && j < counts[i + 3])
5135                                 _mm256_storeu_pd(&sps[i + 3][j], vsp0123_3);
5136                 }
5137
5138                 vdb01_02 = _mm256_unpacklo_pd(vdb0, vdb1);
5139                 vdb01_13 = _mm256_unpackhi_pd(vdb0, vdb1);
5140
5141                 _mm_storeu_pd(dbs[i], _mm256_castpd256_pd128(vdb01_02));
5142
5143                 if (i + 1 < batch_size)
5144                         _mm_storeu_pd(dbs[i + 1], _mm256_castpd256_pd128(vdb01_13));
5145
5146                 if (i + 2 < batch_size)
5147                         _mm_storeu_pd(dbs[i + 2], _mm256_extractf128_pd(vdb01_02, 1));
5148
5149                 if (i + 3 < batch_size)
5150                         _mm_storeu_pd(dbs[i + 3], _mm256_extractf128_pd(vdb01_13, 1));
5151         }
5152 }
5153
5154 #elif (USE_X86_EXT_INTRIN >= 3) && defined(DATA_T_DOUBLE) && defined(FLOAT_T_DOUBLE)
5155
5156 static void sample_filter_LPF12_2_batch(int batch_size, FILTER_T **dcs, FILTER_T **dbs, DATA_T **sps, int32 *counts)
5157 {
5158         for (int i = 0; i < MIX_VOICE_BATCH_SIZE; i += 2) {
5159                 if (i >= batch_size)
5160                         break;
5161
5162                 __m128i vcounts = _mm_set_epi32(
5163                         0,
5164                         0,
5165                         i + 1 < batch_size ? counts[i + 1] : 0,
5166                         counts[i]
5167                 );
5168
5169                 __m128d vdb01_0 = _mm_loadu_pd(dbs[i]);
5170                 __m128d vdb01_1 = i + 1 < batch_size ? _mm_loadu_pd(dbs[i + 1]) : _mm_setzero_pd();
5171
5172                 __m128d vdb0 = _mm_unpacklo_pd(vdb01_0, vdb01_1);
5173                 __m128d vdb1 = _mm_unpackhi_pd(vdb01_0, vdb01_1);
5174
5175                 __m128d vdc01_0 = _mm_loadu_pd(dcs[i]);
5176                 __m128d vdc01_1 = i + 1 < batch_size ? _mm_loadu_pd(dcs[i + 1]) : _mm_setzero_pd();
5177
5178                 __m128d vdc0 = _mm_unpacklo_pd(vdc01_0, vdc01_1);
5179                 __m128d vdc1 = _mm_unpackhi_pd(vdc01_0, vdc01_1);
5180
5181                 int32 count_max = _mm_cvtsi128_si32(_mm_max_epi32(vcounts, _mm_shuffle_epi32(vcounts, 1)));
5182
5183                 for (int32 j = 0; j < count_max; j += 2) {
5184                         __m128d vsp01_0 = j < counts[i] ? _mm_loadu_pd(&sps[i][j]) : _mm_setzero_pd();
5185                         __m128d vsp01_1 = i + 1 < batch_size && j < counts[i + 1] ? _mm_loadu_pd(&sps[i + 1][j]) : _mm_setzero_pd();
5186
5187                         __m128d vsps[2];
5188                         vsps[0] = _mm_unpacklo_pd(vsp01_0, vsp01_1);
5189                         vsps[1] = _mm_unpackhi_pd(vsp01_0, vsp01_1);
5190
5191                         for (int k = 0; k < 2; k++) {
5192                                 __m128d vmask = _mm_castsi128_pd(_mm_cvtepi32_epi64(_mm_cmplt_epi32(_mm_set1_epi32(j + k), vcounts)));
5193
5194 #if USE_X86_EXT_INTRIN >= 6
5195                                 vdb1 = _mm_blendv_pd(vdb1, MM_FMA_PD(_mm_sub_pd(vsps[k], vdb0), vdc1, vdb1), vmask);
5196                                 vdb0 = _mm_blendv_pd(vdb0, _mm_add_pd(vdb0, vdb1), vmask);
5197                                 vdb1 = _mm_blendv_pd(vdb1, _mm_mul_pd(vdb1, vdc0), vmask);
5198 #else
5199                                 vdb1 = _mm_or_pd(_mm_andnot_pd(vmask, vdb1), _mm_and_pd(vmask, MM_FMA_PD(_mm_sub_pd(vsps[k], vdb0), vdc1, vdb1)));
5200                                 vdb0 = _mm_or_pd(_mm_andnot_pd(vmask, vdb0), _mm_and_pd(vmask, _mm_add_pd(vdb0, vdb1)));
5201                                 vdb1 = _mm_or_pd(_mm_andnot_pd(vmask, vdb1), _mm_and_pd(vmask, _mm_mul_pd(vdb1, vdc0)));
5202 #endif
5203                                 vsps[k] = vdb0;
5204                         }
5205
5206                         vsp01_0 = _mm_unpacklo_pd(vsps[0], vsps[1]);
5207                         vsp01_1 = _mm_unpackhi_pd(vsps[0], vsps[1]);
5208
5209                         if (j < counts[i])
5210                                 _mm_storeu_pd(&sps[i][j], vsp01_0);
5211
5212                         if (i + 1 < batch_size && j < counts[i + 1])
5213                                 _mm_storeu_pd(&sps[i + 1][j], vsp01_1);
5214                 }
5215
5216                 vdb01_0 = _mm_unpacklo_pd(vdb0, vdb1);
5217                 vdb01_1 = _mm_unpackhi_pd(vdb0, vdb1);
5218
5219                 _mm_storeu_pd(dbs[i], vdb01_0);
5220
5221                 if (i + 1 < batch_size)
5222                         _mm_storeu_pd(dbs[i + 1], vdb01_1);
5223         }
5224 }
5225
5226 #endif
5227
5228 #if (USE_X86_EXT_INTRIN >= 10) && defined(DATA_T_DOUBLE) && defined(FLOAT_T_DOUBLE)
5229
5230 static void recalc_filter_LPF12_2_batch(int batch_size, FilterCoefficients **fcs)
5231 {
5232         __m256d vfcrange0123_0 = _mm256_loadu_pd(fcs[0]->range);
5233         __m256d vfcrange0123_1 = 1 < batch_size ? _mm256_loadu_pd(fcs[1]->range) : _mm256_setzero_pd();
5234         __m256d vfcrange0123_2 = 2 < batch_size ? _mm256_loadu_pd(fcs[2]->range) : _mm256_setzero_pd();
5235         __m256d vfcrange0123_3 = 3 < batch_size ? _mm256_loadu_pd(fcs[3]->range) : _mm256_setzero_pd();
5236         __m256d vfcrange0123_4 = 4 < batch_size ? _mm256_loadu_pd(fcs[4]->range) : _mm256_setzero_pd();
5237         __m256d vfcrange0123_5 = 5 < batch_size ? _mm256_loadu_pd(fcs[5]->range) : _mm256_setzero_pd();
5238         __m256d vfcrange0123_6 = 6 < batch_size ? _mm256_loadu_pd(fcs[6]->range) : _mm256_setzero_pd();
5239         __m256d vfcrange0123_7 = 7 < batch_size ? _mm256_loadu_pd(fcs[7]->range) : _mm256_setzero_pd();
5240
5241         __m512d vfcrange0123_02 = _mm512_insertf64x4(_mm512_castpd256_pd512(vfcrange0123_0), vfcrange0123_2, 1);
5242         __m512d vfcrange0123_13 = _mm512_insertf64x4(_mm512_castpd256_pd512(vfcrange0123_1), vfcrange0123_3, 1);
5243         __m512d vfcrange0123_46 = _mm512_insertf64x4(_mm512_castpd256_pd512(vfcrange0123_4), vfcrange0123_6, 1);
5244         __m512d vfcrange0123_57 = _mm512_insertf64x4(_mm512_castpd256_pd512(vfcrange0123_5), vfcrange0123_7, 1);
5245
5246         __m512d vfcrange01_0246 = _mm512_shuffle_f64x2(vfcrange0123_02, vfcrange0123_46, (2 << 6) | (0 << 4) | (2 << 2) | 0);
5247         __m512d vfcrange01_1357 = _mm512_shuffle_f64x2(vfcrange0123_13, vfcrange0123_57, (2 << 6) | (0 << 4) | (2 << 2) | 0);
5248         __m512d vfcrange23_0246 = _mm512_shuffle_f64x2(vfcrange0123_02, vfcrange0123_46, (3 << 6) | (1 << 4) | (3 << 2) | 1);
5249         __m512d vfcrange23_1357 = _mm512_shuffle_f64x2(vfcrange0123_13, vfcrange0123_57, (3 << 6) | (1 << 4) | (3 << 2) | 1);
5250
5251         __m512d vfcrange0 = _mm512_unpacklo_pd(vfcrange01_0246, vfcrange01_1357);
5252         __m512d vfcrange1 = _mm512_unpackhi_pd(vfcrange01_0246, vfcrange01_1357);
5253         __m512d vfcrange2 = _mm512_unpacklo_pd(vfcrange23_0246, vfcrange23_1357);
5254         __m512d vfcrange3 = _mm512_unpackhi_pd(vfcrange23_0246, vfcrange23_1357);
5255
5256         __m512d vfcfreq = _mm512_set_pd(
5257                 7 < batch_size ? fcs[7]->freq : 0.0,
5258                 6 < batch_size ? fcs[6]->freq : 0.0,
5259                 5 < batch_size ? fcs[5]->freq : 0.0,
5260                 4 < batch_size ? fcs[4]->freq : 0.0,
5261                 3 < batch_size ? fcs[3]->freq : 0.0,
5262                 2 < batch_size ? fcs[2]->freq : 0.0,
5263                 1 < batch_size ? fcs[1]->freq : 0.0,
5264                 fcs[0]->freq
5265         );
5266
5267         __m512d vfcreso_DB = _mm512_set_pd(
5268                 7 < batch_size ? fcs[7]->reso_dB : 0.0,
5269                 6 < batch_size ? fcs[6]->reso_dB : 0.0,
5270                 5 < batch_size ? fcs[5]->reso_dB : 0.0,
5271                 4 < batch_size ? fcs[4]->reso_dB : 0.0,
5272                 3 < batch_size ? fcs[3]->reso_dB : 0.0,
5273                 2 < batch_size ? fcs[2]->reso_dB : 0.0,
5274                 1 < batch_size ? fcs[1]->reso_dB : 0.0,
5275                 fcs[0]->reso_dB
5276         );
5277
5278         uint8 imask = _kor_mask8(
5279                 _kor_mask8(_mm512_cmp_pd_mask(vfcfreq, vfcrange0, _CMP_LT_OS), _mm512_cmp_pd_mask(vfcfreq, vfcrange1, _CMP_GT_OS)),
5280                 _kor_mask8(_mm512_cmp_pd_mask(vfcreso_DB, vfcrange2, _CMP_LT_OS), _mm512_cmp_pd_mask(vfcreso_DB, vfcrange3, _CMP_GT_OS))
5281         ) & ((1 << batch_size) - 1);
5282
5283         if (imask) {
5284                 __m512d v1mmargin = _mm512_set1_pd(1.0 - ext_filter_margin);
5285                 __m512d v1pmargin = _mm512_set1_pd(1.0 + ext_filter_margin);
5286
5287                 vfcrange0 = _mm512_mul_pd(vfcfreq, v1mmargin);
5288                 vfcrange1 = _mm512_mul_pd(vfcfreq, v1pmargin);
5289                 vfcrange2 = _mm512_mul_pd(vfcreso_DB, v1mmargin);
5290                 vfcrange3 = _mm512_mul_pd(vfcreso_DB, v1pmargin);
5291
5292                 vfcrange01_0246 = _mm512_unpacklo_pd(vfcrange0, vfcrange1);
5293                 vfcrange01_1357 = _mm512_unpackhi_pd(vfcrange0, vfcrange1);
5294                 vfcrange23_0246 = _mm512_unpacklo_pd(vfcrange2, vfcrange3);
5295                 vfcrange23_1357 = _mm512_unpackhi_pd(vfcrange2, vfcrange3);
5296
5297 #if 1
5298                 __m512d vfcrange0123_04 = _mm512_permutex2var_pd(vfcrange01_0246, _mm512_set_epi64(13, 12, 5, 4, 9, 8, 1, 0), vfcrange23_0246);
5299                 __m512d vfcrange0123_26 = _mm512_permutex2var_pd(vfcrange01_0246, _mm512_set_epi64(15, 14, 7, 6, 11, 10, 3, 2), vfcrange23_0246);
5300                 __m512d vfcrange0123_15 = _mm512_permutex2var_pd(vfcrange01_1357, _mm512_set_epi64(13, 12, 5, 4, 9, 8, 1, 0), vfcrange23_1357);
5301                 __m512d vfcrange0123_37 = _mm512_permutex2var_pd(vfcrange01_1357, _mm512_set_epi64(15, 14, 7, 6, 11, 10, 3, 2), vfcrange23_1357);
5302 #else
5303                 __m512d vfcrange0123_04 = _mm512_mask_permutex_pd(vfcrange01_0246, 0xCC, vfcrange23_0246, (1 << 6) | (0 << 4) | 0);
5304                 __m512d vfcrange0123_26 = _mm512_mask_permutex_pd(vfcrange01_0246, 0x33, vfcrange23_0246, (3 << 2) | 2);
5305                 __m512d vfcrange0123_15 = _mm512_mask_permutex_pd(vfcrange01_1357, 0xCC, vfcrange23_1357, (1 << 6) | (0 << 4) | 0);
5306                 __m512d vfcrange0123_37 = _mm512_mask_permutex_pd(vfcrange01_1357, 0x33, vfcrange23_1357, (3 << 2) | 2);
5307 #endif
5308
5309                 if (imask & 1)
5310                         _mm256_storeu_pd(fcs[0]->range, _mm512_castpd512_pd256(vfcrange0123_04));
5311
5312                 if (imask & (1 << 1))
5313                         _mm256_storeu_pd(fcs[1]->range, _mm512_castpd512_pd256(vfcrange0123_15));
5314
5315                 if (imask & (1 << 2))
5316                         _mm256_storeu_pd(fcs[2]->range, _mm512_castpd512_pd256(vfcrange0123_26));
5317
5318                 if (imask & (1 << 3))
5319                         _mm256_storeu_pd(fcs[3]->range, _mm512_castpd512_pd256(vfcrange0123_37));
5320
5321                 if (imask & (1 << 4))
5322                         _mm256_storeu_pd(fcs[4]->range, _mm512_extractf64x4_pd(vfcrange0123_04, 1));
5323
5324                 if (imask & (1 << 5))
5325                         _mm256_storeu_pd(fcs[5]->range, _mm512_extractf64x4_pd(vfcrange0123_15, 1));
5326
5327                 if (imask & (1 << 6))
5328                         _mm256_storeu_pd(fcs[6]->range, _mm512_extractf64x4_pd(vfcrange0123_26, 1));
5329
5330                 if (imask & (1 << 7))
5331                         _mm256_storeu_pd(fcs[7]->range, _mm512_extractf64x4_pd(vfcrange0123_37, 1));
5332
5333                 __m512d vfcdiv_flt_rate = _mm512_set_pd(
5334                         7 < batch_size ? fcs[7]->div_flt_rate : fcs[0]->div_flt_rate,
5335                         6 < batch_size ? fcs[6]->div_flt_rate : fcs[0]->div_flt_rate,
5336                         5 < batch_size ? fcs[5]->div_flt_rate : fcs[0]->div_flt_rate,
5337                         4 < batch_size ? fcs[4]->div_flt_rate : fcs[0]->div_flt_rate,
5338                         3 < batch_size ? fcs[3]->div_flt_rate : fcs[0]->div_flt_rate,
5339                         2 < batch_size ? fcs[2]->div_flt_rate : fcs[0]->div_flt_rate,
5340                         1 < batch_size ? fcs[1]->div_flt_rate : fcs[0]->div_flt_rate,
5341                         fcs[0]->div_flt_rate
5342                 );
5343
5344                 __m512d vf = _mm512_mul_pd(_mm512_mul_pd(_mm512_set1_pd(M_PI2), vfcfreq), vfcdiv_flt_rate);
5345
5346                 FLOAT_T reso_db_cf_p = RESO_DB_CF_P(fcs[0]->reso_dB);
5347
5348                 __m512d vreso_db_cf_p = _mm512_set_pd(
5349                         7 < batch_size ? RESO_DB_CF_P(fcs[7]->reso_dB) : reso_db_cf_p,
5350                         6 < batch_size ? RESO_DB_CF_P(fcs[6]->reso_dB) : reso_db_cf_p,
5351                         5 < batch_size ? RESO_DB_CF_P(fcs[5]->reso_dB) : reso_db_cf_p,
5352                         4 < batch_size ? RESO_DB_CF_P(fcs[4]->reso_dB) : reso_db_cf_p,
5353                         3 < batch_size ? RESO_DB_CF_P(fcs[3]->reso_dB) : reso_db_cf_p,
5354                         2 < batch_size ? RESO_DB_CF_P(fcs[2]->reso_dB) : reso_db_cf_p,
5355                         1 < batch_size ? RESO_DB_CF_P(fcs[1]->reso_dB) : reso_db_cf_p,
5356                         reso_db_cf_p
5357                 );
5358
5359                 __m512d v1 = _mm512_set1_pd(1.0);
5360                 __m512d v2 = _mm512_set1_pd(2.0);
5361                 __m512d v0_5 = _mm512_set1_pd(0.5);
5362
5363                 __m512d vq = _mm512_sub_pd(v1, _mm512_div_pd(vf, _mm512_fmadd_pd(v2, _mm512_add_pd(vreso_db_cf_p, _mm512_div_pd(v0_5, _mm512_add_pd(v1, vf))), _mm512_sub_pd(vf, v2))));
5364                 __m512d vc0 = _mm512_mul_pd(vq, vq);
5365 #ifdef USE_SVML
5366                 __m512d vcosf = _mm512_cos_pd(vf);
5367 #else
5368                 ALIGN FLOAT_T af[8];
5369                 _mm512_storeu_pd(af, vf);
5370                 __m512d vcosf = _mm512_set_pd(cos(af[7]), cos(af[6]), cos(af[5]), cos(af[4]), cos(af[3]), cos(af[2]), cos(af[1]), cos(af[0]));
5371 #endif
5372                 __m512d vc1 = _mm512_sub_pd(_mm512_add_pd(vc0, v1), _mm512_mul_pd(_mm512_mul_pd(v2, vcosf), vq));
5373
5374                 __m512d vdc0246 = _mm512_unpacklo_pd(vc0, vc1);
5375                 __m512d vdc1357 = _mm512_unpackhi_pd(vc0, vc1);
5376
5377                 if (imask & 1)
5378                         _mm_storeu_pd(fcs[0]->dc, _mm512_castpd512_pd128(vdc0246));
5379                 if (imask & (1 << 1))
5380                         _mm_storeu_pd(fcs[1]->dc, _mm512_castpd512_pd128(vdc1357));
5381                 if (imask & (1 << 2))
5382                         _mm_storeu_pd(fcs[2]->dc, _mm256_extractf128_pd(_mm512_castpd512_pd256(vdc0246), 1));
5383                 if (imask & (1 << 3))
5384                         _mm_storeu_pd(fcs[3]->dc, _mm256_extractf128_pd(_mm512_castpd512_pd256(vdc1357), 1));
5385                 if (imask & (1 << 4))
5386                         _mm_storeu_pd(fcs[4]->dc, _mm512_extractf64x2_pd(vdc0246, 2));
5387                 if (imask & (1 << 5))
5388                         _mm_storeu_pd(fcs[5]->dc, _mm512_extractf64x2_pd(vdc1357, 2));
5389                 if (imask & (1 << 6))
5390                         _mm_storeu_pd(fcs[6]->dc, _mm512_extractf64x2_pd(vdc0246, 3));
5391                 if (imask & (1 << 7))
5392                         _mm_storeu_pd(fcs[7]->dc, _mm512_extractf64x2_pd(vdc1357, 3));
5393         }
5394 }
5395
5396 #elif (USE_X86_EXT_INTRIN >= 8) && defined(DATA_T_DOUBLE) && defined(FLOAT_T_DOUBLE)
5397
5398 static void recalc_filter_LPF12_2_batch(int batch_size, FilterCoefficients** fcs)
5399 {
5400         for (int i = 0; i < MIX_VOICE_BATCH_SIZE; i += 4) {
5401                 if (i >= batch_size)
5402                         break;
5403
5404                 __m256d vfcrange0123_0 = _mm256_loadu_pd(fcs[i]->range);
5405                 __m256d vfcrange0123_1 = i + 1 < batch_size ? _mm256_loadu_pd(fcs[i + 1]->range) : _mm256_setzero_pd();
5406                 __m256d vfcrange0123_2 = i + 2 < batch_size ? _mm256_loadu_pd(fcs[i + 2]->range) : _mm256_setzero_pd();
5407                 __m256d vfcrange0123_3 = i + 3 < batch_size ? _mm256_loadu_pd(fcs[i + 3]->range) : _mm256_setzero_pd();
5408
5409                 __m256d vfcrange01_02 = _mm256_permute2f128_pd(vfcrange0123_0, vfcrange0123_2, (2 << 4) | 0);
5410                 __m256d vfcrange01_13 = _mm256_permute2f128_pd(vfcrange0123_1, vfcrange0123_3, (2 << 4) | 0);
5411                 __m256d vfcrange23_02 = _mm256_permute2f128_pd(vfcrange0123_0, vfcrange0123_2, (3 << 4) | 1);
5412                 __m256d vfcrange23_13 = _mm256_permute2f128_pd(vfcrange0123_1, vfcrange0123_3, (3 << 4) | 1);
5413
5414                 __m256d vfcrange0 = _mm256_unpacklo_pd(vfcrange01_02, vfcrange01_13);
5415                 __m256d vfcrange1 = _mm256_unpackhi_pd(vfcrange01_02, vfcrange01_13);
5416                 __m256d vfcrange2 = _mm256_unpacklo_pd(vfcrange23_02, vfcrange23_13);
5417                 __m256d vfcrange3 = _mm256_unpackhi_pd(vfcrange23_02, vfcrange23_13);
5418
5419                 __m256d vfcfreq = _mm256_set_pd(
5420                         i + 3 < batch_size ? fcs[i + 3]->freq : 0.0,
5421                         i + 2 < batch_size ? fcs[i + 2]->freq : 0.0,
5422                         i + 1 < batch_size ? fcs[i + 1]->freq : 0.0,
5423                         fcs[i]->freq
5424                 );
5425
5426                 __m256d vfcreso_DB = _mm256_set_pd(
5427                         i + 3 < batch_size ? fcs[i + 3]->reso_dB : 0.0,
5428                         i + 2 < batch_size ? fcs[i + 2]->reso_dB : 0.0,
5429                         i + 1 < batch_size ? fcs[i + 1]->reso_dB : 0.0,
5430                         fcs[i]->reso_dB
5431                 );
5432
5433                 __m256d vmask = _mm256_or_pd(
5434                         _mm256_or_pd(_mm256_cmp_pd(vfcfreq, vfcrange0, _CMP_LT_OS), _mm256_cmp_pd(vfcfreq, vfcrange1, _CMP_GT_OS)),
5435                         _mm256_or_pd(_mm256_cmp_pd(vfcreso_DB, vfcrange2, _CMP_LT_OS), _mm256_cmp_pd(vfcreso_DB, vfcrange3, _CMP_GT_OS))
5436                 );
5437
5438                 int imask = _mm256_movemask_pd(vmask) & ((1 << (batch_size - i)) - 1);
5439
5440                 if (imask) {
5441                         __m256d v1mmargin = _mm256_set1_pd(1.0 - ext_filter_margin);
5442                         __m256d v1pmargin = _mm256_set1_pd(1.0 + ext_filter_margin);
5443
5444                         vfcrange0 = _mm256_mul_pd(vfcfreq, v1mmargin);
5445                         vfcrange1 = _mm256_mul_pd(vfcfreq, v1pmargin);
5446                         vfcrange2 = _mm256_mul_pd(vfcreso_DB, v1mmargin);
5447                         vfcrange3 = _mm256_mul_pd(vfcreso_DB, v1pmargin);
5448
5449                         vfcrange01_02 = _mm256_unpacklo_pd(vfcrange0, vfcrange1);
5450                         vfcrange01_13 = _mm256_unpackhi_pd(vfcrange0, vfcrange1);
5451                         vfcrange23_02 = _mm256_unpacklo_pd(vfcrange2, vfcrange3);
5452                         vfcrange23_13 = _mm256_unpackhi_pd(vfcrange2, vfcrange3);
5453
5454                         vfcrange0123_0 = _mm256_permute2f128_pd(vfcrange01_02, vfcrange23_02, (2 << 4) | 0);
5455                         vfcrange0123_1 = _mm256_permute2f128_pd(vfcrange01_13, vfcrange23_13, (2 << 4) | 0);
5456                         vfcrange0123_2 = _mm256_permute2f128_pd(vfcrange01_02, vfcrange23_02, (3 << 4) | 1);
5457                         vfcrange0123_3 = _mm256_permute2f128_pd(vfcrange01_13, vfcrange23_13, (3 << 4) | 1);
5458
5459                         if (imask & 1)
5460                                 _mm256_storeu_pd(fcs[i]->range, vfcrange0123_0);
5461
5462                         if (imask & (1 << 1))
5463                                 _mm256_storeu_pd(fcs[i + 1]->range, vfcrange0123_1);
5464
5465                         if (imask & (1 << 2))
5466                                 _mm256_storeu_pd(fcs[i + 2]->range, vfcrange0123_2);
5467
5468                         if (imask & (1 << 3))
5469                                 _mm256_storeu_pd(fcs[i + 3]->range, vfcrange0123_3);
5470
5471                         __m256d vfcdiv_flt_rate = _mm256_set_pd(
5472                                 i + 3 < batch_size ? fcs[i + 3]->div_flt_rate : fcs[i]->div_flt_rate,
5473                                 i + 2 < batch_size ? fcs[i + 2]->div_flt_rate : fcs[i]->div_flt_rate,
5474                                 i + 1 < batch_size ? fcs[i + 1]->div_flt_rate : fcs[i]->div_flt_rate,
5475                                 fcs[i]->div_flt_rate
5476                         );
5477
5478                         __m256d vf = _mm256_mul_pd(_mm256_mul_pd(_mm256_set1_pd(M_PI2), vfcfreq), vfcdiv_flt_rate);
5479
5480                         FLOAT_T reso_db_cf_p = RESO_DB_CF_P(fcs[i]->reso_dB);
5481
5482                         __m256d vreso_db_cf_p = _mm256_set_pd(
5483                                 i + 3 < batch_size ? RESO_DB_CF_P(fcs[i + 3]->reso_dB) : reso_db_cf_p,
5484                                 i + 2 < batch_size ? RESO_DB_CF_P(fcs[i + 2]->reso_dB) : reso_db_cf_p,
5485                                 i + 1 < batch_size ? RESO_DB_CF_P(fcs[i + 1]->reso_dB) : reso_db_cf_p,
5486                                 reso_db_cf_p
5487                         );
5488
5489                         __m256d v1 = _mm256_set1_pd(1.0);
5490                         __m256d v2 = _mm256_set1_pd(2.0);
5491                         __m256d v0_5 = _mm256_set1_pd(0.5);
5492
5493                         __m256d vq = _mm256_sub_pd(v1, _mm256_div_pd(vf, MM256_FMA_PD(v2, _mm256_add_pd(vreso_db_cf_p, _mm256_div_pd(v0_5, _mm256_add_pd(v1, vf))), _mm256_sub_pd(vf, v2))));
5494                         __m256d vc0 = _mm256_mul_pd(vq, vq);
5495 #ifdef USE_SVML
5496                         __m256d vcosf = _mm256_cos_pd(vf);
5497 #else
5498                         ALIGN FLOAT_T af[4];
5499                         _mm256_storeu_pd(af, vf);
5500                         __m256d vcosf = _mm256_set_pd(cos(af[3]), cos(af[2]), cos(af[1]), cos(af[0]));
5501 #endif
5502                         __m256d vc1 = _mm256_sub_pd(_mm256_add_pd(vc0, v1), _mm256_mul_pd(_mm256_mul_pd(v2, vcosf), vq));
5503
5504                         __m256d vdc02 = _mm256_unpacklo_pd(vc0, vc1);
5505                         __m256d vdc13 = _mm256_unpackhi_pd(vc0, vc1);
5506
5507                         if (imask & 1)
5508                                 _mm_storeu_pd(fcs[i]->dc, _mm256_castpd256_pd128(vdc02));
5509                         if (imask & (1 << 1))
5510                                 _mm_storeu_pd(fcs[i + 1]->dc, _mm256_castpd256_pd128(vdc13));
5511                         if (imask & (1 << 2))
5512                                 _mm_storeu_pd(fcs[i + 2]->dc, _mm256_extractf128_pd(vdc02, 1));
5513                         if (imask & (1 << 3))
5514                                 _mm_storeu_pd(fcs[i + 3]->dc, _mm256_extractf128_pd(vdc13, 1));
5515                 }
5516         }
5517 }
5518
5519 #elif (USE_X86_EXT_INTRIN >= 3) && defined(DATA_T_DOUBLE) && defined(FLOAT_T_DOUBLE)
5520
5521 static void recalc_filter_LPF12_2_batch(int batch_size, FilterCoefficients** fcs)
5522 {
5523         for (int i = 0; i < MIX_VOICE_BATCH_SIZE; i += 2) {
5524                 if (i >= batch_size)
5525                         break;
5526
5527                 __m128d vfcrange01_0 = _mm_loadu_pd(fcs[i]->range);
5528                 __m128d vfcrange23_0 = _mm_loadu_pd(&fcs[i]->range[2]);
5529                 __m128d vfcrange01_1 = i + 1 < batch_size ? _mm_loadu_pd(fcs[i + 1]->range) : _mm_setzero_pd();
5530                 __m128d vfcrange23_1 = i + 1 < batch_size ? _mm_loadu_pd(&fcs[i + 1]->range[2]) : _mm_setzero_pd();
5531
5532                 __m128d vfcrange0 = _mm_unpacklo_pd(vfcrange01_0, vfcrange01_1);
5533                 __m128d vfcrange1 = _mm_unpackhi_pd(vfcrange01_0, vfcrange01_1);
5534                 __m128d vfcrange2 = _mm_unpacklo_pd(vfcrange23_0, vfcrange23_1);
5535                 __m128d vfcrange3 = _mm_unpackhi_pd(vfcrange23_0, vfcrange23_1);
5536
5537                 __m128d vfcfreq = _mm_set_pd(
5538                         i + 1 < batch_size ? fcs[i + 1]->freq : 0.0,
5539                         fcs[i]->freq
5540                 );
5541
5542                 __m128d vfcreso_DB = _mm_set_pd(
5543                         i + 1 < batch_size ? fcs[i + 1]->reso_dB : 0.0,
5544                         fcs[i]->reso_dB
5545                 );
5546
5547                 __m128d vmask = _mm_or_pd(
5548                         _mm_or_pd(_mm_cmplt_pd(vfcfreq, vfcrange0), _mm_cmpgt_pd(vfcfreq, vfcrange1)),
5549                         _mm_or_pd(_mm_cmplt_pd(vfcreso_DB, vfcrange2), _mm_cmpgt_pd(vfcreso_DB, vfcrange3))
5550                 );
5551
5552                 int imask = _mm_movemask_pd(vmask) & ((1 << (batch_size - i)) - 1);
5553
5554                 if (imask) {
5555                         __m128d v1mmargin = _mm_set1_pd(1.0 - ext_filter_margin);
5556                         __m128d v1pmargin = _mm_set1_pd(1.0 + ext_filter_margin);
5557
5558                         vfcrange0 = _mm_mul_pd(vfcfreq, v1mmargin);
5559                         vfcrange1 = _mm_mul_pd(vfcfreq, v1pmargin);
5560                         vfcrange2 = _mm_mul_pd(vfcreso_DB, v1mmargin);
5561                         vfcrange3 = _mm_mul_pd(vfcreso_DB, v1pmargin);
5562
5563                         vfcrange01_0 = _mm_unpacklo_pd(vfcrange0, vfcrange1);
5564                         vfcrange01_1 = _mm_unpackhi_pd(vfcrange0, vfcrange1);
5565                         vfcrange23_0 = _mm_unpacklo_pd(vfcrange2, vfcrange3);
5566                         vfcrange23_1 = _mm_unpackhi_pd(vfcrange2, vfcrange3);
5567
5568                         if (imask & 1) {
5569                                 _mm_storeu_pd(fcs[i]->range, vfcrange01_0);
5570                                 _mm_storeu_pd(&fcs[i]->range[2], vfcrange23_0);
5571                         }
5572
5573                         if (imask & (1 << 1)) {
5574                                 _mm_storeu_pd(fcs[i + 1]->range, vfcrange01_1);
5575                                 _mm_storeu_pd(&fcs[i + 1]->range[2], vfcrange23_1);
5576                         }
5577
5578                         __m128d vfcdiv_flt_rate = _mm_set_pd(
5579                                 i + 1 < batch_size ? fcs[i + 1]->div_flt_rate : fcs[i]->div_flt_rate,
5580                                 fcs[i]->div_flt_rate
5581                         );
5582
5583                         __m128d vf = _mm_mul_pd(_mm_mul_pd(_mm_set1_pd(M_PI2), vfcfreq), vfcdiv_flt_rate);
5584
5585                         FLOAT_T reso_db_cf_p = RESO_DB_CF_P(fcs[i]->reso_dB);
5586
5587                         __m128d vreso_db_cf_p = _mm_set_pd(
5588                                 i + 1 < batch_size ? RESO_DB_CF_P(fcs[i + 1]->reso_dB) : reso_db_cf_p,
5589                                 reso_db_cf_p
5590                         );
5591
5592                         __m128d v1 = _mm_set1_pd(1.0);
5593                         __m128d v2 = _mm_set1_pd(2.0);
5594                         __m128d v0_5 = _mm_set1_pd(0.5);
5595
5596                         __m128d vq = _mm_sub_pd(v1, _mm_div_pd(vf, MM_FMA_PD(v2, _mm_add_pd(vreso_db_cf_p, _mm_div_pd(v0_5, _mm_add_pd(v1, vf))), _mm_sub_pd(vf, v2))));
5597                         __m128d vc0 = _mm_mul_pd(vq, vq);
5598 #ifdef USE_SVML
5599                         __m128d vcosf = _mm_cos_pd(vf);
5600 #else
5601                         ALIGN FLOAT_T af[2];
5602                         _mm_storeu_pd(af, vf);
5603                         __m128d vcosf = _mm_set_pd(cos(af[1]), cos(af[0]));
5604 #endif
5605                         __m128d vc1 = _mm_sub_pd(_mm_add_pd(vc0, v1), _mm_mul_pd(_mm_mul_pd(v2, vcosf), vq));
5606
5607                         __m128d vdc0 = _mm_unpacklo_pd(vc0, vc1);
5608                         __m128d vdc1 = _mm_unpackhi_pd(vc0, vc1);
5609
5610                         if (imask & 1)
5611                                 _mm_storeu_pd(fcs[i]->dc, vdc0);
5612
5613                         if (imask & (1 << 1))
5614                                 _mm_storeu_pd(fcs[i + 1]->dc, vdc1);
5615                 }
5616         }
5617 }
5618
5619 #endif
5620
5621 #if (USE_X86_EXT_INTRIN >= 10) && defined(DATA_T_DOUBLE) && defined(FLOAT_T_DOUBLE)
5622
5623 static void sample_filter_HPF12_2_batch(int batch_size, FILTER_T **dcs, FILTER_T **dbs, DATA_T **sps, int32 *counts)
5624 {
5625         __m256i vcounts = _mm256_maskz_loadu_epi32(generate_mask8_for_count(0, batch_size), counts);
5626
5627         __m128d vdb01_0 = _mm_loadu_pd(dbs[0]);
5628         __m128d vdb01_1 = 1 < batch_size ? _mm_loadu_pd(dbs[1]) : _mm_setzero_pd();
5629         __m128d vdb01_2 = 2 < batch_size ? _mm_loadu_pd(dbs[2]) : _mm_setzero_pd();
5630         __m128d vdb01_3 = 3 < batch_size ? _mm_loadu_pd(dbs[3]) : _mm_setzero_pd();
5631         __m128d vdb01_4 = 4 < batch_size ? _mm_loadu_pd(dbs[4]) : _mm_setzero_pd();
5632         __m128d vdb01_5 = 5 < batch_size ? _mm_loadu_pd(dbs[5]) : _mm_setzero_pd();
5633         __m128d vdb01_6 = 6 < batch_size ? _mm_loadu_pd(dbs[6]) : _mm_setzero_pd();
5634         __m128d vdb01_7 = 7 < batch_size ? _mm_loadu_pd(dbs[7]) : _mm_setzero_pd();
5635
5636         __m256d vdb01_02 = _mm256_insertf128_pd(_mm256_castpd128_pd256(vdb01_0), vdb01_2, 1);
5637         __m256d vdb01_13 = _mm256_insertf128_pd(_mm256_castpd128_pd256(vdb01_1), vdb01_3, 1);
5638         __m256d vdb01_46 = _mm256_insertf128_pd(_mm256_castpd128_pd256(vdb01_4), vdb01_6, 1);
5639         __m256d vdb01_57 = _mm256_insertf128_pd(_mm256_castpd128_pd256(vdb01_5), vdb01_7, 1);
5640
5641         __m512d vdb01_0246 = _mm512_insertf64x4(_mm512_castpd256_pd512(vdb01_02), vdb01_46, 1);
5642         __m512d vdb01_1357 = _mm512_insertf64x4(_mm512_castpd256_pd512(vdb01_13), vdb01_57, 1);
5643
5644         __m512d vdb0 = _mm512_unpacklo_pd(vdb01_0246, vdb01_1357);
5645         __m512d vdb1 = _mm512_unpackhi_pd(vdb01_0246, vdb01_1357);
5646
5647         __m128d vdc01_0 = _mm_loadu_pd(dcs[0]);
5648         __m128d vdc01_1 = 1 < batch_size ? _mm_loadu_pd(dcs[1]) : _mm_setzero_pd();
5649         __m128d vdc01_2 = 2 < batch_size ? _mm_loadu_pd(dcs[2]) : _mm_setzero_pd();
5650         __m128d vdc01_3 = 3 < batch_size ? _mm_loadu_pd(dcs[3]) : _mm_setzero_pd();
5651         __m128d vdc01_4 = 4 < batch_size ? _mm_loadu_pd(dcs[4]) : _mm_setzero_pd();
5652         __m128d vdc01_5 = 5 < batch_size ? _mm_loadu_pd(dcs[5]) : _mm_setzero_pd();
5653         __m128d vdc01_6 = 6 < batch_size ? _mm_loadu_pd(dcs[6]) : _mm_setzero_pd();
5654         __m128d vdc01_7 = 7 < batch_size ? _mm_loadu_pd(dcs[7]) : _mm_setzero_pd();
5655
5656         __m256d vdc01_02 = _mm256_insertf128_pd(_mm256_castpd128_pd256(vdc01_0), vdc01_2, 1);
5657         __m256d vdc01_13 = _mm256_insertf128_pd(_mm256_castpd128_pd256(vdc01_1), vdc01_3, 1);
5658         __m256d vdc01_46 = _mm256_insertf128_pd(_mm256_castpd128_pd256(vdc01_4), vdc01_6, 1);
5659         __m256d vdc01_57 = _mm256_insertf128_pd(_mm256_castpd128_pd256(vdc01_5), vdc01_7, 1);
5660
5661         __m512d vdc01_0246 = _mm512_insertf64x4(_mm512_castpd256_pd512(vdc01_02), vdc01_46, 1);
5662         __m512d vdc01_1357 = _mm512_insertf64x4(_mm512_castpd256_pd512(vdc01_13), vdc01_57, 1);
5663
5664         __m512d vdc0 = _mm512_unpacklo_pd(vdc01_0246, vdc01_1357);
5665         __m512d vdc1 = _mm512_unpackhi_pd(vdc01_0246, vdc01_1357);
5666
5667         __m128i vcounts_max = _mm_max_epi32(_mm256_castsi256_si128(vcounts), _mm256_extracti128_si256(vcounts, 1));
5668         vcounts_max = _mm_max_epi32(vcounts_max, _mm_shuffle_epi32(vcounts_max, (3 << 2) | 2));
5669         int32 count_max = _mm_cvtsi128_si32(_mm_max_epi32(vcounts_max, _mm_shuffle_epi32(vcounts_max, 1)));
5670
5671         for (int32 j = 0; j < count_max; j += 8) {
5672                 __m512d vin[8];
5673                 vin[0] = _mm512_maskz_loadu_pd(generate_mask8_for_count(j, counts[0]), &sps[0][j]);
5674
5675                 for (int k = 1; k < 8; k++)
5676                         vin[k] = _mm512_maskz_loadu_pd(k < batch_size ? generate_mask8_for_count(j, counts[k]) : 0, &sps[k][j]);
5677
5678                 __m512d vsp0246_01 = _mm512_unpacklo_pd(vin[0], vin[1]);
5679                 __m512d vsp1357_01 = _mm512_unpackhi_pd(vin[0], vin[1]);
5680                 __m512d vsp0246_23 = _mm512_unpacklo_pd(vin[2], vin[3]);
5681                 __m512d vsp1357_23 = _mm512_unpackhi_pd(vin[2], vin[3]);
5682                 __m512d vsp0246_45 = _mm512_unpacklo_pd(vin[4], vin[5]);
5683                 __m512d vsp1357_45 = _mm512_unpackhi_pd(vin[4], vin[5]);
5684                 __m512d vsp0246_67 = _mm512_unpacklo_pd(vin[6], vin[7]);
5685                 __m512d vsp1357_67 = _mm512_unpackhi_pd(vin[6], vin[7]);
5686
5687                 __m512d vsp04_0123 = _mm512_shuffle_f64x2(vsp0246_01, vsp0246_23, (2 << 6) | (0 << 4) | (2 << 2) | 0);
5688                 __m512d vsp26_0123 = _mm512_shuffle_f64x2(vsp0246_01, vsp0246_23, (3 << 6) | (1 << 4) | (3 << 2) | 1);
5689                 __m512d vsp15_0123 = _mm512_shuffle_f64x2(vsp1357_01, vsp1357_23, (2 << 6) | (0 << 4) | (2 << 2) | 0);
5690                 __m512d vsp37_0123 = _mm512_shuffle_f64x2(vsp1357_01, vsp1357_23, (3 << 6) | (1 << 4) | (3 << 2) | 1);
5691                 __m512d vsp04_4567 = _mm512_shuffle_f64x2(vsp0246_45, vsp0246_67, (2 << 6) | (0 << 4) | (2 << 2) | 0);
5692                 __m512d vsp26_4567 = _mm512_shuffle_f64x2(vsp0246_45, vsp0246_67, (3 << 6) | (1 << 4) | (3 << 2) | 1);
5693                 __m512d vsp15_4567 = _mm512_shuffle_f64x2(vsp1357_45, vsp1357_67, (2 << 6) | (0 << 4) | (2 << 2) | 0);
5694                 __m512d vsp37_4567 = _mm512_shuffle_f64x2(vsp1357_45, vsp1357_67, (3 << 6) | (1 << 4) | (3 << 2) | 1);
5695
5696                 __m512d vsps[8];
5697                 vsps[0] = _mm512_shuffle_f64x2(vsp04_0123, vsp04_4567, (2 << 6) | (0 << 4) | (2 << 2) | 0);
5698                 vsps[4] = _mm512_shuffle_f64x2(vsp04_0123, vsp04_4567, (3 << 6) | (1 << 4) | (3 << 2) | 1);
5699                 vsps[1] = _mm512_shuffle_f64x2(vsp15_0123, vsp15_4567, (2 << 6) | (0 << 4) | (2 << 2) | 0);
5700                 vsps[5] = _mm512_shuffle_f64x2(vsp15_0123, vsp15_4567, (3 << 6) | (1 << 4) | (3 << 2) | 1);
5701                 vsps[2] = _mm512_shuffle_f64x2(vsp26_0123, vsp26_4567, (2 << 6) | (0 << 4) | (2 << 2) | 0);
5702                 vsps[6] = _mm512_shuffle_f64x2(vsp26_0123, vsp26_4567, (3 << 6) | (1 << 4) | (3 << 2) | 1);
5703                 vsps[3] = _mm512_shuffle_f64x2(vsp37_0123, vsp37_4567, (2 << 6) | (0 << 4) | (2 << 2) | 0);
5704                 vsps[7] = _mm512_shuffle_f64x2(vsp37_0123, vsp37_4567, (3 << 6) | (1 << 4) | (3 << 2) | 1);
5705
5706                 for (int k = 0; k < 8; k++) {
5707                         __mmask8 kmask = _mm256_cmplt_epi32_mask(_mm256_set1_epi32(j + k), vcounts);
5708
5709                         vdb1 = _mm512_mask3_fmadd_pd(_mm512_sub_pd(vsps[k], vdb0), vdc1, vdb1, kmask);
5710                         vdb0 = _mm512_mask_add_pd(vdb0, kmask, vdb0, vdb1);
5711                         vdb1 = _mm512_mask_mul_pd(vdb1, kmask, vdb1, vdc0);
5712                         vsps[k] = _mm512_sub_pd(vsps[k], vdb0);
5713                 }
5714
5715                 __m512d vsp01_0246 = _mm512_unpacklo_pd(vsps[0], vsps[1]);
5716                 __m512d vsp01_1357 = _mm512_unpackhi_pd(vsps[0], vsps[1]);
5717                 __m512d vsp23_0246 = _mm512_unpacklo_pd(vsps[2], vsps[3]);
5718                 __m512d vsp23_1357 = _mm512_unpackhi_pd(vsps[2], vsps[3]);
5719                 __m512d vsp45_0246 = _mm512_unpacklo_pd(vsps[4], vsps[5]);
5720                 __m512d vsp45_1357 = _mm512_unpackhi_pd(vsps[4], vsps[5]);
5721                 __m512d vsp67_0246 = _mm512_unpacklo_pd(vsps[6], vsps[7]);
5722                 __m512d vsp67_1357 = _mm512_unpackhi_pd(vsps[6], vsps[7]);
5723
5724                 __m512d vsp0123_04 = _mm512_shuffle_f64x2(vsp01_0246, vsp23_0246, (2 << 6) | (0 << 4) | (2 << 2) | 0);
5725                 __m512d vsp0123_26 = _mm512_shuffle_f64x2(vsp01_0246, vsp23_0246, (3 << 6) | (1 << 4) | (3 << 2) | 1);
5726                 __m512d vsp0123_15 = _mm512_shuffle_f64x2(vsp01_1357, vsp23_1357, (2 << 6) | (0 << 4) | (2 << 2) | 0);
5727                 __m512d vsp0123_37 = _mm512_shuffle_f64x2(vsp01_1357, vsp23_1357, (3 << 6) | (1 << 4) | (3 << 2) | 1);
5728                 __m512d vsp4567_04 = _mm512_shuffle_f64x2(vsp45_0246, vsp67_0246, (2 << 6) | (0 << 4) | (2 << 2) | 0);
5729                 __m512d vsp4567_26 = _mm512_shuffle_f64x2(vsp45_0246, vsp67_0246, (3 << 6) | (1 << 4) | (3 << 2) | 1);
5730                 __m512d vsp4567_15 = _mm512_shuffle_f64x2(vsp45_1357, vsp67_1357, (2 << 6) | (0 << 4) | (2 << 2) | 0);
5731                 __m512d vsp4567_37 = _mm512_shuffle_f64x2(vsp45_1357, vsp67_1357, (3 << 6) | (1 << 4) | (3 << 2) | 1);
5732
5733                 __m512d vout[8];
5734                 vout[0] = _mm512_shuffle_f64x2(vsp0123_04, vsp4567_04, (2 << 6) | (0 << 4) | (2 << 2) | 0);
5735                 vout[4] = _mm512_shuffle_f64x2(vsp0123_04, vsp4567_04, (3 << 6) | (1 << 4) | (3 << 2) | 1);
5736                 vout[1] = _mm512_shuffle_f64x2(vsp0123_15, vsp4567_15, (2 << 6) | (0 << 4) | (2 << 2) | 0);
5737                 vout[5] = _mm512_shuffle_f64x2(vsp0123_15, vsp4567_15, (3 << 6) | (1 << 4) | (3 << 2) | 1);
5738                 vout[2] = _mm512_shuffle_f64x2(vsp0123_26, vsp4567_26, (2 << 6) | (0 << 4) | (2 << 2) | 0);
5739                 vout[6] = _mm512_shuffle_f64x2(vsp0123_26, vsp4567_26, (3 << 6) | (1 << 4) | (3 << 2) | 1);
5740                 vout[3] = _mm512_shuffle_f64x2(vsp0123_37, vsp4567_37, (2 << 6) | (0 << 4) | (2 << 2) | 0);
5741                 vout[7] = _mm512_shuffle_f64x2(vsp0123_37, vsp4567_37, (3 << 6) | (1 << 4) | (3 << 2) | 1);
5742
5743                 for (int k = 0; k < batch_size; k++)
5744                         _mm512_mask_storeu_pd(&sps[k][j], generate_mask8_for_count(j, counts[k]), vout[k]);
5745         }
5746
5747         vdb01_0246 = _mm512_unpacklo_pd(vdb0, vdb1);
5748         vdb01_1357 = _mm512_unpackhi_pd(vdb0, vdb1);
5749
5750         _mm_storeu_pd(dbs[0], _mm512_castpd512_pd128(vdb01_0246));
5751
5752         if (1 < batch_size)
5753                 _mm_storeu_pd(dbs[1], _mm512_castpd512_pd128(vdb01_1357));
5754
5755         if (2 < batch_size)
5756                 _mm_storeu_pd(dbs[2], _mm256_extractf128_pd(_mm512_castpd512_pd256(vdb01_0246), 1));
5757
5758         if (3 < batch_size)
5759                 _mm_storeu_pd(dbs[3], _mm256_extractf128_pd(_mm512_castpd512_pd256(vdb01_1357), 1));
5760
5761         if (4 < batch_size)
5762                 _mm_storeu_pd(dbs[4], _mm512_extractf64x2_pd(vdb01_0246, 2));
5763
5764         if (5 < batch_size)
5765                 _mm_storeu_pd(dbs[5], _mm512_extractf64x2_pd(vdb01_1357, 2));
5766
5767         if (6 < batch_size)
5768                 _mm_storeu_pd(dbs[6], _mm512_extractf64x2_pd(vdb01_0246, 3));
5769
5770         if (7 < batch_size)
5771                 _mm_storeu_pd(dbs[7], _mm512_extractf64x2_pd(vdb01_1357, 3));
5772 }
5773
5774 #elif (USE_X86_EXT_INTRIN >= 8) && defined(DATA_T_DOUBLE) && defined(FLOAT_T_DOUBLE)
5775
5776 static void sample_filter_HPF12_2_batch(int batch_size, FILTER_T **dcs, FILTER_T **dbs, DATA_T **sps, int32 *counts)
5777 {
5778         for (int i = 0; i < MIX_VOICE_BATCH_SIZE; i += 4) {
5779                 if (i >= batch_size)
5780                         break;
5781
5782                 __m128i vcounts = _mm_set_epi32(
5783                         i + 3 < batch_size ? counts[i + 3] : 0,
5784                         i + 2 < batch_size ? counts[i + 2] : 0,
5785                         i + 1 < batch_size ? counts[i + 1] : 0,
5786                         counts[i]
5787                 );
5788
5789                 __m128d vdb01_0 = _mm_loadu_pd(dbs[i]);
5790                 __m128d vdb01_1 = i + 1 < batch_size ? _mm_loadu_pd(dbs[i + 1]) : _mm_setzero_pd();
5791                 __m128d vdb01_2 = i + 2 < batch_size ? _mm_loadu_pd(dbs[i + 2]) : _mm_setzero_pd();
5792                 __m128d vdb01_3 = i + 3 < batch_size ? _mm_loadu_pd(dbs[i + 3]) : _mm_setzero_pd();
5793
5794                 __m256d vdb01_02 = _mm256_insertf128_pd(_mm256_castpd128_pd256(vdb01_0), vdb01_2, 1);
5795                 __m256d vdb01_13 = _mm256_insertf128_pd(_mm256_castpd128_pd256(vdb01_1), vdb01_3, 1);
5796
5797                 __m256d vdb0 = _mm256_unpacklo_pd(vdb01_02, vdb01_13);
5798                 __m256d vdb1 = _mm256_unpackhi_pd(vdb01_02, vdb01_13);
5799
5800                 __m128d vdc01_0 = _mm_loadu_pd(dcs[i]);
5801                 __m128d vdc01_1 = i + 1 < batch_size ? _mm_loadu_pd(dcs[i + 1]) : _mm_setzero_pd();
5802                 __m128d vdc01_2 = i + 2 < batch_size ? _mm_loadu_pd(dcs[i + 2]) : _mm_setzero_pd();
5803                 __m128d vdc01_3 = i + 3 < batch_size ? _mm_loadu_pd(dcs[i + 3]) : _mm_setzero_pd();
5804
5805                 __m256d vdc01_02 = _mm256_insertf128_pd(_mm256_castpd128_pd256(vdc01_0), vdc01_2, 1);
5806                 __m256d vdc01_13 = _mm256_insertf128_pd(_mm256_castpd128_pd256(vdc01_1), vdc01_3, 1);
5807
5808                 __m256d vdc0 = _mm256_unpacklo_pd(vdc01_02, vdc01_13);
5809                 __m256d vdc1 = _mm256_unpackhi_pd(vdc01_02, vdc01_13);
5810
5811                 __m128i vcounts_halfmax = _mm_max_epi32(vcounts, _mm_shuffle_epi32(vcounts, (3 << 2) | 2));
5812                 int32 count_max = _mm_cvtsi128_si32(_mm_max_epi32(vcounts_halfmax, _mm_shuffle_epi32(vcounts_halfmax, 1)));
5813
5814                 for (int32 j = 0; j < count_max; j += 4) {
5815                         __m256d vsp0123_0 = j < counts[i] ? _mm256_loadu_pd(&sps[i][j]) : _mm256_setzero_pd();
5816                         __m256d vsp0123_1 = i + 1 < batch_size && j < counts[i + 1] ? _mm256_loadu_pd(&sps[i + 1][j]) : _mm256_setzero_pd();
5817                         __m256d vsp0123_2 = i + 2 < batch_size && j < counts[i + 2] ? _mm256_loadu_pd(&sps[i + 2][j]) : _mm256_setzero_pd();
5818                         __m256d vsp0123_3 = i + 3 < batch_size && j < counts[i + 3] ? _mm256_loadu_pd(&sps[i + 3][j]) : _mm256_setzero_pd();
5819
5820                         __m256d vsp01_02 = _mm256_permute2f128_pd(vsp0123_0, vsp0123_2, (2 << 4) | 0);
5821                         __m256d vsp01_13 = _mm256_permute2f128_pd(vsp0123_1, vsp0123_3, (2 << 4) | 0);
5822                         __m256d vsp23_02 = _mm256_permute2f128_pd(vsp0123_0, vsp0123_2, (3 << 4) | 1);
5823                         __m256d vsp23_13 = _mm256_permute2f128_pd(vsp0123_1, vsp0123_3, (3 << 4) | 1);
5824
5825                         __m256d vsps[4];
5826                         vsps[0] = _mm256_unpacklo_pd(vsp01_02, vsp01_13);
5827                         vsps[1] = _mm256_unpackhi_pd(vsp01_02, vsp01_13);
5828                         vsps[2] = _mm256_unpacklo_pd(vsp23_02, vsp23_13);
5829                         vsps[3] = _mm256_unpackhi_pd(vsp23_02, vsp23_13);
5830
5831                         for (int k = 0; k < 4; k++) {
5832                                 __m256d vmask = _mm256_castsi256_pd(_mm256_cvtepi32_epi64(_mm_cmplt_epi32(_mm_set1_epi32(j + k), vcounts)));
5833
5834                                 vdb1 = _mm256_blendv_pd(vdb1, MM256_FMA_PD(_mm256_sub_pd(vsps[k], vdb0), vdc1, vdb1), vmask);
5835                                 vdb0 = _mm256_blendv_pd(vdb0, _mm256_add_pd(vdb0, vdb1), vmask);
5836                                 vdb1 = _mm256_blendv_pd(vdb1, _mm256_mul_pd(vdb1, vdc0), vmask);
5837                                 vsps[k] = _mm256_sub_pd(vsps[k], vdb0);
5838                         }
5839
5840                         vsp01_02 = _mm256_unpacklo_pd(vsps[0], vsps[1]);
5841                         vsp01_13 = _mm256_unpackhi_pd(vsps[0], vsps[1]);
5842                         vsp23_02 = _mm256_unpacklo_pd(vsps[2], vsps[3]);
5843                         vsp23_13 = _mm256_unpackhi_pd(vsps[2], vsps[3]);
5844
5845                         vsp0123_0 = _mm256_permute2f128_pd(vsp01_02, vsp23_02, (2 << 4) | 0);
5846                         vsp0123_1 = _mm256_permute2f128_pd(vsp01_13, vsp23_13, (2 << 4) | 0);
5847                         vsp0123_2 = _mm256_permute2f128_pd(vsp01_02, vsp23_02, (3 << 4) | 1);
5848                         vsp0123_3 = _mm256_permute2f128_pd(vsp01_13, vsp23_13, (3 << 4) | 1);
5849
5850                         if (j < counts[i])
5851                                 _mm256_storeu_pd(&sps[i][j], vsp0123_0);
5852
5853                         if (i + 1 < batch_size && j < counts[i + 1])
5854                                 _mm256_storeu_pd(&sps[i + 1][j], vsp0123_1);
5855
5856                         if (i + 2 < batch_size && j < counts[i + 2])
5857                                 _mm256_storeu_pd(&sps[i + 2][j], vsp0123_2);
5858
5859                         if (i + 3 < batch_size && j < counts[i + 3])
5860                                 _mm256_storeu_pd(&sps[i + 3][j], vsp0123_3);
5861                 }
5862
5863                 vdb01_02 = _mm256_unpacklo_pd(vdb0, vdb1);
5864                 vdb01_13 = _mm256_unpackhi_pd(vdb0, vdb1);
5865
5866                 _mm_storeu_pd(dbs[i], _mm256_castpd256_pd128(vdb01_02));
5867
5868                 if (i + 1 < batch_size)
5869                         _mm_storeu_pd(dbs[i + 1], _mm256_castpd256_pd128(vdb01_13));
5870
5871                 if (i + 2 < batch_size)
5872                         _mm_storeu_pd(dbs[i + 2], _mm256_extractf128_pd(vdb01_02, 1));
5873
5874                 if (i + 3 < batch_size)
5875                         _mm_storeu_pd(dbs[i + 3], _mm256_extractf128_pd(vdb01_13, 1));
5876         }
5877 }
5878
5879 #elif (USE_X86_EXT_INTRIN >= 3) && defined(DATA_T_DOUBLE) && defined(FLOAT_T_DOUBLE)
5880
5881 static void sample_filter_HPF12_2_batch(int batch_size, FILTER_T **dcs, FILTER_T **dbs, DATA_T **sps, int32 *counts)
5882 {
5883         for (int i = 0; i < MIX_VOICE_BATCH_SIZE; i += 2) {
5884                 if (i >= batch_size)
5885                         break;
5886
5887                 __m128i vcounts = _mm_set_epi32(
5888                         0,
5889                         0,
5890                         i + 1 < batch_size ? counts[i + 1] : 0,
5891                         counts[i]
5892                 );
5893
5894                 __m128d vdb01_0 = _mm_loadu_pd(dbs[i]);
5895                 __m128d vdb01_1 = i + 1 < batch_size ? _mm_loadu_pd(dbs[i + 1]) : _mm_setzero_pd();
5896
5897                 __m128d vdb0 = _mm_unpacklo_pd(vdb01_0, vdb01_1);
5898                 __m128d vdb1 = _mm_unpackhi_pd(vdb01_0, vdb01_1);
5899
5900                 __m128d vdc01_0 = _mm_loadu_pd(dcs[i]);
5901                 __m128d vdc01_1 = i + 1 < batch_size ? _mm_loadu_pd(dcs[i + 1]) : _mm_setzero_pd();
5902
5903                 __m128d vdc0 = _mm_unpacklo_pd(vdc01_0, vdc01_1);
5904                 __m128d vdc1 = _mm_unpackhi_pd(vdc01_0, vdc01_1);
5905
5906                 int32 count_max = _mm_cvtsi128_si32(_mm_max_epi32(vcounts, _mm_shuffle_epi32(vcounts, 1)));
5907
5908                 for (int32 j = 0; j < count_max; j += 2) {
5909                         __m128d vsp01_0 = j < counts[i] ? _mm_loadu_pd(&sps[i][j]) : _mm_setzero_pd();
5910                         __m128d vsp01_1 = i + 1 < batch_size && j < counts[i + 1] ? _mm_loadu_pd(&sps[i + 1][j]) : _mm_setzero_pd();
5911
5912                         __m128d vsps[2];
5913                         vsps[0] = _mm_unpacklo_pd(vsp01_0, vsp01_1);
5914                         vsps[1] = _mm_unpackhi_pd(vsp01_0, vsp01_1);
5915
5916                         for (int k = 0; k < 2; k++) {
5917                                 __m128d vmask = _mm_castsi128_pd(_mm_cvtepi32_epi64(_mm_cmplt_epi32(_mm_set1_epi32(j + k), vcounts)));
5918
5919 #if USE_X86_EXT_INTRIN >= 6
5920                                 vdb1 = _mm_blendv_pd(vdb1, MM_FMA_PD(_mm_sub_pd(vsps[k], vdb0), vdc1, vdb1), vmask);
5921                                 vdb0 = _mm_blendv_pd(vdb0, _mm_add_pd(vdb0, vdb1), vmask);
5922                                 vdb1 = _mm_blendv_pd(vdb1, _mm_mul_pd(vdb1, vdc0), vmask);
5923 #else
5924                                 vdb1 = _mm_or_pd(_mm_andnot_pd(vmask, vdb1), _mm_and_pd(vmask, MM_FMA_PD(_mm_sub_pd(vsps[k], vdb0), vdc1, vdb1)));
5925                                 vdb0 = _mm_or_pd(_mm_andnot_pd(vmask, vdb0), _mm_and_pd(vmask, _mm_add_pd(vdb0, vdb1)));
5926                                 vdb1 = _mm_or_pd(_mm_andnot_pd(vmask, vdb1), _mm_and_pd(vmask, _mm_mul_pd(vdb1, vdc0)));
5927 #endif
5928                                 vsps[k] = _mm_sub_pd(vsps[k], vdb0);
5929                         }
5930
5931                         vsp01_0 = _mm_unpacklo_pd(vsps[0], vsps[1]);
5932                         vsp01_1 = _mm_unpackhi_pd(vsps[0], vsps[1]);
5933
5934                         if (j < counts[i])
5935                                 _mm_storeu_pd(&sps[i][j], vsp01_0);
5936
5937                         if (i + 1 < batch_size && j < counts[i + 1])
5938                                 _mm_storeu_pd(&sps[i + 1][j], vsp01_1);
5939                 }
5940
5941                 vdb01_0 = _mm_unpacklo_pd(vdb0, vdb1);
5942                 vdb01_1 = _mm_unpackhi_pd(vdb0, vdb1);
5943
5944                 _mm_storeu_pd(dbs[i], vdb01_0);
5945
5946                 if (i + 1 < batch_size)
5947                         _mm_storeu_pd(dbs[i + 1], vdb01_1);
5948         }
5949 }
5950
5951 #endif
5952
5953 void buffer_filter_batch(int batch_size, FilterCoefficients **fcs, DATA_T **sps, int32 *counts)
5954 {
5955 #ifdef _DEBUG
5956         for (int i = 0; i < batch_size; i++) {
5957                 if (!fcs[i]) {
5958                         ctl->cmsg(CMSG_ERROR, VERB_NORMAL, "buffer_filter_batch(): error: filter not initialized");
5959                         return;
5960                 }
5961         }
5962
5963         for (int i = 1; i < batch_size; i++) {
5964                 if (fcs[0]->type != fcs[i]->type) {
5965                         ctl->cmsg(CMSG_ERROR, VERB_NORMAL, "buffer_filter_batch(): error: filter type mismatch");
5966                         return;
5967                 }
5968         }
5969 #endif
5970         if (fcs[0]->type == FILTER_NONE)
5971                 return;
5972
5973         FILTER_T *dcs[MIX_VOICE_BATCH_SIZE];
5974         FILTER_T *dbs[MIX_VOICE_BATCH_SIZE];
5975
5976         for (int i = 0; i < batch_size; i++) {
5977                 dcs[i] = &fcs[i]->dc;
5978                 dbs[i] = &fcs[i]->db[FILTER_FB_L];
5979         }
5980
5981         switch (fcs[0]->type) {
5982         case FILTER_LPF_BW:
5983                 recalc_filter_LPF_BW_batch(batch_size, fcs);
5984                 sample_filter_LPF_BW_batch(batch_size, dcs, dbs, sps, counts);
5985                 break;
5986
5987         case FILTER_LPF12_2:
5988                 recalc_filter_LPF12_2_batch(batch_size, fcs);
5989                 sample_filter_LPF12_2_batch(batch_size, dcs, dbs, sps, counts);
5990                 break;
5991
5992         case FILTER_HPF12_2:
5993                 recalc_filter_LPF12_2_batch(batch_size, fcs);
5994                 sample_filter_HPF12_2_batch(batch_size, dcs, dbs, sps, counts);
5995                 break;
5996
5997         default:
5998                 ctl->cmsg(CMSG_ERROR, VERB_NORMAL, "buffer_filter_batch(): error: unsupported filter type");
5999                 break;
6000         }
6001 }
6002
6003 void voice_filter_batch(int batch_size, int *vs, DATA_T **sps, int32 *counts)
6004 {
6005         if (batch_size <= 0)
6006                 return;
6007
6008         FilterCoefficients *fcs[MIX_VOICE_BATCH_SIZE];
6009
6010         for (int i = 0; i < MIX_VOICE_BATCH_SIZE; i++)
6011                 fcs[i] = (i < batch_size ? &voice[vs[i]].fc : NULL);
6012
6013         buffer_filter_batch(batch_size, fcs, sps, counts);
6014
6015         for (int i = 0; i < MIX_VOICE_BATCH_SIZE; i++)
6016                 fcs[i] = (i < batch_size ? &voice[vs[i]].fc2 : NULL);
6017
6018         buffer_filter_batch(batch_size, fcs, sps, counts);
6019 }
6020
6021
6022 #endif // MIX_VOICE_BATCH
6023
6024
6025 /*************** antialiasing ********************/
6026
6027
6028
6029 /*  bessel  function   */
6030 static FLOAT_T ino(FLOAT_T x)
6031 {
6032     FLOAT_T y, de, e, sde;
6033     int i;
6034
6035     y = x / 2;
6036     e = 1.0;
6037     de = 1.0;
6038     i = 1;
6039     do {
6040         de = de * y / (FLOAT_T) i;
6041         sde = de * de;
6042         e += sde;
6043     } while (!( (e * 1.0e-08 - sde > 0) || (i++ > 25) ));
6044     return(e);
6045 }
6046
6047 /* Kaiser Window (symetric) */
6048 static void kaiser(FLOAT_T *w,int n,FLOAT_T beta)
6049 {
6050     FLOAT_T xind, xi;
6051     int i;
6052
6053     xind = (2*n - 1) * (2*n - 1);
6054     for (i =0; i<n ; i++)
6055         {
6056             xi = i + 0.5;
6057             w[i] = ino((FLOAT_T)(beta * sqrt((double)(1. - 4 * xi * xi / xind))))
6058                 / ino((FLOAT_T)beta);
6059         }
6060 }
6061
6062 /*
6063  * fir coef in g, cuttoff frequency in fc
6064  */
6065 static void designfir(FLOAT_T *g , FLOAT_T fc, FLOAT_T att)
6066 {
6067         /* attenuation  in  db */
6068     int i;
6069     FLOAT_T xi, omega, beta ;
6070     FLOAT_T w[LPF_FIR_ORDER2];
6071
6072     for (i =0; i < LPF_FIR_ORDER2 ;i++)
6073         {
6074             xi = (FLOAT_T) i + 0.5;
6075             omega = M_PI * xi;
6076             g[i] = sin( (double) omega * fc) / omega;
6077         }
6078
6079     beta = (FLOAT_T) exp(log((double)0.58417 * (att - 20.96)) * 0.4) + 0.07886
6080         * (att - 20.96);
6081     kaiser( w, LPF_FIR_ORDER2, beta);
6082
6083     /* Matrix product */
6084     for (i =0; i < LPF_FIR_ORDER2 ; i++)
6085         g[i] = g[i] * w[i];
6086 }
6087
6088 /*
6089  * FIR filtering -> apply the filter given by coef[] to the data buffer
6090  * Note that we simulate leading and trailing 0 at the border of the
6091  * data buffer
6092  */
6093 static void filter(int16 *result,int16 *data, int32 length,FLOAT_T coef[])
6094 {
6095     int32 sample,i,sample_window;
6096     int16 peak = 0;
6097     FLOAT_T sum;
6098
6099     /* Simulate leading 0 at the begining of the buffer */
6100      for (sample = 0; sample < LPF_FIR_ORDER2 ; sample++ )
6101         {
6102             sum = 0.0;
6103             sample_window= sample - LPF_FIR_ORDER2;
6104
6105             for (i = 0; i < LPF_FIR_ORDER ;i++)
6106                 sum += coef[i] *
6107                     ((sample_window<0)? 0.0 : data[sample_window++]) ;
6108
6109             /* Saturation ??? */
6110             if (sum> 32767.) { sum=32767.; peak++; }
6111             if (sum< -32768.) { sum=-32768; peak++; }
6112             result[sample] = (int16) sum;
6113         }
6114
6115     /* The core of the buffer  */
6116     for (sample = LPF_FIR_ORDER2; sample < length - LPF_FIR_ORDER + LPF_FIR_ORDER2 ; sample++ )
6117         {
6118             sum = 0.0;
6119             sample_window= sample - LPF_FIR_ORDER2;
6120
6121             for (i = 0; i < LPF_FIR_ORDER ;i++)
6122                 sum += data[sample_window++] * coef[i];
6123
6124             /* Saturation ??? */
6125             if (sum> 32767.) { sum=32767.; peak++; }
6126             if (sum< -32768.) { sum=-32768; peak++; }
6127             result[sample] = (int16) sum;
6128         }
6129
6130     /* Simulate 0 at the end of the buffer */
6131     for (sample = length - LPF_FIR_ORDER + LPF_FIR_ORDER2; sample < length ; sample++ )
6132         {
6133             sum = 0.0;
6134             sample_window= sample - LPF_FIR_ORDER2;
6135
6136             for (i = 0; i < LPF_FIR_ORDER ;i++)
6137                 sum += coef[i] *
6138                     ((sample_window>=length)? 0.0 : data[sample_window++]) ;
6139
6140             /* Saturation ??? */
6141             if (sum> 32767.) { sum=32767.; peak++; }
6142             if (sum< -32768.) { sum=-32768; peak++; }
6143             result[sample] = (int16) sum;
6144         }
6145
6146     if (peak)
6147         ctl->cmsg(CMSG_INFO, VERB_NOISY, "Saturation %2.3f %%.", 100.0*peak/ (FLOAT_T) length);
6148 }
6149
6150 static void filter_int8(int8 *result,int8 *data, int32 length,FLOAT_T coef[])
6151 {
6152     int32 sample,i,sample_window;
6153     int16 peak = 0;
6154     FLOAT_T sum;
6155
6156     /* Simulate leading 0 at the begining of the buffer */
6157      for (sample = 0; sample < LPF_FIR_ORDER2 ; sample++ )
6158         {
6159             sum = 0.0;
6160             sample_window= sample - LPF_FIR_ORDER2;
6161
6162             for (i = 0; i < LPF_FIR_ORDER ;i++)
6163                 sum += coef[i] *
6164                     ((sample_window<0)? 0.0 : data[sample_window++]) ;
6165
6166             /* Saturation ??? */
6167             if (sum> 127.) { sum=127.; peak++; }
6168             if (sum< -128.) { sum=-128; peak++; }
6169             result[sample] = (int8) sum;
6170         }
6171
6172     /* The core of the buffer  */
6173     for (sample = LPF_FIR_ORDER2; sample < length - LPF_FIR_ORDER + LPF_FIR_ORDER2 ; sample++ )
6174         {
6175             sum = 0.0;
6176             sample_window= sample - LPF_FIR_ORDER2;
6177
6178             for (i = 0; i < LPF_FIR_ORDER ;i++)
6179                 sum += data[sample_window++] * coef[i];
6180
6181             /* Saturation ??? */
6182             if (sum> 127.) { sum=127.; peak++; }
6183             if (sum< -128.) { sum=-128; peak++; }
6184             result[sample] = (int8) sum;
6185         }
6186
6187     /* Simulate 0 at the end of the buffer */
6188     for (sample = length - LPF_FIR_ORDER + LPF_FIR_ORDER2; sample < length ; sample++ )
6189         {
6190             sum = 0.0;
6191             sample_window= sample - LPF_FIR_ORDER2;
6192
6193             for (i = 0; i < LPF_FIR_ORDER ;i++)
6194                 sum += coef[i] *
6195                     ((sample_window>=length)? 0.0 : data[sample_window++]) ;
6196
6197             /* Saturation ??? */
6198             if (sum> 127.) { sum=127.; peak++; }
6199             if (sum< -128.) { sum=-128; peak++; }
6200             result[sample] = (int8) sum;
6201         }
6202
6203     if (peak)
6204         ctl->cmsg(CMSG_INFO, VERB_NOISY, "Saturation %2.3f %%.", 100.0*peak/ (FLOAT_T) length);
6205 }
6206
6207 static void filter_int32(int32 *result,int32 *data, int32 length,FLOAT_T coef[])
6208 {
6209     int32 sample,i,sample_window;
6210     int16 peak = 0;
6211     FLOAT_T sum;
6212
6213     /* Simulate leading 0 at the begining of the buffer */
6214      for (sample = 0; sample < LPF_FIR_ORDER2 ; sample++ )
6215         {
6216             sum = 0.0;
6217             sample_window= sample - LPF_FIR_ORDER2;
6218
6219             for (i = 0; i < LPF_FIR_ORDER ;i++)
6220                 sum += coef[i] *
6221                     ((sample_window<0)? 0.0 : data[sample_window++]) ;
6222
6223             /* Saturation ??? */
6224             if (sum> 2147483647.) { sum=2147483647.; peak++; }
6225             if (sum< -2147483648.) { sum=-2147483648.; peak++; }
6226             result[sample] = (int32) sum;
6227         }
6228
6229     /* The core of the buffer  */
6230     for (sample = LPF_FIR_ORDER2; sample < length - LPF_FIR_ORDER + LPF_FIR_ORDER2 ; sample++ )
6231         {
6232             sum = 0.0;
6233             sample_window= sample - LPF_FIR_ORDER2;
6234
6235             for (i = 0; i < LPF_FIR_ORDER ;i++)
6236                 sum += data[sample_window++] * coef[i];
6237
6238             /* Saturation ??? */
6239             if (sum> 2147483647.) { sum=2147483647.; peak++; }
6240             if (sum< -2147483648.) { sum=-2147483648.; peak++; }
6241             result[sample] = (int32) sum;
6242         }
6243
6244     /* Simulate 0 at the end of the buffer */
6245     for (sample = length - LPF_FIR_ORDER + LPF_FIR_ORDER2; sample < length ; sample++ )
6246         {
6247             sum = 0.0;
6248             sample_window= sample - LPF_FIR_ORDER2;
6249
6250             for (i = 0; i < LPF_FIR_ORDER ;i++)
6251                 sum += coef[i] *
6252                     ((sample_window>=length)? 0.0 : data[sample_window++]) ;
6253
6254             /* Saturation ??? */
6255             if (sum> 2147483647.) { sum=2147483647.; peak++; }
6256             if (sum< -2147483648.) { sum=-2147483648.; peak++; }
6257             result[sample] = (int32) sum;
6258         }
6259
6260     if (peak)
6261         ctl->cmsg(CMSG_INFO, VERB_NOISY, "Saturation %2.3f %%.", 100.0*peak/ (FLOAT_T) length);
6262 }
6263
6264 static void filter_float(float *result,float *data, int32 length,FLOAT_T coef[])
6265 {
6266     int32 sample,i,sample_window;
6267     FLOAT_T sum;
6268
6269     /* Simulate leading 0 at the begining of the buffer */
6270      for (sample = 0; sample < LPF_FIR_ORDER2 ; sample++ )
6271         {
6272             sum = 0.0;
6273             sample_window= sample - LPF_FIR_ORDER2;
6274
6275             for (i = 0; i < LPF_FIR_ORDER ;i++)
6276                         sum += coef[i] * ((sample_window<0)? 0.0 : data[sample_window++]) ;
6277                 result[sample] = (float)sum;
6278         }
6279
6280     /* The core of the buffer  */
6281     for (sample = LPF_FIR_ORDER2; sample < length - LPF_FIR_ORDER + LPF_FIR_ORDER2 ; sample++ )
6282         {
6283             sum = 0.0;
6284             sample_window= sample - LPF_FIR_ORDER2;
6285
6286             for (i = 0; i < LPF_FIR_ORDER ;i++)
6287                         sum += data[sample_window++] * coef[i];
6288                 result[sample] = (float)sum;    
6289         }
6290
6291     /* Simulate 0 at the end of the buffer */
6292     for (sample = length - LPF_FIR_ORDER + LPF_FIR_ORDER2; sample < length ; sample++ )
6293         {
6294             sum = 0.0;
6295             sample_window= sample - LPF_FIR_ORDER2;
6296
6297             for (i = 0; i < LPF_FIR_ORDER ;i++)
6298                         sum += coef[i] * ((sample_window>=length)? 0.0 : data[sample_window++]) ;
6299                 result[sample] = (float)sum;
6300         }
6301 }
6302
6303 static void filter_double(double *result,double *data, int32 length,FLOAT_T coef[])
6304 {
6305     int32 sample,i,sample_window;
6306     FLOAT_T sum;
6307
6308     /* Simulate leading 0 at the begining of the buffer */
6309      for (sample = 0; sample < LPF_FIR_ORDER2 ; sample++ )
6310         {
6311             sum = 0.0;
6312             sample_window= sample - LPF_FIR_ORDER2;
6313
6314             for (i = 0; i < LPF_FIR_ORDER ;i++)
6315                         sum += coef[i] * ((sample_window<0)? 0.0 : data[sample_window++]) ;
6316                 result[sample] = (double)sum;
6317         }
6318
6319     /* The core of the buffer  */
6320     for (sample = LPF_FIR_ORDER2; sample < length - LPF_FIR_ORDER + LPF_FIR_ORDER2 ; sample++ )
6321         {
6322             sum = 0.0;
6323             sample_window= sample - LPF_FIR_ORDER2;
6324
6325             for (i = 0; i < LPF_FIR_ORDER ;i++)
6326                         sum += data[sample_window++] * coef[i];
6327                 result[sample] = (double)sum;   
6328         }
6329
6330     /* Simulate 0 at the end of the buffer */
6331     for (sample = length - LPF_FIR_ORDER + LPF_FIR_ORDER2; sample < length ; sample++ )
6332         {
6333             sum = 0.0;
6334             sample_window= sample - LPF_FIR_ORDER2;
6335
6336             for (i = 0; i < LPF_FIR_ORDER ;i++)
6337                         sum += coef[i] * ((sample_window>=length)? 0.0 : data[sample_window++]) ;
6338                 result[sample] = (double)sum;
6339         }
6340 }
6341 /***********************************************************************/
6342 /* Prevent aliasing by filtering any freq above the output_rate        */
6343 /*                                                                     */
6344 /* I don't worry about looping point -> they will remain soft if they  */
6345 /* were already                                                        */
6346 /***********************************************************************/
6347 void antialiasing(int16 *data, int32 data_length, int32 sample_rate, int32 output_rate)
6348 {
6349     int i;
6350         int32 bytes;
6351         int16 *temp;
6352     FLOAT_T fir_symetric[LPF_FIR_ORDER];
6353     FLOAT_T fir_coef[LPF_FIR_ORDER2];
6354     FLOAT_T freq_cut;  /* cutoff frequency [0..1.0] FREQ_CUT/SAMP_FREQ*/
6355
6356
6357     ctl->cmsg(CMSG_INFO, VERB_NOISY, "Antialiasing: Fsample=%iKHz",
6358               sample_rate);
6359
6360     /* No oversampling  */
6361     if (output_rate>=sample_rate)
6362         return;
6363
6364     freq_cut= (FLOAT_T)output_rate / (FLOAT_T)sample_rate;
6365     ctl->cmsg(CMSG_INFO, VERB_NOISY, "Antialiasing: cutoff=%f%%",
6366               freq_cut*100.);
6367
6368     designfir(fir_coef,freq_cut, LPF_FIR_ANTIALIASING_ATT);
6369
6370     /* Make the filter symetric */
6371     for (i = 0 ; i<LPF_FIR_ORDER2 ;i++)
6372         fir_symetric[LPF_FIR_ORDER-1 - i] = fir_symetric[i] = fir_coef[LPF_FIR_ORDER2-1 - i];
6373
6374     /* We apply the filter we have designed on a copy of the patch */
6375         if(!data)
6376                 return;
6377
6378         bytes = sizeof(int16) * data_length;
6379         temp = (int16 *)safe_malloc(bytes);
6380         memcpy(temp, data, bytes);
6381         filter(data, temp, data_length, fir_symetric);
6382         free(temp);
6383 }
6384
6385 void antialiasing_int8(int8 *data, int32 data_length, int32 sample_rate, int32 output_rate)
6386 {
6387     int i;
6388         int32 bytes;
6389         int8 *temp;
6390     FLOAT_T fir_symetric[LPF_FIR_ORDER];
6391     FLOAT_T fir_coef[LPF_FIR_ORDER2];
6392     FLOAT_T freq_cut;  /* cutoff frequency [0..1.0] FREQ_CUT/SAMP_FREQ*/
6393
6394
6395     ctl->cmsg(CMSG_INFO, VERB_NOISY, "Antialiasing: Fsample=%iKHz",
6396               sample_rate);
6397
6398     /* No oversampling  */
6399     if (output_rate>=sample_rate)
6400         return;
6401
6402     freq_cut= (FLOAT_T)output_rate / (FLOAT_T)sample_rate;
6403     ctl->cmsg(CMSG_INFO, VERB_NOISY, "Antialiasing: cutoff=%f%%",
6404               freq_cut*100.);
6405
6406     designfir(fir_coef,freq_cut, LPF_FIR_ANTIALIASING_ATT);
6407
6408     /* Make the filter symetric */
6409     for (i = 0 ; i<LPF_FIR_ORDER2 ;i++)
6410         fir_symetric[LPF_FIR_ORDER-1 - i] = fir_symetric[i] = fir_coef[LPF_FIR_ORDER2-1 - i];
6411
6412     /* We apply the filter we have designed on a copy of the patch */
6413         if(!data)
6414                 return;
6415
6416         bytes = sizeof(int8) * data_length;
6417         temp = (int8 *)safe_malloc(bytes);
6418         memcpy(temp, data, bytes);
6419         filter_int8(data, temp, data_length, fir_symetric);
6420         free(temp);
6421 }
6422
6423 void antialiasing_int32(int32 *data, int32 data_length, int32 sample_rate, int32 output_rate)
6424 {
6425     int i;
6426         int32 bytes;
6427         int32 *temp;
6428     FLOAT_T fir_symetric[LPF_FIR_ORDER];
6429     FLOAT_T fir_coef[LPF_FIR_ORDER2];
6430     FLOAT_T freq_cut;  /* cutoff frequency [0..1.0] FREQ_CUT/SAMP_FREQ*/
6431
6432
6433     ctl->cmsg(CMSG_INFO, VERB_NOISY, "Antialiasing: Fsample=%iKHz",
6434               sample_rate);
6435
6436     /* No oversampling  */
6437     if (output_rate>=sample_rate)
6438         return;
6439
6440     freq_cut= (FLOAT_T)output_rate / (FLOAT_T)sample_rate;
6441     ctl->cmsg(CMSG_INFO, VERB_NOISY, "Antialiasing: cutoff=%f%%",
6442               freq_cut*100.);
6443
6444     designfir(fir_coef,freq_cut, LPF_FIR_ANTIALIASING_ATT);
6445
6446     /* Make the filter symetric */
6447     for (i = 0 ; i<LPF_FIR_ORDER2 ;i++)
6448         fir_symetric[LPF_FIR_ORDER-1 - i] = fir_symetric[i] = fir_coef[LPF_FIR_ORDER2-1 - i];
6449
6450     /* We apply the filter we have designed on a copy of the patch */
6451         if(!data)
6452                 return;
6453
6454         bytes = sizeof(int32) * data_length;
6455         temp = (int32 *)safe_malloc(bytes);
6456         memcpy(temp, data, bytes);
6457         filter_int32(data, temp, data_length, fir_symetric);
6458         free(temp);
6459 }
6460
6461 void antialiasing_float(float *data, int32 data_length, int32 sample_rate, int32 output_rate)
6462 {
6463     int i;
6464         int32 bytes;
6465         float *temp;
6466     FLOAT_T fir_symetric[LPF_FIR_ORDER];
6467     FLOAT_T fir_coef[LPF_FIR_ORDER2];
6468     FLOAT_T freq_cut;  /* cutoff frequency [0..1.0] FREQ_CUT/SAMP_FREQ*/
6469
6470
6471     ctl->cmsg(CMSG_INFO, VERB_NOISY, "Antialiasing: Fsample=%iKHz",
6472               sample_rate);
6473
6474     /* No oversampling  */
6475     if (output_rate>=sample_rate)
6476         return;
6477
6478     freq_cut= (FLOAT_T)output_rate / (FLOAT_T)sample_rate;
6479     ctl->cmsg(CMSG_INFO, VERB_NOISY, "Antialiasing: cutoff=%f%%",
6480               freq_cut*100.);
6481
6482     designfir(fir_coef,freq_cut, LPF_FIR_ANTIALIASING_ATT);
6483
6484     /* Make the filter symetric */
6485     for (i = 0 ; i<LPF_FIR_ORDER2 ;i++)
6486         fir_symetric[LPF_FIR_ORDER-1 - i] = fir_symetric[i] = fir_coef[LPF_FIR_ORDER2-1 - i];
6487
6488     /* We apply the filter we have designed on a copy of the patch */
6489         if(!data)
6490                 return;
6491
6492         bytes = sizeof(float) * data_length;
6493         temp = (float *)safe_malloc(bytes);
6494         memcpy(temp, data, bytes);
6495         filter_float(data, temp, data_length, fir_symetric);
6496         free(temp);
6497
6498 }
6499
6500 void antialiasing_double(double *data, int32 data_length, int32 sample_rate, int32 output_rate)
6501 {
6502     int i;
6503         int32 bytes;
6504         double *temp;
6505     FLOAT_T fir_symetric[LPF_FIR_ORDER];
6506     FLOAT_T fir_coef[LPF_FIR_ORDER2];
6507     FLOAT_T freq_cut;  /* cutoff frequency [0..1.0] FREQ_CUT/SAMP_FREQ*/
6508
6509     ctl->cmsg(CMSG_INFO, VERB_NOISY, "Antialiasing: Fsample=%iKHz",
6510               sample_rate);
6511
6512     /* No oversampling  */
6513     if (output_rate>=sample_rate)
6514         return;
6515
6516     freq_cut= (FLOAT_T)output_rate / (FLOAT_T)sample_rate;
6517     ctl->cmsg(CMSG_INFO, VERB_NOISY, "Antialiasing: cutoff=%f%%",
6518               freq_cut*100.);
6519
6520     designfir(fir_coef,freq_cut, LPF_FIR_ANTIALIASING_ATT);
6521
6522     /* Make the filter symetric */
6523     for (i = 0 ; i<LPF_FIR_ORDER2 ;i++)
6524         fir_symetric[LPF_FIR_ORDER-1 - i] = fir_symetric[i] = fir_coef[LPF_FIR_ORDER2-1 - i];
6525
6526     /* We apply the filter we have designed on a copy of the patch */
6527         if(!data)
6528                 return;
6529
6530         bytes = sizeof(double) * data_length;
6531         temp = (double *)safe_malloc(bytes);
6532         memcpy(temp, data, bytes);
6533         filter_double(data, temp, data_length, fir_symetric);
6534         free(temp);
6535
6536 }
6537
6538
6539 /*************** fir_eq ********************/
6540
6541 void init_fir_eq(FIR_EQ *fc)
6542 {
6543         int32 i, j, k, l, count1 = 0, count2 = 0, flg = 0, size_2;
6544         double amp[FIR_EQ_BAND_MAX*16], bounds[FIR_EQ_BAND_MAX*16][2]; // max_band*16 , [0]:f [1]:g
6545         double fL, gL, fR, gR, log_fL, log_fR, ft, gt, kT, div_kT2, hk, gain, f0, f1, w0, w1;
6546         const double div_2pi = 1.0 / (2 * M_PI);
6547         
6548         if(fc->init < 0)
6549                 memset(fc, 0, sizeof(FIR_EQ));
6550
6551 #ifdef TEST_FIR_EQ
6552         fc->st = 1; // stereo
6553         fc->band = 6;           
6554         fc->bit = 4;    
6555         fc->freq[0] = 20;
6556         fc->freq[1] = 400;
6557         fc->freq[2] = 800;
6558         fc->freq[3] = 6000;
6559         fc->freq[4] = 12000;
6560         fc->freq[5] = 20000;
6561         fc->gain[0] = 12.1;
6562         fc->gain[1] = 12.1;
6563         fc->gain[2] = 0.0;
6564         fc->gain[3] = 0.0;
6565         fc->gain[4] = 12.1;
6566         fc->gain[5] = 12.1;
6567 #else
6568         { // calc window size
6569                 int32 t = play_mode->rate / 100; // sr/ 100Hz 
6570                 int32 c = 4;
6571                 while((1 << c) < t)
6572                         c++;
6573                 fc->bit = c;
6574         }
6575 #endif
6576         if(fc->band < 4)
6577                 fc->band = 4;
6578         else if(fc->band > FIR_EQ_BAND_MAX)
6579                 fc->band = FIR_EQ_BAND_MAX;
6580         if(fc->band != fc->band_p)
6581                 fc->init = 0;
6582         fc->band_p = fc->band;
6583         if(fc->bit < 4)
6584                 fc->bit = 4;
6585         else if(fc->bit > 12)
6586                 fc->bit = 12;   
6587         if(fc->bit != fc->bit_p)
6588                 fc->init = 0;
6589         fc->bit_p = fc->bit;
6590         fc->size = 1 << fc->bit;        
6591     for(i = 0; i < FIR_EQ_SIZE_MAX; ++i){
6592         fc->dc[i] = 0;
6593     }           
6594     for(i = 0; i < fc->band; ++i){
6595                 if(fc->gain[0] != 0)
6596                         flg++;
6597     }
6598     if(!flg){
6599         fc->dc[0] = 1.0;
6600     }else{      
6601         size_2 = fc->size / 2;
6602                 for(i = 0; i < fc->band; ++i){
6603                         amp[i] = pow(10, fc->gain[i] * DIV_20);
6604                 }
6605         bounds[0][1] = amp[0];
6606                 for(i = 0; i < (fc->band - 2); i++){                    
6607             fL = fc->freq[i];
6608             gL = amp[i];
6609             fR = fc->freq[i + 1];
6610             gR = amp[i + 1];
6611             log_fL = log(fL);
6612             log_fR = log(fR);
6613             for(j = 0; j < 16; ++j){
6614                 ft = ((double)j + 0.5) * DIV_16;
6615                 bounds[count1][0] = exp(log_fL * (1 - ft) + log_fR * ft);
6616                 gt = (double)j * DIV_16;
6617                 bounds[count1][1] = gL * (1.0 - gt) + gR * gt;
6618                         count1++;
6619             }
6620         }
6621         for(k = 0; k < size_2; ++k){
6622                         kT = k * div_playmode_rate;
6623                         div_kT2 = 2.0 / kT;
6624                         hk = 0;
6625                         count2 = 0;
6626                         while(count2 != count1){
6627                                 gain = bounds[count2][1];
6628                                 f0 = bounds[count2][0];
6629                                 ++count2;
6630                                 f1 = count2 == count1 ? play_mode->rate * DIV_2 : bounds[count2][0];
6631                                 w0 = f0 * 2 * M_PI;
6632                                 w1 = f1 * 2 * M_PI;
6633                                 if(k == 0){
6634                                         hk += gain * (w1 - w0 + (-w0) - (-w1));
6635                                 }else{
6636                                         hk += gain * (sin(w1 * kT) - sin(w0 * kT)) * div_kT2; //  * 2 / kT
6637                                 }
6638                         }
6639                         hk *= div_playmode_rate * div_2pi; // / (2 * M_PI);
6640                         fc->dc[size_2 - 1 - k] = hk;
6641                         fc->dc[size_2 - 1 + k] = hk;
6642                 }
6643         }
6644         if(!fc->init){
6645                 memset(fc->buff, 0, sizeof(fc->buff));
6646                 fc->count = 0;
6647         }
6648         fc->init = 1;
6649 }
6650
6651 void apply_fir_eq(FIR_EQ *fc, DATA_T *buf, int32 count)
6652 {
6653         int32 i, j, offset;
6654         const int32 mask = FIR_EQ_SIZE_MAX - 1;
6655
6656         if(!fc->init)
6657                 return; 
6658 #if (USE_X86_EXT_INTRIN >= 3) && defined(FLOAT_T_DOUBLE) && defined(DATA_T_DOUBLE)
6659         if(fc->st){ // stereo
6660                 __m128d vout[2], tmp[2]; // DATA_T out[2];
6661                 for(i = 0; i < count; i += 2){
6662                         int32 sbuff = fc->count + FIR_EQ_SIZE_MAX;
6663                         fc->buff[0][fc->count] = buf[i];
6664                         fc->buff[0][sbuff] = buf[i]; // for SIMD
6665                         fc->buff[1][fc->count] = buf[i + 1];
6666                         fc->buff[1][sbuff] = buf[i + 1]; // for SIMD
6667                         fc->count = (fc->count + 1) & mask;
6668                         offset = (fc->count - fc->size) & mask;
6669                         vout[0] = _mm_setzero_pd(); // out[0] = 0;
6670                         vout[1] = _mm_setzero_pd(); // out[1] = 0;
6671                         for(j = 0; j < fc->size; j += 2){
6672                                 int32 ofs = offset + j;
6673                                 __m128d vdc = _mm_loadu_pd(&fc->dc[j]);
6674                                 vout[0] = MM_FMA_PD(vdc, _mm_loadu_pd(&fc->buff[0][ofs]), vout[0]); // out[0] += fc->dc[j] * fc->buff[0][ofs];
6675                                 vout[1] = MM_FMA_PD(vdc, _mm_loadu_pd(&fc->buff[1][ofs]), vout[1]); // out[1] += fc->dc[j] * fc->buff[1][ofs];
6676                         }
6677                         // vout[0](L0,L1) vout[1](R0,R1)
6678                         tmp[0] = _mm_unpacklo_pd(vout[0], vout[1]); // (L0,R0)
6679                         tmp[1] = _mm_unpackhi_pd(vout[0], vout[1]); // (L1,R1)
6680                         tmp[0] = _mm_add_pd(tmp[0], tmp[1]); // (L0+L1,R0+R1)
6681                         _mm_store_pd(&buf[i], tmp[0]); // buf[i] = out[0]; buf[i + 1] = out[1];
6682                 }
6683         }else{ // mono
6684                 __m128d vout; //DATA_T out;
6685                 for(i = 0; i < count; i++){
6686                         int32 sbuff = fc->count +  FIR_EQ_SIZE_MAX;
6687                         fc->buff[0][fc->count] = buf[i];
6688                         fc->buff[0][sbuff] = buf[i]; // for SIMD
6689                         fc->count = (fc->count + 1) & mask;
6690                         offset = (fc->count - fc->size) & mask;
6691                         vout = _mm_setzero_pd(); // out = 0;
6692                         for(j = 0; j < fc->size; j += 2){
6693                                 int32 ofs = (offset + j) & mask;
6694                                 __m128d vdc = _mm_loadu_pd(&fc->dc[j]);
6695                                 vout = MM_FMA_PD(vdc, _mm_loadu_pd(&fc->buff[0][ofs]), vout); // out += fc->dc[j] * fc->buff[0][ofs];
6696                         }
6697                         vout= _mm_add_pd(vout, _mm_shuffle_pd(vout, vout, 0x1)); // v0=v0+v1 v1=v1+v0
6698                         _mm_store_sd(&buf[i], vout); // buf[i] = out;
6699                 }
6700         }
6701 #else
6702         if(fc->st){ // stereo
6703                 DATA_T out[2];
6704                 for(i = 0; i < count; i += 2){
6705                         fc->buff[0][fc->count] = buf[i];
6706                         fc->buff[1][fc->count] = buf[i + 1];
6707                         fc->count = (fc->count + 1) & mask;
6708                         offset = fc->count - fc->size;
6709                         //offset &= fc->mask;
6710                         //buf[i] = fc->buff[0][offset];
6711                         //buf[i + 1] = fc->buff[1][offset];
6712                         out[0] = 0; out[1] = 0;
6713                         for(j = 0; j < fc->size; ++j){
6714                                 int32 ofs = (offset + j) & mask;
6715                                 out[0] += fc->dc[j] * fc->buff[0][ofs];
6716                                 out[1] += fc->dc[j] * fc->buff[1][ofs];
6717                         }
6718                         buf[i] = out[0]; buf[i + 1] = out[1];
6719                 }
6720         }else{ // mono
6721                 DATA_T out;
6722                 for(i = 0; i < count; i++){
6723                         fc->buff[0][fc->count] = buf[i];
6724                         fc->count = (fc->count + 1) & mask;
6725                         offset = fc->count - fc->size;
6726                         out = 0;
6727                         for(j = 0; j < fc->size; ++j){
6728                                 int32 ofs = (offset + j) & mask;
6729                                 out += fc->dc[j] * fc->buff[0][ofs];
6730                         }
6731                         buf[i] = out;
6732                 }
6733         }
6734 #endif
6735 }
6736
6737
6738
6739
6740
6741