http://bugs.winehq.org/show_bug.cgi?id=14717
--- Comment #198 from Alexander E. Patrakov patrakov@gmail.com 2011-11-04 09:11:09 CDT --- I took the stopband attenuation figures from the attached plots, and this was my mistake. You can use the following C code for checking the FIRs after generation:
/* Just random enough not no hit zeroes in the transfer function by accident */ static const double testfreqs[5] = {0.55, 1.08, 1.31, 1.38, 1.41};
static void checkfir (fir_t* fir) { int i, j; for (j = 0; j < 5; j++) { double dct_coeff = -0.5 * fir->wing[0]; double testfreq = testfreqs[j] / fir->step; for (i = 0; i < fir->size; i++) dct_coeff += fir->wing[i] * cos(M_PI * i * testfreq);
dct_coeff *= 2; /* two wings */ fprintf(stderr, "attenuation at %1.2f Fn: %1.1f dB\n", testfreqs[j], 20 * log10(fabs(dct_coeff))); } double interp1 = 0.5 * (fir->wing[1] + fir->wing[2]); double interp3 = 0.625 * (fir->wing[1] + fir->wing[2]) - 0.125 * (fir->wing[0] + fir->wing[3]);
double noise = (interp1 - interp3) / interp3; fprintf(stderr, "noise: %1.1f dB\n", 20 * log10(fabs(noise))); }
Still, my point stands: the noise and stopband rejection figures are not well-balanced. You can improve the noise figure by increasing the "step" member of the firparams structure.