MelSpectrogram Matrix_to_MelSpectrogram (Matrix me) { try { autoMelSpectrogram thee = MelSpectrogram_create (my xmin, my xmax, my nx, my dx, my x1, my ymin, my ymax, my ny, my dy, my y1); NUMmatrix_copyElements (my z, thy z, 1, my ny, 1, my nx); return thee.transfer(); } catch (MelderError) { Melder_throw (me, U": not converted to MelSpectrogram."); } }
autoMelSpectrogram Sound_to_MelSpectrogram (Sound me, double analysisWidth, double dt, double f1_mel, double fmax_mel, double df_mel) { try { double t1, samplingFrequency = 1.0 / my dx, nyquist = 0.5 * samplingFrequency; double windowDuration = 2.0 * analysisWidth; // gaussian window double fmin_mel = 0.0; double fbottom = NUMhertzToMel2 (100.0), fceiling = NUMhertzToMel2 (nyquist); long numberOfFrames; // Check defaults. if (fmax_mel <= 0.0 || fmax_mel > fceiling) { fmax_mel = fceiling; } if (fmax_mel <= f1_mel) { f1_mel = fbottom; fmax_mel = fceiling; } if (f1_mel <= 0.0) { f1_mel = fbottom; } if (df_mel <= 0.0) { df_mel = 100.0; } // Determine the number of filters. long numberOfFilters = lround ((fmax_mel - f1_mel) / df_mel); fmax_mel = f1_mel + numberOfFilters * df_mel; Sampled_shortTermAnalysis (me, windowDuration, dt, &numberOfFrames, &t1); autoSound sframe = Sound_createSimple (1, windowDuration, samplingFrequency); autoSound window = Sound_createGaussian (windowDuration, samplingFrequency); autoMelSpectrogram thee = MelSpectrogram_create (my xmin, my xmax, numberOfFrames, dt, t1, fmin_mel, fmax_mel, numberOfFilters, df_mel, f1_mel); autoMelderProgress progress (U"MelSpectrograms analysis"); for (long iframe = 1; iframe <= numberOfFrames; iframe++) { double t = Sampled_indexToX (thee.get(), iframe); Sound_into_Sound (me, sframe.get(), t - windowDuration / 2.0); Sounds_multiply (sframe.get(), window.get()); Sound_into_MelSpectrogram_frame (sframe.get(), thee.get(), iframe); if (iframe % 10 == 1) { Melder_progress ((double) iframe / numberOfFrames, U"Frame ", iframe, U" out of ", numberOfFrames, U"."); } } _Spectrogram_windowCorrection ((Spectrogram) thee.get(), window -> nx); return thee; } catch (MelderError) { Melder_throw (me, U": no MelSpectrogram created."); } }
MelSpectrogram MelFilter_to_MelSpectrogram (MelFilter me) { try { autoMelSpectrogram thee = MelSpectrogram_create (my xmin, my xmax, my nx, my dx, my x1, my ymin, my ymax, my ny, my dy, my y1); for (long i = 1; i <= my ny; i++) { for (long j = 1; j <= my nx; j++) { thy z[i][j] = 4e-10 * pow (10, my z[i][j] / 10); } } return thee.transfer (); } catch (MelderError) { Melder_throw (U"MelSpectrogram not created."); } }
MelSpectrogram MFCC_to_MelSpectrogram (MFCC me, long first, long last, bool c0) { try { if (first == 0 && last == 0) { // defaults first = 1; last = my maximumNumberOfCoefficients; } if (first < 1) { first = 1; } if (last > my maximumNumberOfCoefficients) { last = my maximumNumberOfCoefficients; } if (first > last) { first = 1; last = my maximumNumberOfCoefficients; } double df = (my fmax - my fmin) / (my maximumNumberOfCoefficients + 1 + 1); autoMelSpectrogram thee = MelSpectrogram_create (my xmin, my xmax, my nx, my dx, my x1, my fmin, my fmax, my maximumNumberOfCoefficients + 1, df, df); CC_into_BandFilterSpectrogram (me, thee.peek(), first, last, c0); return thee.transfer(); } catch (MelderError) { Melder_throw (me, U"MelSpectrogram not created."); } }