/* Analog formant filter response : H(f) = i f B / (f1^2 - f^2 + i f B) */ static int Sound_into_FormantFilter_frame (Sound me, FormantFilter thee, long frame, double bw) { Melder_assert (bw > 0); autoMatrix pv = Sound_to_spectralpower (me); double z1 = pv -> x1; double dz = pv -> dx; long nf = pv -> nx; for (long i = 1; i <= thy ny; i++) { double p = 0; double fc = thy y1 + (i - 1) * thy dy; double *pow = pv -> z[1]; for (long j = 1; j <= nf; j++) { // H(f) = ifB / (fc^2 - f^2 + ifB) // H(f)| = fB / sqrt ((fc^2 - f^2)^2 + f^2B^2) //|H(f)|^2 = f^2B^2 / ((fc^2 - f^2)^2 + f^2B^2) // = 1 / (((fc^2 - f^2) /fB)^2 + 1) double f = z1 + (j - 1) * dz; double a = NUMformantfilter_amplitude (fc, bw, f); p += a * pow[j]; } thy z[i][frame] = p; } return 1; }
static int Sound_into_BarkFilter_frame (Sound me, BarkFilter thee, long frame) { autoMatrix pv = Sound_to_spectralpower (me); long nf = pv -> nx; autoNUMvector<double> z (1, nf); for (long j = 1; j <= nf; j++) { z[j] = HZTOBARK (pv -> x1 + (j - 1) * pv -> dx); } for (long i = 1; i <= thy ny; i++) { double p = 0; double z0 = thy y1 + (i - 1) * thy dy; double *pow = pv -> z[1]; // TODO ?? for (long j = 1; j <= nf; j++) { // Sekey & Hanson filter is defined in the power domain. // We therefore multiply the power with a (and not a^2). // integral (F(z),z=0..25) = 1.58/9 double a = NUMsekeyhansonfilter_amplitude (z0, z[j]); p += a * pow[j] ; } thy z[i][frame] = p; } return 1; }
static int Sound_into_MelFilter_frame (Sound me, MelFilter thee, long frame) { autoMatrix pv = Sound_to_spectralpower (me); double z1 = pv -> x1; double dz = pv -> dx; long nf = pv -> nx; double df = thy dy; for (long i = 1; i <= thy ny; i++) { double p = 0; double fc_mel = thy y1 + (i - 1) * df; double fc_hz = MELTOHZ (fc_mel); double fl_hz = MELTOHZ (fc_mel - df); double fh_hz = MELTOHZ (fc_mel + df); double *pow = pv -> z[1]; for (long j = 1; j <= nf; j++) { // Filter with a triangular filter the power (=amplitude-squared) double f = z1 + (j - 1) * dz; double a = NUMtriangularfilter_amplitude (fl_hz, fc_hz, fh_hz, f); p += a * pow[j] ; } thy z[i][frame] = p; } return 1; }