feeder_rate_mkfilter.awk (193889) | feeder_rate_mkfilter.awk (194233) |
---|---|
1#!/usr/bin/awk -f 2# 3# Copyright (c) 2007-2009 Ariff Abdullah <ariff@FreeBSD.org> 4# All rights reserved. 5# 6# Redistribution and use in source and binary forms, with or without 7# modification, are permitted provided that the following conditions 8# are met: --- 10 unchanged lines hidden (view full) --- 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 25# SUCH DAMAGE. 26# | 1#!/usr/bin/awk -f 2# 3# Copyright (c) 2007-2009 Ariff Abdullah <ariff@FreeBSD.org> 4# All rights reserved. 5# 6# Redistribution and use in source and binary forms, with or without 7# modification, are permitted provided that the following conditions 8# are met: --- 10 unchanged lines hidden (view full) --- 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 25# SUCH DAMAGE. 26# |
27# $FreeBSD: head/sys/tools/sound/feeder_rate_mkfilter.awk 193889 2009-06-10 06:49:45Z ariff $ | 27# $FreeBSD: head/sys/tools/sound/feeder_rate_mkfilter.awk 194233 2009-06-15 04:31:34Z ariff $ |
28# 29 30# 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". --- 338 unchanged lines hidden (view full) --- 374 return (nwing); 375} 376 377function filter_parse(s, a, i, attn, alen) 378{ 379 split(s, a, ":"); 380 alen = length(a); 381 | 28# 29 30# 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". --- 338 unchanged lines hidden (view full) --- 374 return (nwing); 375} 376 377function filter_parse(s, a, i, attn, alen) 378{ 379 split(s, a, ":"); 380 alen = length(a); 381 |
382 if (alen > 0 && a[1] == "OVERSAMPLING_FACTOR") { 383 if (alen != 2) 384 return (-1); 385 init_drift(floor(a[2])); 386 return (-1); 387 } 388 |
|
382 if (alen == 1 || alen == 2) { | 389 if (alen == 1 || alen == 2) { |
383 if (a[1] == "nyquist_hover") { | 390 if (a[1] == "NYQUIST_HOVER") { |
384 i = 1.0 * a[2]; 385 Z_NYQUIST_HOVER = (i > 0.0 && i < 1.0) ? i : 0.0; 386 return (-1); 387 } 388 i = 1; 389 if (alen == 1) { 390 attn = Z_KAISER_ATTN_DEFAULT; 391 Popts["beta"] = Z_KAISER_BETA_DEFAULT; --- 96 unchanged lines hidden (view full) --- 488 lerp = sprintf("(%s) >> %d", lerp, 32 - bit); 489 } 490 491 printf("#define Z_LINEAR_INTERPOLATE_%d(z, x, y)" \ 492 "\t\t\t\t%s\\\n\t((x) + (%s))\n", \ 493 bit, (bit < 10) ? "\t" : "", lerp); 494} 495 | 391 i = 1.0 * a[2]; 392 Z_NYQUIST_HOVER = (i > 0.0 && i < 1.0) ? i : 0.0; 393 return (-1); 394 } 395 i = 1; 396 if (alen == 1) { 397 attn = Z_KAISER_ATTN_DEFAULT; 398 Popts["beta"] = Z_KAISER_BETA_DEFAULT; --- 96 unchanged lines hidden (view full) --- 495 lerp = sprintf("(%s) >> %d", lerp, 32 - bit); 496 } 497 498 printf("#define Z_LINEAR_INTERPOLATE_%d(z, x, y)" \ 499 "\t\t\t\t%s\\\n\t((x) + (%s))\n", \ 500 bit, (bit < 10) ? "\t" : "", lerp); 501} 502 |
503function init_drift(drift, xdrift) 504{ 505 xdrift = floor(drift); 506 507 if (Z_DRIFT_SHIFT != -1) { 508 if (xdrift != Z_DRIFT_SHIFT) 509 printf("#error Z_DRIFT_SHIFT reinitialize!\n"); 510 return; 511 } 512 513 # 514 # Initialize filter oversampling factor, or in other word 515 # Z_DRIFT_SHIFT. 516 # 517 if (xdrift < 0) 518 xdrift = 1; 519 else if (xdrift > 31) 520 xdrift = 31; 521 522 Z_DRIFT_SHIFT = xdrift; 523 Z_DRIFT_ONE = shl(1, Z_DRIFT_SHIFT); 524 525 Z_SHIFT = Z_FULL_SHIFT - Z_DRIFT_SHIFT; 526 Z_ONE = shl(1, Z_SHIFT); 527 Z_MASK = Z_ONE - 1; 528} 529 |
|
496BEGIN { 497 I0_EPSILON = 1e-21; 498 M_PI = atan2(0.0, -1.0); 499 500 INT32_MAX = 1 + ((shl(1, 30) - 1) * 2); 501 INT32_MIN = -1 - INT32_MAX; 502 503 Z_COEFF_OFFSET = 5; 504 505 Z_FULL_SHIFT = 30; 506 Z_FULL_ONE = shl(1, Z_FULL_SHIFT); 507 508 Z_COEFF_SHIFT = 28; 509 Z_COEFF_ONE = shl(1, Z_COEFF_SHIFT); 510 511 Z_INTERP_COEFF_SHIFT = 24; 512 Z_INTERP_COEFF_ONE = shl(1, Z_INTERP_COEFF_SHIFT); 513 | 530BEGIN { 531 I0_EPSILON = 1e-21; 532 M_PI = atan2(0.0, -1.0); 533 534 INT32_MAX = 1 + ((shl(1, 30) - 1) * 2); 535 INT32_MIN = -1 - INT32_MAX; 536 537 Z_COEFF_OFFSET = 5; 538 539 Z_FULL_SHIFT = 30; 540 Z_FULL_ONE = shl(1, Z_FULL_SHIFT); 541 542 Z_COEFF_SHIFT = 28; 543 Z_COEFF_ONE = shl(1, Z_COEFF_SHIFT); 544 545 Z_INTERP_COEFF_SHIFT = 24; 546 Z_INTERP_COEFF_ONE = shl(1, Z_INTERP_COEFF_SHIFT); 547 |
514 # 515 # Filter oversampling factor. 516 # 517 # 6, 7, or 8 depending on how much you can trade off between memory 518 # consumption (due to large tables) and precision / quality. 519 # 520 Z_DRIFT_SHIFT = 7; 521 Z_DRIFT_ONE = shl(1, Z_DRIFT_SHIFT); 522 523 Z_SHIFT = Z_FULL_SHIFT - Z_DRIFT_SHIFT; 524 Z_ONE = shl(1, Z_SHIFT); 525 Z_MASK = Z_ONE - 1; 526 | |
527 Z_LINEAR_FULL_SHIFT = Z_FULL_SHIFT; 528 Z_LINEAR_FULL_ONE = shl(1, Z_LINEAR_FULL_SHIFT); 529 Z_LINEAR_SHIFT = 8; 530 Z_LINEAR_UNSHIFT = Z_LINEAR_FULL_SHIFT - Z_LINEAR_SHIFT; 531 Z_LINEAR_ONE = shl(1, Z_LINEAR_SHIFT) 532 | 548 Z_LINEAR_FULL_SHIFT = Z_FULL_SHIFT; 549 Z_LINEAR_FULL_ONE = shl(1, Z_LINEAR_FULL_SHIFT); 550 Z_LINEAR_SHIFT = 8; 551 Z_LINEAR_UNSHIFT = Z_LINEAR_FULL_SHIFT - Z_LINEAR_SHIFT; 552 Z_LINEAR_ONE = shl(1, Z_LINEAR_SHIFT) 553 |
554 Z_DRIFT_SHIFT_DEFAULT = 5; 555 Z_DRIFT_SHIFT = -1; |
|
533 # meehhhh... let it overflow... 534 #Z_SCALE_SHIFT = 31; 535 #Z_SCALE_ONE = shl(1, Z_SCALE_SHIFT); 536 537 Z_WINDOW_KAISER = 0.0; 538 Z_WINDOW_BLACKMAN_NUTTALL = -1.0; 539 Z_WINDOW_NUTTALL = -2.0; 540 Z_WINDOW_BLACKMAN_HARRIS = -3.0; --- 49 unchanged lines hidden (view full) --- 590 printf("%s%s", (i == 1) ? "" : " ", ARGV[i]); 591 printf("\"\n\n"); 592 imp["quality"] = 2; 593 for (i = 1; i < ARGC; i++) { 594 if (filter_parse(ARGV[i]) == 0) { 595 beta = Popts["beta"]; 596 nmult = Popts["nmult"]; 597 rolloff = Popts["rolloff"]; | 556 # meehhhh... let it overflow... 557 #Z_SCALE_SHIFT = 31; 558 #Z_SCALE_ONE = shl(1, Z_SCALE_SHIFT); 559 560 Z_WINDOW_KAISER = 0.0; 561 Z_WINDOW_BLACKMAN_NUTTALL = -1.0; 562 Z_WINDOW_NUTTALL = -2.0; 563 Z_WINDOW_BLACKMAN_HARRIS = -3.0; --- 49 unchanged lines hidden (view full) --- 613 printf("%s%s", (i == 1) ? "" : " ", ARGV[i]); 614 printf("\"\n\n"); 615 imp["quality"] = 2; 616 for (i = 1; i < ARGC; i++) { 617 if (filter_parse(ARGV[i]) == 0) { 618 beta = Popts["beta"]; 619 nmult = Popts["nmult"]; 620 rolloff = Popts["rolloff"]; |
621 if (Z_DRIFT_SHIFT == -1) 622 init_drift(Z_DRIFT_SHIFT_DEFAULT); |
|
598 ztab[imp["quality"] - 2] = \ 599 mkfilter(imp, nmult, rolloff, beta, Z_DRIFT_ONE); 600 imp["quality"]++; 601 } 602 } 603 604 printf("\n"); 605 # --- 162 unchanged lines hidden --- | 623 ztab[imp["quality"] - 2] = \ 624 mkfilter(imp, nmult, rolloff, beta, Z_DRIFT_ONE); 625 imp["quality"]++; 626 } 627 } 628 629 printf("\n"); 630 # --- 162 unchanged lines hidden --- |