static autoSound synthesize_pulses_lpc (Manipulation me) { try { if (! my lpc) { if (! my sound) Melder_throw (U"Missing original sound."); autoSound sound10k = Sound_resample (my sound.get(), 10000.0, 50); my lpc = Sound_to_LPC_burg (sound10k.get(), 20, 0.025, 0.01, 50.0); } if (! my pulses) Melder_throw (U"Missing pulses analysis."); autoSound train = PointProcess_to_Sound_pulseTrain (my pulses.get(), 1.0 / my lpc -> samplingPeriod, 0.7, 0.05, 30); train -> dx = my lpc -> samplingPeriod; // to be exact Sound_PointProcess_fillVoiceless (train.get(), my pulses.get()); autoSound result = LPC_and_Sound_filter (my lpc.get(), train.get(), true); NUMdeemphasize_f (result -> z [1], result -> nx, result -> dx, 50.0); Vector_scale (result.get(), 0.99); return result; } catch (MelderError) { Melder_throw (me, U": LPC synthesis not performed."); } }
void Sound_filterWithFormants (Sound me, double tmin, double tmax, int numberOfFormants, double formant [], double bandwidth []) { try { for (long channel = 1; channel <= my ny; channel ++) { if (tmax <= tmin) { tmin = my xmin; tmax = my xmax; } // autowindowing long itmin, itmax; long n = Sampled_getWindowSamples (me, tmin, tmax, & itmin, & itmax); if (n <= 2) Melder_throw (U"Sound too short."); double *amplitude = my z [channel] + itmin - 1; // base 1 NUMdeemphasize_f (amplitude, n, my dx, 50.0); for (int iformant = 1; iformant <= numberOfFormants; iformant ++) { NUMfilterSecondOrderSection_fb (amplitude, n, my dx, formant [iformant], bandwidth [iformant]); } } Matrix_scaleAbsoluteExtremum (me, 0.99); } catch (MelderError) { Melder_throw (me, U": not filtered."); } }