autoPowerCepstrum Cepstrum_downto_PowerCepstrum (Cepstrum me ) { try { autoPowerCepstrum thee = PowerCepstrum_create (my xmax, my nx); for (long i = 1; i <= my nx; i++) { thy z[1][i] = my z[1][i] * my z[1][i]; } return thee; } catch (MelderError) { Melder_throw (me, U" not converted."); } }
autoPowerCepstrum Matrix_to_PowerCepstrum_row (Matrix me, long row) { try { autoPowerCepstrum thee = PowerCepstrum_create (my xmax, my nx); if (row < 1 || row > my ny) { Melder_throw (U"Row number should be between 1 and ", my ny, U" inclusive."); } NUMvector_copyElements (my z[row], thy z[1], 1, my nx); return thee; } catch (MelderError) { Melder_throw (me, U": no PowerCepstrum created."); } }
PowerCepstrum PowerCepstrogram_to_PowerCepstrum_slice (PowerCepstrogram me, double time) { try { long iframe = Sampled_xToNearestIndex (me, time); iframe = iframe < 1 ? 1 : iframe > my nx ? my nx : iframe; autoPowerCepstrum thee = PowerCepstrum_create (my ymax, my ny); for (long i = 1; i <= my ny; i++) { thy z[1][i] = my z[i][iframe]; } return thee.transfer(); } catch (MelderError) { Melder_throw (me, ": Cepstrum not extracted."); } }
autoPowerCepstrum Matrix_to_PowerCepstrum_column (Matrix me, long col) { try { autoPowerCepstrum thee = PowerCepstrum_create (my ymax, my ny); if (col < 1 || col > my nx) { Melder_throw (U"Column number should be between 1 and ", my nx, U" inclusive."); } for (long i = 1; i <= my ny; i++) { thy z[1][i] = my z[i][col]; } return thee; } catch (MelderError) { Melder_throw (me, U": no PowerCepstrum created."); } }
void PowerCepstrogram_subtractTilt_inline (PowerCepstrogram me, double qstartFit, double qendFit, int lineType, int fitMethod) { try { autoPowerCepstrum thee = PowerCepstrum_create (my ymax, my ny); for (long i = 1; i <= my nx; i++) { for (long j = 1; j <= my ny; j++) { thy z[1][j] = my z[j][i]; } PowerCepstrum_subtractTilt_inline (thee.peek(), qstartFit, qendFit, lineType, fitMethod); for (long j = 1; j <= my ny; j++) { my z[j][i] = thy z[1][j]; } } } catch (MelderError) { Melder_throw (me, ": no tilt subtracted (inline)."); } }
autoPowerCepstrum Spectrum_to_PowerCepstrum (Spectrum me) { try { autoSpectrum dBspectrum = Data_copy (me); double *re = dBspectrum -> z[1], *im = dBspectrum -> z[2]; for (long i = 1; i <= dBspectrum -> nx; i ++) { re[i] = log (re[i] * re[i] + im[i] * im[i] + 1e-300); im[i] = 0.0; } autoSound cepstrum = Spectrum_to_Sound (dBspectrum.peek()); autoPowerCepstrum thee = PowerCepstrum_create (0.5 / my dx, my nx); for (long i = 1; i <= thy nx; i++) { double val = cepstrum -> z[1][i]; thy z[1][i] = val * val; } return thee; } catch (MelderError) { Melder_throw (me, U": not converted to Sound."); } }
Table PowerCepstrogram_to_Table_hillenbrand (PowerCepstrogram me, double pitchFloor, double pitchCeiling) { try { autoTable thee = Table_createWithColumnNames (my nx, L"time quefrency cpp f0"); autoPowerCepstrum him = PowerCepstrum_create (my ymax, my ny); for (long i = 1; i <= my nx; i++) { for (long j = 1; j <= my ny; j++) { his z[1][j] = my z[j][i]; } double qpeak, cpp = PowerCepstrum_getPeakProminence_hillenbrand (him.peek(), pitchFloor, pitchCeiling, &qpeak); double time = Sampled_indexToX (me, i); Table_setNumericValue (thee.peek(), i, 1, time); Table_setNumericValue (thee.peek(), i, 2, qpeak); Table_setNumericValue (thee.peek(), i, 3, cpp); // Cepstrogram_getCPPS depends on this index 3!! Table_setNumericValue (thee.peek(), i, 4, 1.0 / qpeak); } return thee.transfer(); } catch (MelderError) { Melder_throw (me, ": no Table with cepstral peak prominence values created."); } }
Table PowerCepstrogram_to_Table_cpp (PowerCepstrogram me, double pitchFloor, double pitchCeiling, double deltaF0, int interpolation, double qstartFit, double qendFit, int lineType, int fitMethod) { try { autoTable thee = Table_createWithColumnNames (my nx, L"time quefrency cpp f0 rnr"); autoPowerCepstrum him = PowerCepstrum_create (my ymax, my ny); for (long i = 1; i <= my nx; i++) { for (long j = 1; j <= my ny; j++) { his z[1][j] = my z[j][i]; } double qpeak, z, cpp = PowerCepstrum_getPeakProminence (him.peek(), pitchFloor, pitchCeiling, interpolation, qstartFit, qendFit, lineType, fitMethod, &qpeak); double rnr = PowerCepstrum_getRNR (him.peek(), pitchFloor, pitchCeiling, deltaF0); double time = Sampled_indexToX (me, i); Table_setNumericValue (thee.peek(), i, 1, time); Table_setNumericValue (thee.peek(), i, 2, qpeak); Table_setNumericValue (thee.peek(), i, 3, cpp); // Cepstrogram_getCPPS depends on this index!! Table_setNumericValue (thee.peek(), i, 4, 1.0 / qpeak); Table_setNumericValue (thee.peek(), i, 5, rnr); } return thee.transfer(); } catch (MelderError) { Melder_throw (me, ": no Table with cepstral peak prominence values created."); } }