3 # Copyright (c) 2007-2009 Ariff Abdullah <ariff@FreeBSD.org>
6 # Redistribution and use in source and binary forms, with or without
7 # modification, are permitted provided that the following conditions
9 # 1. Redistributions of source code must retain the above copyright
10 # notice, this list of conditions and the following disclaimer.
11 # 2. Redistributions in binary form must reproduce the above copyright
12 # notice, this list of conditions and the following disclaimer in the
13 # documentation and/or other materials provided with the distribution.
15 # THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16 # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 # ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19 # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20 # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21 # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22 # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23 # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24 # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 # $FreeBSD: head/sys/tools/sound/feeder_rate_mkfilter.awk 195378 2009-07-05 18:15:06Z ariff $
31 # FIR filter design by windowing method. This might become one of the
32 # funniest joke I've ever written due to too many tricks being applied to
33 # ensure maximum precision (well, in fact this is already have the same
34 # precision granularity compared to its C counterpart). Nevertheless, it's
35 # working, precise, dynamically tunable based on "presets".
37 # XXX EXPECT TOTAL REWRITE! DON'T ARGUE!
39 # TODO: Using ultraspherical window might be a good idea.
43 # "Digital Audio Resampling" by Julius O. Smith III
45 # - http://ccrma.stanford.edu/~jos/resample/
49 # Some basic Math functions.
53 return (((x
< 0) ?
-x
: x
) + 0);
58 return (((x
< 0.0) ?
-x
: x
) + 0.0);
79 return (exp
(1.0 * y
* log
(1.0 * x
)));
96 while (y
> 0 && x
!= 0) {
103 function fx_floor
(v
, o
, r
)
105 if (fabs
(v
) < fabs
(smallest
))
107 if (fabs
(v
) > fabs
(largest
))
110 r = floor
((v
* o
) + 0.5);
111 if (r
< INT32_MIN
|| r
> INT32_MAX
)
112 printf("\n#error overflow v=%f, please reduce %d\n", v
, o
);
118 # Kaiser linear piecewise functions.
120 function kaiserAttn2Beta
(attn
, beta
)
123 return (Z_KAISER_BETA_DEFAULT
);
126 beta =
0.1102 * ((1.0 * attn
) - 8.7);
127 else if (attn
> 21.0)
128 beta =
(0.5842 * pow
((1.0 * attn
) - 21.0, 0.4)) + \
129 (0.07886 * ((1.0 * attn
) - 21.0));
136 function kaiserBeta2Attn
(beta
, x
, y
, i
, attn
, xbeta
)
138 if (beta
< Z_WINDOW_KAISER
)
139 return (Z_KAISER_ATTN_DEFAULT
);
141 if (beta
> kaiserAttn2Beta
(50.0))
142 attn =
((1.0 * beta
) / 0.1102) + 8.7;
146 attn =
0.5 * (x
+ y
);
147 for (i =
0; i
< 128; i
++) {
148 xbeta = kaiserAttn2Beta
(attn
)
149 if (beta == xbeta
|| \
151 fabs
(beta
- xbeta
) < Z_KAISER_EPSILON
))
157 attn =
0.5 * (x
+ y
);
164 function kaiserRolloff
(len
, attn
)
166 return (1.0 - (((1.0 * attn
) - 7.95) / (((1.0 * len
) - 1.0) * 14.36)));
170 # 0th order modified Bessel function of the first kind.
172 function I0
(x
, s
, u
, n
, h
, t
)
183 } while (u
>=
(I0_EPSILON
* s
));
190 if (beta
>= Z_WINDOW_KAISER
)
192 else if (beta == Z_WINDOW_BLACKMAN_NUTTALL
)
193 return ("Blackman - Nuttall");
194 else if (beta == Z_WINDOW_NUTTALL
)
196 else if (beta == Z_WINDOW_BLACKMAN_HARRIS
)
197 return ("Blackman - Harris");
198 else if (beta == Z_WINDOW_BLACKMAN
)
200 else if (beta == Z_WINDOW_HAMMING
)
202 else if (beta == Z_WINDOW_HANN
)
205 return ("What The Hell !?!?");
208 function rolloff_round
(x
)
218 function tap_round
(x
, y
)
225 function lpf
(imp
, n
, rolloff
, beta
, num
, i
, j
, x
, nm
, ibeta
, w
)
227 rolloff = rolloff_round
(rolloff
+ (Z_NYQUIST_HOVER
* (1.0 - rolloff
)));
231 # Generate ideal sinc impulses, locate the last zero-crossing and pad
232 # the remaining with 0.
234 # Note that there are other (faster) ways of calculating this without
235 # the misery of traversing the entire sinc given the fact that the
236 # distance between each zero crossings is actually the bandwidth of
237 # the impulses, but it seems having 0.0001% chances of failure due to
241 for (i =
1; i
< n
; i
++) {
242 x =
(M_PI
* i
) / (1.0 * num
);
243 imp
[i
] = sin
(x
* rolloff
) / x
;
244 if (i
!= 1 && (imp
[i
] * imp
[i
- 1]) <=
0.0)
248 for (i = j
; i
< n
; i
++)
253 if (beta
>= Z_WINDOW_KAISER
)
256 for (i =
1; i
< j
; i
++) {
257 if (beta
>= Z_WINDOW_KAISER
) {
260 w = I0
(beta
* sqrt
(1.0 - (x
* x
))) / ibeta
;
264 if (beta == Z_WINDOW_BLACKMAN_NUTTALL
) {
266 w =
0.36335819 + (0.4891775 * cos
(x
)) + \
267 (0.1365995 * cos
(2 * x
)) + \
268 (0.0106411 * cos
(3 * x
));
269 } else if (beta == Z_WINDOW_NUTTALL
) {
271 w =
0.355768 + (0.487396 * cos
(x
)) + \
272 (0.144232 * cos
(2 * x
)) + \
273 (0.012604 * cos
(3 * x
));
274 } else if (beta == Z_WINDOW_BLACKMAN_HARRIS
) {
276 w =
0.422323 + (0.49755 * cos
(x
)) + \
277 (0.07922 * cos
(2 * x
));
278 } else if (beta == Z_WINDOW_BLACKMAN
) {
280 w =
0.42 + (0.50 * cos
(x
)) + \
282 } else if (beta == Z_WINDOW_HAMMING
) {
284 w =
0.54 + (0.46 * cos
(x
));
285 } else if (beta == Z_WINDOW_HANN
) {
287 w =
0.50 + (0.50 * cos
(x
));
296 imp
["impulse_length"] = j
;
297 imp
["rolloff"] = rolloff
;
300 function mkfilter
(imp
, nmult
, rolloff
, beta
, num
, \
301 nwing
, mwing
, nrolloff
, i
, dcgain
, v
, quality
)
303 nwing = floor
((nmult
* num
) / 2) + 1;
305 lpf
(imp
, nwing
, rolloff
, beta
, num
);
307 mwing = imp
["impulse_length"];
308 nrolloff = imp
["rolloff"];
309 quality = imp
["quality"];
312 for (i = num
; i
< mwing
; i
+= num
)
317 for (i =
0; i
< nwing
; i
++)
323 printf(" * quality = %d\n", quality
);
324 printf(" * window = %s\n", wname
(beta
));
325 if (beta
>= Z_WINDOW_KAISER
) {
326 printf(" * beta: %.2f\n", beta
);
327 printf(" * stop: -%.2f dB\n", \
328 kaiserBeta2Attn
(beta
));
330 printf(" * length = %d\n", nmult
);
331 printf(" * bandwidth = %.2f%%", rolloff
* 100.0);
332 if (rolloff
!= nrolloff
) {
333 printf(" + %.2f%% = %.2f%% (nyquist hover: %.2f%%)", \
334 (nrolloff
- rolloff
) * 100.0, nrolloff
* 100.0, \
335 Z_NYQUIST_HOVER
* 100.0);
338 printf(" * drift = %d\n", num
);
339 printf(" * width = %d\n", mwing
);
341 printf("static int32_t z_coeff_q%d[%d] = {", \
342 quality
, nwing
+ (Z_COEFF_OFFSET
* 2));
343 for (i =
0; i
< (nwing
+ (Z_COEFF_OFFSET
* 2)); i
++) {
346 if (i
< Z_COEFF_OFFSET
)
347 v = fx_floor
(imp
[Z_COEFF_OFFSET
- i
], Z_COEFF_ONE
);
348 else if ((i
- Z_COEFF_OFFSET
) >= nwing
)
350 imp
[nwing
+ nwing
- i
+ Z_COEFF_OFFSET
- 1],\
353 v = fx_floor
(imp
[i
- Z_COEFF_OFFSET
], Z_COEFF_ONE
);
354 printf(" %s0x%08x,", (v
< 0) ?
"-" : " ", abs
(v
));
358 printf(" * interpolated q%d differences.\n", quality
);
360 printf("static int32_t z_dcoeff_q%d[%d] = {", quality
, nwing
);
361 for (i =
1; i
<= nwing
; i
++) {
367 v = fx_floor
(v
, Z_INTERP_COEFF_ONE
);
368 if (abs
(v
) > abs
(largest_interp
))
370 printf(" %s0x%08x,", (v
< 0) ?
"-" : " ", abs
(v
));
377 function filter_parse
(s
, a
, i
, attn
, alen
)
382 if (alen
> 0 && a
[1] ==
"OVERSAMPLING_FACTOR") {
385 init_drift
(floor
(a
[2]));
389 if (alen
> 0 && a
[1] ==
"COEFFICIENT_BIT") {
392 init_coeff_bit
(floor
(a
[2]));
396 if (alen
> 0 && a
[1] ==
"ACCUMULATOR_BIT") {
399 init_accum_bit
(floor
(a
[2]));
403 if (alen
> 0 && a
[1] ==
"INTERPOLATOR") {
406 init_coeff_interpolator
(toupper(a
[2]));
410 if (alen ==
1 || alen ==
2) {
411 if (a
[1] ==
"NYQUIST_HOVER") {
413 Z_NYQUIST_HOVER =
(i
> 0.0 && i
< 1.0) ? i
: 0.0;
418 attn = Z_KAISER_ATTN_DEFAULT
;
419 Popts
["beta"] = Z_KAISER_BETA_DEFAULT
;
420 } else if (Z_WINDOWS
[a
[1]] < Z_WINDOW_KAISER
) {
421 Popts
["beta"] = Z_WINDOWS
[a
[1]];
426 i =
1.0 - (6.44 / i
);
427 Popts
["rolloff"] = rolloff_round
(i
);
431 Popts
["beta"] = kaiserAttn2Beta
(attn
);
437 i = kaiserRolloff
(i
, attn
);
438 Popts
["rolloff"] = rolloff_round
(i
);
443 if (!
(alen ==
3 || alen ==
4))
448 if (a
[1] ==
"kaiser") {
450 Popts
["beta"] =
1.0 * a
[i
++];
452 Popts
["beta"] = Z_KAISER_BETA_DEFAULT
;
453 } else if (Z_WINDOWS
[a
[1]] < Z_WINDOW_KAISER
)
454 Popts
["beta"] = Z_WINDOWS
[a
[1]];
455 else if (1.0 * a
[1] < Z_WINDOW_KAISER
)
458 Popts
["beta"] = kaiserAttn2Beta
(1.0 * a
[1]);
459 Popts
["nmult"] = tap_round
(a
[i
++]);
460 if (a
[1] ==
"kaiser" && alen ==
3)
461 i = kaiserRolloff
(Popts
["nmult"], \
462 kaiserBeta2Attn
(Popts
["beta"]));
465 Popts
["rolloff"] = rolloff_round
(i
);
470 function genscale
(bit
, s1
, s2
, scale
)
472 if ((bit
+ Z_COEFF_SHIFT
) > Z_ACCUMULATOR_BIT
)
473 s1 = Z_COEFF_SHIFT
- \
474 (32 - (Z_ACCUMULATOR_BIT
- Z_COEFF_SHIFT
));
476 s1 = Z_COEFF_SHIFT
- (32 - bit
);
478 s2 = Z_SHIFT
+ (32 - bit
);
483 scale =
sprintf("(v) << %d", abs
(s1
));
485 scale =
sprintf("(v) >> %d", s1
);
487 scale =
sprintf("(%s) * Z_SCALE_CAST(s)", scale
);
490 scale =
sprintf("(%s) >> %d", scale
, s2
);
492 printf("#define Z_SCALE_%d(v, s)\t%s(%s)\n", \
493 bit
, (bit
< 10) ?
"\t" : "", scale
);
496 function genlerp
(bit
, use64
, lerp
)
498 if ((bit
+ Z_LINEAR_SHIFT
) <=
32) {
499 lerp =
sprintf("(((y) - (x)) * (z)) >> %d", Z_LINEAR_SHIFT
);
500 } else if (use64
!= 0) {
501 if ((bit
+ Z_LINEAR_SHIFT
) <=
64) {
503 "(((int64_t)(y) - (x)) * (z)) " \
508 "((int64_t)((y) >> %d) - ((x) >> %d)) * ", \
510 bit
+ Z_LINEAR_SHIFT
- 64, \
511 bit
+ Z_LINEAR_SHIFT
- 64);
513 lerp =
sprintf("(%s) >> %d", lerp
, 64 - bit
);
517 "(((y) >> %d) - ((x) >> %d)) * (z)", \
518 bit
+ Z_LINEAR_SHIFT
- 32, \
519 bit
+ Z_LINEAR_SHIFT
- 32);
521 lerp =
sprintf("(%s) >> %d", lerp
, 32 - bit
);
524 printf("#define Z_LINEAR_INTERPOLATE_%d(z, x, y)" \
525 "\t\t\t\t%s\\\n\t((x) + (%s))\n", \
526 bit
, (bit
< 10) ?
"\t" : "", lerp
);
529 function init_drift
(drift
, xdrift
)
531 xdrift = floor
(drift
);
533 if (Z_DRIFT_SHIFT
!= -1) {
534 if (xdrift
!= Z_DRIFT_SHIFT
)
535 printf("#error Z_DRIFT_SHIFT reinitialize!\n");
540 # Initialize filter oversampling factor, or in other word
545 else if (xdrift
> 31)
548 Z_DRIFT_SHIFT = xdrift
;
549 Z_DRIFT_ONE = shl
(1, Z_DRIFT_SHIFT
);
551 Z_SHIFT = Z_FULL_SHIFT
- Z_DRIFT_SHIFT
;
552 Z_ONE = shl
(1, Z_SHIFT
);
556 function init_coeff_bit
(cbit
, xcbit
)
560 if (Z_COEFF_SHIFT
!= 0) {
561 if (xcbit
!= Z_COEFF_SHIFT
)
562 printf("#error Z_COEFF_SHIFT reinitialize!\n");
567 # Initialize dynamic range of coefficients.
574 Z_COEFF_SHIFT = xcbit
;
575 Z_COEFF_ONE = shl
(1, Z_COEFF_SHIFT
);
578 function init_accum_bit
(accbit
, xaccbit
)
580 xaccbit = floor
(accbit
);
582 if (Z_ACCUMULATOR_BIT
!= 0) {
583 if (xaccbit
!= Z_ACCUMULATOR_BIT
)
584 printf("#error Z_ACCUMULATOR_BIT reinitialize!\n");
589 # Initialize dynamic range of accumulator.
593 else if (xaccbit
< 32)
596 Z_ACCUMULATOR_BIT = xaccbit
;
599 function init_coeff_interpolator
(interp
)
602 # Validate interpolator type.
604 if (interp ==
"ZOH" || interp ==
"LINEAR" || \
605 interp ==
"QUADRATIC" || interp ==
"HERMITE" || \
606 interp ==
"BSPLINE" || interp ==
"OPT32X" || \
607 interp ==
"OPT16X" || interp ==
"OPT8X" || \
608 interp ==
"OPT4X" || interp ==
"OPT2X")
609 Z_COEFF_INTERPOLATOR = interp
;
614 M_PI = atan2
(0.0, -1.0);
616 INT32_MAX =
1 + ((shl
(1, 30) - 1) * 2);
617 INT32_MIN =
-1 - INT32_MAX
;
621 Z_ACCUMULATOR_BIT_DEFAULT =
58;
622 Z_ACCUMULATOR_BIT =
0;
625 Z_FULL_ONE = shl
(1, Z_FULL_SHIFT
);
627 Z_COEFF_SHIFT_DEFAULT =
30;
631 Z_COEFF_INTERPOLATOR =
0;
633 Z_INTERP_COEFF_SHIFT =
24;
634 Z_INTERP_COEFF_ONE = shl
(1, Z_INTERP_COEFF_SHIFT
);
636 Z_LINEAR_FULL_SHIFT = Z_FULL_SHIFT
;
637 Z_LINEAR_FULL_ONE = shl
(1, Z_LINEAR_FULL_SHIFT
);
639 Z_LINEAR_UNSHIFT = Z_LINEAR_FULL_SHIFT
- Z_LINEAR_SHIFT
;
640 Z_LINEAR_ONE = shl
(1, Z_LINEAR_SHIFT
)
642 Z_DRIFT_SHIFT_DEFAULT =
5;
644 # meehhhh... let it overflow...
646 #Z_SCALE_ONE = shl(1, Z_SCALE_SHIFT);
648 Z_WINDOW_KAISER =
0.0;
649 Z_WINDOW_BLACKMAN_NUTTALL =
-1.0;
650 Z_WINDOW_NUTTALL =
-2.0;
651 Z_WINDOW_BLACKMAN_HARRIS =
-3.0;
652 Z_WINDOW_BLACKMAN =
-4.0;
653 Z_WINDOW_HAMMING =
-5.0;
654 Z_WINDOW_HANN =
-6.0;
656 Z_WINDOWS
["blackman_nuttall"] = Z_WINDOW_BLACKMAN_NUTTALL
;
657 Z_WINDOWS
["nuttall"] = Z_WINDOW_NUTTALL
;
658 Z_WINDOWS
["blackman_harris"] = Z_WINDOW_BLACKMAN_HARRIS
;
659 Z_WINDOWS
["blackman"] = Z_WINDOW_BLACKMAN
;
660 Z_WINDOWS
["hamming"] = Z_WINDOW_HAMMING
;
661 Z_WINDOWS
["hann"] = Z_WINDOW_HANN
;
663 Z_KAISER_2_BLACKMAN_BETA =
8.568611;
664 Z_KAISER_2_BLACKMAN_NUTTALL_BETA =
11.98;
666 Z_KAISER_ATTN_DEFAULT =
100;
667 Z_KAISER_BETA_DEFAULT = kaiserAttn2Beta
(Z_KAISER_ATTN_DEFAULT
);
669 Z_KAISER_EPSILON =
1e-21;
672 # This is practically a joke.
674 Z_NYQUIST_HOVER =
0.0;
676 smallest =
10.000000;
682 ARGV[ARGC++] =
"100:8:0.85";
683 ARGV[ARGC++] =
"100:36:0.92";
684 ARGV[ARGC++] =
"100:164:0.97";
685 #ARGV[ARGC++] = "100:8";
686 #ARGV[ARGC++] = "100:16";
687 #ARGV[ARGC++] = "100:32:0.7929";
688 #ARGV[ARGC++] = "100:64:0.8990";
689 #ARGV[ARGC++] = "100:128:0.9499";
692 printf("#ifndef _FEEDER_RATE_GEN_H_\n");
693 printf("#define _FEEDER_RATE_GEN_H_\n\n");
695 printf(" * Generated using feeder_rate_mkfilter.awk, heaven, wind and awesome.\n");
697 printf(" * DO NOT EDIT!\n");
699 printf("#define FEEDER_RATE_PRESETS\t\"");
700 for (i =
1; i
< ARGC; i
++)
701 printf("%s%s", (i ==
1) ?
"" : " ", ARGV[i
]);
704 for (i =
1; i
< ARGC; i
++) {
705 if (filter_parse
(ARGV[i
]) ==
0) {
706 beta = Popts
["beta"];
707 nmult = Popts
["nmult"];
708 rolloff = Popts
["rolloff"];
709 if (Z_DRIFT_SHIFT ==
-1)
710 init_drift
(Z_DRIFT_SHIFT_DEFAULT
);
711 if (Z_COEFF_SHIFT ==
0)
712 init_coeff_bit
(Z_COEFF_SHIFT_DEFAULT
);
713 if (Z_ACCUMULATOR_BIT ==
0)
714 init_accum_bit
(Z_ACCUMULATOR_BIT_DEFAULT
);
715 ztab
[imp
["quality"] - 2] = \
716 mkfilter
(imp
, nmult
, rolloff
, beta
, Z_DRIFT_ONE
);
725 #if (length(ztab) > 0) {
727 # for (i = 0; i < length(ztab); i++) {
731 # printf("static int32_t z_coeff_zero[%d] = {", j);
732 # for (i = 0; i < j; i++) {
737 # printf("\n};\n\n");
742 printf("static const struct {\n");
743 printf("\tint32_t len;\n");
744 printf("\tint32_t *coeff;\n");
745 printf("\tint32_t *dcoeff;\n");
746 printf("} z_coeff_tab[] = {\n");
747 if (length(ztab
) > 0) {
749 for (i =
0; i
< length(ztab
); i
++) {
753 j =
length(sprintf("%d", j
));
754 lfmt =
sprintf("%%%dd", j
);
755 j =
length(sprintf("z_coeff_q%d", length(ztab
) + 1));
756 zcfmt =
sprintf("%%-%ds", j
);
757 zdcfmt =
sprintf("%%-%ds", j
+ 1);
759 for (i =
0; i
< length(ztab
); i
++) {
760 l =
sprintf(lfmt
, ztab
[i
]);
761 zc =
sprintf("z_coeff_q%d", i
+ 2);
762 zc =
sprintf(zcfmt
, zc
);
763 zdc =
sprintf("z_dcoeff_q%d", i
+ 2);
764 zdc =
sprintf(zdcfmt
, zdc
);
765 printf("\t{ %s, %s, %s },\n", l
, zc
, zdc
);
768 printf("\t{ 0, NULL, NULL }\n");
772 #v = shr(Z_ONE - 1, Z_UNSHIFT) * abs(largest_interp);
773 #while (v < 0 || v > INT32_MAX) {
775 # v = shr(Z_ONE - 1, Z_UNSHIFT) * abs(largest_interp);
777 v =
((Z_ONE
- 1) * abs
(largest_interp
)) / INT32_MAX
;
778 Z_UNSHIFT = ceil
(log
(v
) / log
(2.0));
779 Z_INTERP_SHIFT = Z_SHIFT
- Z_UNSHIFT
+ Z_INTERP_COEFF_SHIFT
;
781 Z_INTERP_UNSHIFT =
(Z_SHIFT
- Z_UNSHIFT
) + Z_INTERP_COEFF_SHIFT \
784 printf("#define Z_COEFF_TAB_SIZE\t\t\t\t\t\t\\\n");
785 printf("\t((int32_t)(sizeof(z_coeff_tab) /");
786 printf(" sizeof(z_coeff_tab[0])))\n\n");
787 printf("#define Z_COEFF_OFFSET\t\t%d\n\n", Z_COEFF_OFFSET
);
788 printf("#define Z_RSHIFT(x, y)\t\t(((x) + " \
789 "(1 << ((y) - 1))) >> (y))\n");
790 printf("#define Z_RSHIFT_L(x, y)\t(((x) + " \
791 "(1LL << ((y) - 1))) >> (y))\n\n");
792 printf("#define Z_FULL_SHIFT\t\t%d\n", Z_FULL_SHIFT
);
793 printf("#define Z_FULL_ONE\t\t0x%08x%s\n", Z_FULL_ONE
, \
794 (Z_FULL_ONE
> INT32_MAX
) ?
"U" : "");
796 printf("#define Z_DRIFT_SHIFT\t\t%d\n", Z_DRIFT_SHIFT
);
797 #printf("#define Z_DRIFT_ONE\t\t0x%08x\n", Z_DRIFT_ONE);
799 printf("#define Z_SHIFT\t\t\t%d\n", Z_SHIFT
);
800 printf("#define Z_ONE\t\t\t0x%08x\n", Z_ONE
);
801 printf("#define Z_MASK\t\t\t0x%08x\n", Z_MASK
);
803 printf("#define Z_COEFF_SHIFT\t\t%d\n", Z_COEFF_SHIFT
);
804 zinterphp =
"(z) * (d)";
805 zinterpunshift = Z_SHIFT
+ Z_INTERP_COEFF_SHIFT
- Z_COEFF_SHIFT
;
806 if (zinterpunshift
> 0) {
807 v =
(Z_ONE
- 1) * abs
(largest_interp
);
808 if (v
< INT32_MIN
|| v
> INT32_MAX
)
809 zinterphp =
sprintf("(int64_t)%s", zinterphp
);
810 zinterphp =
sprintf("(%s) >> %d", zinterphp
, zinterpunshift
);
811 } else if (zinterpunshift
< 0)
812 zinterphp =
sprintf("(%s) << %d", zinterphp
, \
813 abs
(zinterpunshift
));
817 zinterp =
sprintf("(z) >> %d", Z_UNSHIFT
);
818 zinterp =
sprintf("(%s) * (d)", zinterp
);
819 if (Z_INTERP_UNSHIFT
< 0)
820 zinterp =
sprintf("(%s) << %d", zinterp
, \
821 abs
(Z_INTERP_UNSHIFT
));
822 else if (Z_INTERP_UNSHIFT
> 0)
823 zinterp =
sprintf("(%s) >> %d", zinterp
, Z_INTERP_UNSHIFT
);
824 if (zinterphp
!= zinterp
) {
825 printf("\n#ifdef SND_FEEDER_RATE_HP\n");
826 printf("#define Z_COEFF_INTERPOLATE(z, c, d)" \
827 "\t\t\t\t\t\\\n\t((c) + (%s))\n", zinterphp
);
829 printf("#define Z_COEFF_INTERPOLATE(z, c, d)" \
830 "\t\t\t\t\t\\\n\t((c) + (%s))\n", zinterp
);
833 printf("#define Z_COEFF_INTERPOLATE(z, c, d)" \
834 "\t\t\t\t\t\\\n\t((c) + (%s))\n", zinterp
);
836 #printf("#define Z_SCALE_SHIFT\t\t%d\n", Z_SCALE_SHIFT);
837 #printf("#define Z_SCALE_ONE\t\t0x%08x%s\n", Z_SCALE_ONE, \
838 # (Z_SCALE_ONE > INT32_MAX) ? "U" : "");
840 printf("#define Z_SCALE_CAST(s)\t\t((uint32_t)(s))\n");
846 printf("#define Z_ACCUMULATOR_BIT\t%d\n\n", Z_ACCUMULATOR_BIT
)
847 for (i =
8; i
<=
32; i
+=
8) {
848 gbit =
((i
+ Z_COEFF_SHIFT
) > Z_ACCUMULATOR_BIT
) ? \
849 (i
- (Z_ACCUMULATOR_BIT
- Z_COEFF_SHIFT
)) : 0;
850 printf("#define Z_GUARD_BIT_%d\t\t%d\n", i
, gbit
);
852 printf("#define Z_NORM_%d(v)\t\t(v)\n\n", i
);
854 printf("#define Z_NORM_%d(v)\t\t" \
855 "((v) >> Z_GUARD_BIT_%d)\n\n", i
, i
);
858 printf("#define Z_LINEAR_FULL_ONE\t0x%08xU\n", Z_LINEAR_FULL_ONE
);
859 printf("#define Z_LINEAR_SHIFT\t\t%d\n", Z_LINEAR_SHIFT
);
860 printf("#define Z_LINEAR_UNSHIFT\t%d\n", Z_LINEAR_UNSHIFT
);
861 printf("#define Z_LINEAR_ONE\t\t0x%08x\n", Z_LINEAR_ONE
);
863 printf("#ifdef SND_PCM_64\n");
868 printf("#else\t/* !SND_PCM_64 */\n");
873 printf("#endif\t/* SND_PCM_64 */\n");
875 printf("#define Z_QUALITY_ZOH\t\t0\n");
876 printf("#define Z_QUALITY_LINEAR\t1\n");
877 printf("#define Z_QUALITY_SINC\t\t%d\n", \
878 floor
((length(ztab
) - 1) / 2) + 2);
880 printf("#define Z_QUALITY_MIN\t\t0\n");
881 printf("#define Z_QUALITY_MAX\t\t%d\n", length(ztab
) + 1);
882 if (Z_COEFF_INTERPOLATOR
!= 0)
883 printf("\n#define Z_COEFF_INTERP_%s\t1\n", \
884 Z_COEFF_INTERPOLATOR
);
885 printf("\n/*\n * smallest: %.32f\n * largest: %.32f\n *\n", \
887 printf(" * z_unshift=%d, z_interp_shift=%d\n *\n", \
888 Z_UNSHIFT
, Z_INTERP_SHIFT
);
889 v = shr
(Z_ONE
- 1, Z_UNSHIFT
) * abs
(largest_interp
);
890 printf(" * largest interpolation multiplication: %d\n */\n", v
);
891 if (v
< INT32_MIN
|| v
> INT32_MAX
) {
892 printf("\n#ifndef SND_FEEDER_RATE_HP\n");
893 printf("#error interpolation overflow, please reduce" \
894 " Z_INTERP_SHIFT\n");
898 printf("\n#endif /* !_FEEDER_RATE_GEN_H_ */\n");