#include #include #include #include void filter(signed char *buf, int n) { enum { bufsiz = 256, m = bufsiz-1 }; int b[bufsiz] = {0}; for (unsigned bi = 0; bi != n; bi++) { b[bi & m] = buf[bi]; b[(bi - 1) & m] -= b[bi & m]; b[(bi - 6) & m] -= b[(bi - 1) & m]; b[(bi - 21) & m] += b[(bi - 6) & m]; buf[bi] = b[(bi - 21) & m]; } } void filter2(signed char *buf, int n) { enum { bufsiz = 256, m = bufsiz-1 }; int b[bufsiz] = {0}; for (unsigned bi = 0; bi != n; bi++) { b[bi & m] = buf[bi]; b[bi & m] += b[(bi - 1) & m]; b[(bi - 1) & m] += b[(bi - 2) & m]; b[(bi - 7) & m] -= b[(bi - 1) & m]; b[(bi - 12) & m] -= b[(bi - 7) & m]; buf[bi] = b[(bi - 12) & m] >> 3; } } /* This one is designed, if that word isn’t oversimplifying the activity, to extract a downconverted and decimated 19110-Hz signal from a 44100-Hz input. */ unsigned filter3(signed char *buf, int n) { enum { bufsiz = 256, m = bufsiz-1 }; int b[bufsiz] = {0}; uint64_t d1=0, d2=0, d3=0, d4=0, i1=0, i2=0, i3=0, tmp, tmp2, c2=0, c3=0; int bi5=0, bo=0, odd=0; for (unsigned bi = 0; bi != n; bi++, bi5++) { tmp = buf[bi]; tmp2 = tmp - d1; /* Differentiator 1 */ d1 = tmp; tmp = tmp2 - d2; /* Differentiator 2 */ d2 = tmp2; tmp2 = tmp - d3; /* Differentiator 3 */ d3 = tmp; tmp = tmp2 - d4; /* Differentiator 4 */ d4 = tmp2; i1 += odd ? -tmp : tmp; /* Integrator 1 */ odd = ~odd; i2 += i1; /* Integrator 2 */ i3 += i2; /* Integrator 3 */ if (bi5 == 5) { bi5 = 0; /* First comb filter: y(n) = x(n-2) - x(n); note inversion */ b[bi & m] = i3; b[(bi - 2) & m] -= i3; /* Second comb filter: y(n) = x(n-1) - x(n); canceling inversion */ tmp = c2 - b[(bi - 2) & m]; c2 = b[(bi - 2) & m]; /* Third comb filter: y(n) = x(n) - x(n-1), this time not inverting; but now into the output buffer */ buf[bo++] = tmp - c3; c3 = tmp; } } return bo; } int main() { signed char buf[4096]; enum { allocsize = 100*1024*1024 }; signed char *buf2 = malloc(allocsize); if (!buf2) abort(); int n = read(0, buf2, sizeof(buf)); filter2(buf2, allocsize); if (n != write(1, buf, n)) abort(); return 0; }