static int findOneZero (int ijt, double vcx [], double a, double b, double *zero) { double x = 0.5 * (a + b), fa = 0.0, fb = 0.0, fx = 0.0; long k; for (k = ijt; k >= 0; k --) { fa = vcx [k] + a * fa; fb = vcx [k] + b * fb; } if (fa * fb >= 0.0) { // there should be a zero between a and b Melder_casual ( U"There is no zero between ,", Melder_single (a), U" and ", Melder_single (b), U".\n The function values are ", Melder_single (fa), U" and ", Melder_single (fb), U", respectively." ); return 0; } do { fx = 0.0; /*x = fa == fb ? 0.5 * (a + b) : a + fa * (a - b) / (fb - fa);*/ x = 0.5 * (a + b); // simple bisection for (k = ijt; k >= 0; k --) fx = vcx [k] + x * fx; if (fa * fx > 0.0) { a = x; fa = fx; } else { b = x; fb = fx; } } while (fabs (fx) > 1e-5); *zero = x; return 1; // OK }
static void gui_button_cb_addTarget (ArtwordEditor me, GuiButtonEvent /* event */) { Artword artword = (Artword) my data; char32 *timeText = GuiText_getString (my time); double tim = Melder_atof (timeText); char32 *valueText = GuiText_getString (my value); double value = Melder_atof (valueText); ArtwordData a = & artword -> data [my feature]; int i = 1, oldCount = a -> numberOfTargets; Melder_free (timeText); Melder_free (valueText); Artword_setTarget (artword, my feature, tim, value); /* Optimization instead of "updateList (me)". */ if (tim < 0) tim = 0; if (tim > artword -> totalTime) tim = artword -> totalTime; while (tim != a -> times [i]) { i ++; Melder_assert (i <= a -> numberOfTargets); // can fail if tim is in an extended precision register } const char32 *itemText = Melder_cat (Melder_single (tim), U" ", Melder_single (value)); if (a -> numberOfTargets == oldCount) { GuiList_replaceItem (my list, itemText, i); } else { GuiList_insertItem (my list, itemText, i); } Graphics_updateWs (my graphics.get()); Editor_broadcastDataChanged (me); }
static void updateList (ArtwordEditor me) { Artword artword = (Artword) my data; ArtwordData a = & artword -> data [my feature]; GuiList_deleteAllItems (my list); for (int i = 1; i <= a -> numberOfTargets; i ++) { GuiList_insertItem (my list, Melder_cat (Melder_single (a -> times [i]), U" ", Melder_single (a -> targets [i])), i); } Graphics_updateWs (my graphics.get()); }
static void updateList (ArtwordEditor me) { Artword artword = (Artword) my data; ArtwordData a = & artword -> data [my feature]; GuiList_deleteAllItems (my list); for (int i = 1; i <= a -> numberOfTargets; i ++) { static MelderString itemText = { 0 }; MelderString_empty (& itemText); MelderString_append (& itemText, Melder_single (a -> times [i]), L" ", Melder_single (a -> targets [i])); GuiList_insertItem (my list, itemText.string, i); } Graphics_updateWs (my graphics); }
int Praat_tests (int itest, wchar_t *arg1, wchar_t *arg2, wchar_t *arg3, wchar_t *arg4) { long i, n = wcstol (arg1, NULL, 10); double x; (void) arg1; (void) arg2; (void) arg3; (void) arg4; Melder_clearInfo (); Melder_stopwatch (); switch (itest) { case kPraatTests_CHECK_RANDOM_1009_2009: { NUMrandomRestart (310952); for (i = 1; i <= 1009 * 2009 - 100 + 1; i ++) x = NUMrandomFraction (); MelderInfo_writeLine1 (Melder_double (x)); } break; case kPraatTests_TIME_RANDOM_FRACTION: { for (i = 1; i <= n; i ++) (void) NUMrandomFraction (); } break; case kPraatTests_TIME_SORT: { long m = wcstol (arg2, NULL, 10); long *array = NUMlvector (1, m); for (i = 1; i <= m; i ++) array [i] = NUMrandomInteger (1, 100); Melder_stopwatch (); for (i = 1; i <= n; i ++) NUMsort_l (m, array); NUMlvector_free (array, 1); } break; } MelderInfo_writeLine2 (Melder_single (Melder_stopwatch () / n * 1e9), L" nanoseconds"); MelderInfo_close (); return 1; }
void structSpectrum :: v_info () { structData :: v_info (); MelderInfo_writeLine (L"Frequency domain:"); MelderInfo_writeLine (L" Lowest frequency: ", Melder_double (xmin), L" Hz"); MelderInfo_writeLine (L" Highest frequency: ", Melder_double (xmax), L" Hz"); MelderInfo_writeLine (L" Total bandwidth: ", Melder_double (xmax - xmin), L" Hz"); MelderInfo_writeLine (L"Frequency sampling:"); MelderInfo_writeLine (L" Number of frequency bands (bins): ", Melder_integer (nx)); MelderInfo_writeLine (L" Frequency step (bin width): ", Melder_double (dx), L" Hz"); MelderInfo_writeLine (L" First frequency band around (bin centre at): ", Melder_double (x1), L" Hz"); MelderInfo_writeLine (L"Total energy: ", Melder_single (Spectrum_getBandEnergy (this, 0.0, 0.0)), L" Pa2 sec"); }
void structMovie :: v_info () { structDaata :: v_info (); MelderInfo_writeLine (U"Start time: ", xmin, U" seconds"); MelderInfo_writeLine (U"End time: ", xmax, U" seconds"); MelderInfo_writeLine (U"Total duration: ", xmax - xmin, U" seconds"); MelderInfo_writeLine (U"Time sampling:"); MelderInfo_writeLine (U" Number of frames: ", nx); MelderInfo_writeLine (U" Frame duration: ", dx, U" seconds"); MelderInfo_writeLine (U" Frame rate: ", Melder_single (1.0 / dx), U" frames per second"); MelderInfo_writeLine (U" First frame centred at: ", x1, U" seconds"); }
void structLtas :: v_info () { double meanPowerDensity; structDaata :: v_info (); MelderInfo_writeLine (U"Frequency domain:"); MelderInfo_writeLine (U" Lowest frequency: ", xmin, U" Hz"); MelderInfo_writeLine (U" Highest frequency: ", xmax, U" Hz"); MelderInfo_writeLine (U" Total frequency domain: ", xmax - xmin, U" Hz"); MelderInfo_writeLine (U"Frequency sampling:"); MelderInfo_writeLine (U" Number of frequency bands: ", nx); MelderInfo_writeLine (U" Width of each band: ", dx, U" Hz"); MelderInfo_writeLine (U" First band centred at: ", x1, U" Hz"); meanPowerDensity = Sampled_getMean (this, xmin, xmax, 0, 1, false); MelderInfo_writeLine (U"Total SPL: ", Melder_single (10.0 * log10 (meanPowerDensity * (xmax - xmin))), U" dB"); }
void structLtas :: v_info () { double meanPowerDensity; structData :: v_info (); MelderInfo_writeLine1 (L"Frequency domain:"); MelderInfo_writeLine3 (L" Lowest frequency: ", Melder_double (xmin), L" Hz"); MelderInfo_writeLine3 (L" Highest frequency: ", Melder_double (xmax), L" Hz"); MelderInfo_writeLine3 (L" Total frequency domain: ", Melder_double (xmax - xmin), L" Hz"); MelderInfo_writeLine1 (L"Frequency sampling:"); MelderInfo_writeLine2 (L" Number of frequency bands: ", Melder_integer (nx)); MelderInfo_writeLine3 (L" Width of each band: ", Melder_double (dx), L" Hz"); MelderInfo_writeLine3 (L" First band centred at: ", Melder_double (x1), L" Hz"); meanPowerDensity = Sampled_getMean (this, xmin, xmax, 0, 1, FALSE); MelderInfo_writeLine3 (L"Total SPL: ", Melder_single (10.0 * log10 (meanPowerDensity * (xmax - xmin))), L" dB"); }
static void info (I) { iam (Ltas); double meanPowerDensity; classData -> info (me); MelderInfo_writeLine1 (L"Frequency domain:"); MelderInfo_writeLine3 (L" Lowest frequency: ", Melder_double (my xmin), L" Hz"); MelderInfo_writeLine3 (L" Highest frequency: ", Melder_double (my xmax), L" Hz"); MelderInfo_writeLine3 (L" Total frequency domain: ", Melder_double (my xmax - my xmin), L" Hz"); MelderInfo_writeLine1 (L"Frequency sampling:"); MelderInfo_writeLine2 (L" Number of frequency bands: ", Melder_integer (my nx)); MelderInfo_writeLine3 (L" Width of each band: ", Melder_double (my dx), L" Hz"); MelderInfo_writeLine3 (L" First band centred at: ", Melder_double (my x1), L" Hz"); meanPowerDensity = Sampled_getMean (me, my xmin, my xmax, 0, 1, FALSE); MelderInfo_writeLine3 (L"Total SPL: ", Melder_single (10 * log10 (meanPowerDensity * (my xmax - my xmin))), L" dB"); }
void structExcitation :: v_info () { double *y = z [1]; long numberOfMaxima = 0; structData :: v_info (); MelderInfo_writeLine (L"Loudness: ", Melder_half (Excitation_getLoudness (this)), L" sones"); for (long i = 2; i < nx; i ++) if (y [i] > y [i - 1] && y [i] >= y [i + 1]) { double i_real, formant_bark, strength; if (++ numberOfMaxima > 15) break; strength = NUMimproveMaximum (z [1], nx, i, NUM_PEAK_INTERPOLATE_SINC70, & i_real); formant_bark = x1 + (i_real - 1) * dx; MelderInfo_write (L"Peak at ", Melder_single (formant_bark), L" Bark"); MelderInfo_write (L", ", Melder_integer ((long) NUMbarkToHertz (formant_bark)), L" Hz"); MelderInfo_writeLine (L", ", Melder_half (strength), L" phon."); } }
void structEEG :: v_info () { structDaata :: v_info (); MelderInfo_writeLine (U"Time domain:"); MelderInfo_writeLine (U" Start time: ", our xmin, U" seconds"); MelderInfo_writeLine (U" End time: ", our xmax, U" seconds"); MelderInfo_writeLine (U" Total duration: ", our xmax - our xmin, U" seconds"); if (our sound) { MelderInfo_writeLine (U"Time sampling of the signal:"); MelderInfo_writeLine (U" Number of samples: ", our sound -> nx); MelderInfo_writeLine (U" Sampling period: ", our sound -> dx, U" seconds"); MelderInfo_writeLine (U" Sampling frequency: ", Melder_single (1.0 / our sound -> dx), U" Hz"); MelderInfo_writeLine (U" First sample centred at: ", our sound -> x1, U" seconds"); } MelderInfo_writeLine (U"Number of cap electrodes: ", EEG_getNumberOfCapElectrodes (this)); MelderInfo_writeLine (U"Number of external electrodes: ", EEG_getNumberOfExternalElectrodes (this)); MelderInfo_writeLine (U"Number of extra sensors: ", EEG_getNumberOfExtraSensors (this)); }
int Praat_tests (int itest, char32 *arg1, char32 *arg2, char32 *arg3, char32 *arg4) { int64 n = Melder_atoi (arg1); double t; (void) arg1; (void) arg2; (void) arg3; (void) arg4; Melder_clearInfo (); Melder_stopwatch (); switch (itest) { case kPraatTests_TIME_RANDOM_FRACTION: { for (int64 i = 1; i <= n; i ++) (void) NUMrandomFraction (); t = Melder_stopwatch (); } break; case kPraatTests_TIME_RANDOM_GAUSS: { for (int64 i = 1; i <= n; i ++) (void) NUMrandomGauss (0.0, 1.0); t = Melder_stopwatch (); } break; case kPraatTests_TIME_SORT: { long m = Melder_atoi (arg2); long *array = NUMvector <long> (1, m); for (int64 i = 1; i <= m; i ++) array [i] = NUMrandomInteger (1, 100); Melder_stopwatch (); for (int64 i = 1; i <= n; i ++) NUMsort_l (m, array); t = Melder_stopwatch (); NUMvector_free (array, 1); } break; case kPraatTests_TIME_INTEGER: { double sum = 0; for (int64 i = 1; i <= n; i ++) sum += i * (i - 1) * (i - 2); t = Melder_stopwatch (); MelderInfo_writeLine (sum); } break; case kPraatTests_TIME_FLOAT: { double sum = 0.0, fn = n; for (double fi = 1.0; fi <= fn; fi = fi + 1.0) sum += fi * (fi - 1.0) * (fi - 2.0); t = Melder_stopwatch (); MelderInfo_writeLine (sum); } break; case kPraatTests_TIME_FLOAT_TO_UNSIGNED_BUILTIN: { uint64_t sum = 0; double fn = n; for (double fi = 1.0; fi <= fn; fi = fi + 1.0) sum += (uint32_t) fi; t = Melder_stopwatch (); // 2.59 // 1.60 MelderInfo_writeLine (sum); } break; case kPraatTests_TIME_FLOAT_TO_UNSIGNED_EXTERN: { uint64_t sum = 0; double fn = n; for (double fi = 1.0; fi <= fn; fi = fi + 1.0) sum += (uint32_t) ((int32_t) (fi - 2147483648.0) + 2147483647L + 1); t = Melder_stopwatch (); // 1.60 MelderInfo_writeLine (sum); } break; case kPraatTests_TIME_UNSIGNED_TO_FLOAT_BUILTIN: { double sum = 0.0; uint32_t nu = (uint32_t) n; for (uint32_t iu = 1; iu <= nu; iu ++) sum += (double) iu; t = Melder_stopwatch (); // 1.35 MelderInfo_writeLine (sum); } break; case kPraatTests_TIME_UNSIGNED_TO_FLOAT_EXTERN: { double sum = 0.0; uint32_t nu = (uint32_t) n; for (uint32_t iu = 1; iu <= nu; iu ++) sum += (double) (int32_t) (iu - 2147483647L - 1) + 2147483648.0; t = Melder_stopwatch (); // 0.96 MelderInfo_writeLine (sum); } break; case kPraatTests_TIME_STRING_MELDER_32: { autoMelderString string; char32 word [] { U"abc" }; word [2] = NUMrandomInteger ('a', 'z'); for (int64 i = 1; i <= n; i ++) { MelderString_copy (& string, word); for (int j = 1; j <= 30; j ++) MelderString_append (& string, word); } t = Melder_stopwatch (); } break; case kPraatTests_TIME_STRING_CPP_S: { std::string s = ""; char word [] { "abc" }; word [2] = (char) NUMrandomInteger ('a', 'z'); for (int64 i = 1; i <= n; i ++) { s = word; for (int j = 1; j <= 30; j ++) s += word; } t = Melder_stopwatch (); } break; case kPraatTests_TIME_STRING_CPP_C: { std::basic_string<char> s = ""; char word [] { "abc" }; word [2] = (char) NUMrandomInteger ('a', 'z'); for (int64 i = 1; i <= n; i ++) { s = word; for (int j = 1; j <= 30; j ++) s += word; } t = Melder_stopwatch (); } break; case kPraatTests_TIME_STRING_CPP_WS: { std::wstring s = L""; wchar_t word [] { L"abc" }; word [2] = NUMrandomInteger ('a', 'z'); for (int64 i = 1; i <= n; i ++) { s = word; for (int j = 1; j <= 30; j ++) s += word; } t = Melder_stopwatch (); } break; case kPraatTests_TIME_STRING_CPP_WC: { std::basic_string<wchar_t> s = L""; wchar_t word [] { L"abc" }; word [2] = NUMrandomInteger ('a', 'z'); for (int64 i = 1; i <= n; i ++) { s = word; for (int j = 1; j <= 30; j ++) s += word; } t = Melder_stopwatch (); } break; case kPraatTests_TIME_STRING_CPP_32: { std::basic_string<char32_t> s = U""; char32 word [] { U"abc" }; word [2] = NUMrandomInteger ('a', 'z'); for (int64 i = 1; i <= n; i ++) { s = word; for (int j = 1; j <= 30; j ++) s += word; } t = Melder_stopwatch (); } break; case kPraatTests_TIME_STRING_CPP_U32STRING: { #if ! defined (macintosh) || ! useCarbon std::u32string s = U""; char32 word [] { U"abc" }; word [2] = NUMrandomInteger ('a', 'z'); for (int64 i = 1; i <= n; i ++) { s = word; for (int j = 1; j <= 30; j ++) s += word; } #endif t = Melder_stopwatch (); } break; case kPraatTests_TIME_STRCPY: { char buffer [100]; char word [] { "abc" }; word [2] = (char) NUMrandomInteger ('a', 'z'); for (int64 i = 1; i <= n; i ++) { strcpy (buffer, word); for (int j = 1; j <= 30; j ++) strcpy (buffer + strlen (buffer), word); } t = Melder_stopwatch (); MelderInfo_writeLine (Melder_peek8to32 (buffer)); } break; case kPraatTests_TIME_WCSCPY: { wchar_t buffer [100]; wchar_t word [] { L"abc" }; word [2] = NUMrandomInteger ('a', 'z'); for (int64 i = 1; i <= n; i ++) { wcscpy (buffer, word); for (int j = 1; j <= 30; j ++) wcscpy (buffer + wcslen (buffer), word); } t = Melder_stopwatch (); } break; case kPraatTests_TIME_STR32CPY: { char32 buffer [100]; char32 word [] { U"abc" }; word [2] = NUMrandomInteger ('a', 'z'); for (int64 i = 1; i <= n; i ++) { str32cpy (buffer, word); for (int j = 1; j <= 30; j ++) str32cpy (buffer + str32len (buffer), word); } t = Melder_stopwatch (); MelderInfo_writeLine (buffer); } break; case kPraatTests_TIME_GRAPHICS_TEXT_TOP: { autoPraatPicture picture; for (int64 i = 1; i <= n; i ++) { Graphics_textTop (GRAPHICS, false, U"hello world"); } t = Melder_stopwatch (); } break; } MelderInfo_writeLine (Melder_single (t / n * 1e9), U" nanoseconds"); MelderInfo_close (); return 1; }
void structPitch :: v_info () { long nVoiced; autoNUMvector <double> frequencies (Sampled_getSortedValues (this, Pitch_LEVEL_FREQUENCY, kPitch_unit_HERTZ, & nVoiced), 1); structDaata :: v_info (); MelderInfo_writeLine (U"Time domain:"); MelderInfo_writeLine (U" Start time: ", xmin, U" seconds"); MelderInfo_writeLine (U" End time: ", xmax, U" seconds"); MelderInfo_writeLine (U" Total duration: ", xmax - xmin, U" seconds"); MelderInfo_writeLine (U"Time sampling:"); MelderInfo_writeLine (U" Number of frames: ", nx, U" (", nVoiced, U" voiced)"); MelderInfo_writeLine (U" Time step: ", dx, U" seconds"); MelderInfo_writeLine (U" First frame centred at: ", x1, U" seconds"); MelderInfo_writeLine (U"Ceiling at: ", ceiling, U" Hz"); if (nVoiced >= 1) { // quantiles double quantile10, quantile16, quantile50, quantile84, quantile90; quantile10 = NUMquantile (nVoiced, frequencies.peek(), 0.10); quantile16 = NUMquantile (nVoiced, frequencies.peek(), 0.16); quantile50 = NUMquantile (nVoiced, frequencies.peek(), 0.50); // median quantile84 = NUMquantile (nVoiced, frequencies.peek(), 0.84); quantile90 = NUMquantile (nVoiced, frequencies.peek(), 0.90); MelderInfo_writeLine (U"\nEstimated quantiles:"); MelderInfo_write (U" 10% = ", Melder_single (quantile10), U" Hz = ", Melder_single (MEL (quantile10)), U" Mel = "); MelderInfo_writeLine (Melder_single (SEMITONES (quantile10)), U" semitones above 100 Hz = ", Melder_single (ERB (quantile10)), U" ERB"); MelderInfo_write (U" 16% = ", Melder_single (quantile16), U" Hz = ", Melder_single (MEL (quantile16)), U" Mel = "); MelderInfo_writeLine (Melder_single (SEMITONES (quantile16)), U" semitones above 100 Hz = ", Melder_single (ERB (quantile16)), U" ERB"); MelderInfo_write (U" 50% = ", Melder_single (quantile50), U" Hz = ", Melder_single (MEL (quantile50)), U" Mel = "); MelderInfo_writeLine (Melder_single (SEMITONES (quantile50)), U" semitones above 100 Hz = ", Melder_single (ERB (quantile50)), U" ERB"); MelderInfo_write (U" 84% = ", Melder_single (quantile84), U" Hz = ", Melder_single (MEL (quantile84)), U" Mel = "); MelderInfo_writeLine (Melder_single (SEMITONES (quantile84)), U" semitones above 100 Hz = ", Melder_single (ERB (quantile84)), U" ERB"); MelderInfo_write (U" 90% = ", Melder_single (quantile90), U" Hz = ", Melder_single (MEL (quantile90)), U" Mel = "); MelderInfo_writeLine (Melder_single (SEMITONES (quantile90)), U" semitones above 100 Hz = ", Melder_single (ERB (quantile90)), U" ERB"); if (nVoiced > 1) { double corr = sqrt (nVoiced / (nVoiced - 1.0)); MelderInfo_writeLine (U"\nEstimated spreading:"); MelderInfo_write (U" 84%-median = ", Melder_half ((quantile84 - quantile50) * corr), U" Hz = ", Melder_half ((MEL (quantile84) - MEL (quantile50)) * corr), U" Mel = "); MelderInfo_writeLine (Melder_half ((SEMITONES (quantile84) - SEMITONES (quantile50)) * corr), U" semitones = ", Melder_half ((ERB (quantile84) - ERB (quantile50)) * corr), U" ERB"); MelderInfo_write (U" median-16% = ", Melder_half ((quantile50 - quantile16) * corr), U" Hz = ", Melder_half ((MEL (quantile50) - MEL (quantile16)) * corr), U" Mel = "); MelderInfo_writeLine (Melder_half ((SEMITONES (quantile50) - SEMITONES (quantile16)) * corr), U" semitones = ", Melder_half ((ERB (quantile50) - ERB (quantile16)) * corr), U" ERB"); MelderInfo_write (U" 90%-10% = ", Melder_half ((quantile90 - quantile10) * corr), U" Hz = ", Melder_half ((MEL (quantile90) - MEL (quantile10)) * corr), U" Mel = "); MelderInfo_writeLine (Melder_half ((SEMITONES (quantile90) - SEMITONES (quantile10)) * corr), U" semitones = ", Melder_half ((ERB (quantile90) - ERB (quantile10)) * corr), U" ERB"); } } if (nVoiced >= 1) { // extrema, range, mean and standard deviation double minimum = Pitch_getMinimum (this, xmin, xmax, kPitch_unit_HERTZ, false); double maximum = Pitch_getMaximum (this, xmin, xmax, kPitch_unit_HERTZ, false); double meanHertz, meanMel, meanSemitones, meanErb; MelderInfo_write (U"\nMinimum ", Melder_single (minimum), U" Hz = ", Melder_single (MEL (minimum)), U" Mel = "); MelderInfo_writeLine (Melder_single (SEMITONES (minimum)), U" semitones above 100 Hz = ", Melder_single (ERB (minimum)), U" ERB"); MelderInfo_write (U"Maximum ", Melder_single (maximum), U" Hz = ", Melder_single (MEL (maximum)), U" Mel = "); MelderInfo_writeLine (Melder_single (SEMITONES (maximum)), U" semitones above 100 Hz = ", Melder_single (ERB (maximum)), U" ERB"); MelderInfo_write (U"Range ", Melder_half (maximum - minimum), U" Hz = ", Melder_single (MEL (maximum) - MEL (minimum)), U" Mel = "); MelderInfo_writeLine (Melder_half (SEMITONES (maximum) - SEMITONES (minimum)), U" semitones = ", Melder_half (ERB (maximum) - ERB (minimum)), U" ERB"); meanHertz = Pitch_getMean (this, 0, 0, kPitch_unit_HERTZ); meanMel = Pitch_getMean (this, 0, 0, kPitch_unit_MEL); meanSemitones = Pitch_getMean (this, 0, 0, kPitch_unit_SEMITONES_100); meanErb = Pitch_getMean (this, 0, 0, kPitch_unit_ERB); MelderInfo_write (U"Average: ", Melder_single (meanHertz), U" Hz = ", Melder_single (meanMel), U" Mel = "); MelderInfo_writeLine (Melder_single (meanSemitones), U" semitones above 100 Hz = ", Melder_single (meanErb), U" ERB"); if (nVoiced >= 2) { double stdevHertz = Pitch_getStandardDeviation (this, 0, 0, kPitch_unit_HERTZ); double stdevMel = Pitch_getStandardDeviation (this, 0, 0, kPitch_unit_MEL); double stdevSemitones = Pitch_getStandardDeviation (this, 0, 0, kPitch_unit_SEMITONES_100); double stdevErb = Pitch_getStandardDeviation (this, 0, 0, kPitch_unit_ERB); MelderInfo_write (U"Standard deviation: ", Melder_half (stdevHertz), U" Hz = ", Melder_half (stdevMel), U" Mel = "); MelderInfo_writeLine (Melder_half (stdevSemitones), U" semitones = ", Melder_half (stdevErb), U" ERB"); } } if (nVoiced > 1) { // variability: mean absolute slope double slopeHertz, slopeMel, slopeSemitones, slopeErb, slopeWithoutOctaveJumps; Pitch_getMeanAbsoluteSlope (this, & slopeHertz, & slopeMel, & slopeSemitones, & slopeErb, & slopeWithoutOctaveJumps); MelderInfo_write (U"\nMean absolute slope: ", Melder_half (slopeHertz), U" Hz/s = ", Melder_half (slopeMel), U" Mel/s = "); MelderInfo_writeLine (Melder_half (slopeSemitones), U" semitones/s = ", Melder_half (slopeErb), U" ERB/s"); MelderInfo_writeLine (U"Mean absolute slope without octave jumps: ", Melder_half (slopeWithoutOctaveJumps), U" semitones/s"); } }
int Praat_tests (int itest, char32 *arg1, char32 *arg2, char32 *arg3, char32 *arg4) { int64 n = Melder_atoi (arg1); double t = 0.0; (void) arg1; (void) arg2; (void) arg3; (void) arg4; Melder_clearInfo (); Melder_stopwatch (); switch (itest) { case kPraatTests_TIME_RANDOM_FRACTION: { for (int64 i = 1; i <= n; i ++) (void) NUMrandomFraction (); t = Melder_stopwatch (); } break; case kPraatTests_TIME_RANDOM_GAUSS: { for (int64 i = 1; i <= n; i ++) (void) NUMrandomGauss (0.0, 1.0); t = Melder_stopwatch (); } break; case kPraatTests_TIME_SORT: { long m = Melder_atoi (arg2); long *array = NUMvector <long> (1, m); for (int64 i = 1; i <= m; i ++) array [i] = NUMrandomInteger (1, 100); Melder_stopwatch (); for (int64 i = 1; i <= n; i ++) NUMsort_l (m, array); t = Melder_stopwatch (); NUMvector_free (array, 1); } break; case kPraatTests_TIME_INTEGER: { int64 sum = 0; for (int64 i = 1; i <= n; i ++) sum += i * (i - 1) * (i - 2); t = Melder_stopwatch (); MelderInfo_writeLine (sum); } break; case kPraatTests_TIME_FLOAT: { double sum = 0.0, fn = n; for (double fi = 1.0; fi <= fn; fi = fi + 1.0) sum += fi * (fi - 1.0) * (fi - 2.0); t = Melder_stopwatch (); MelderInfo_writeLine (sum); } break; case kPraatTests_TIME_FLOAT_TO_UNSIGNED_BUILTIN: { uint64_t sum = 0; double fn = n; for (double fi = 1.0; fi <= fn; fi = fi + 1.0) sum += (uint32) fi; t = Melder_stopwatch (); // 2.59 // 1.60 MelderInfo_writeLine (sum); } break; case kPraatTests_TIME_FLOAT_TO_UNSIGNED_EXTERN: { uint64_t sum = 0; double fn = n; for (double fi = 1.0; fi <= fn; fi = fi + 1.0) sum += (uint32) ((int32) (fi - 2147483648.0) + 2147483647L + 1); t = Melder_stopwatch (); // 1.60 MelderInfo_writeLine (sum); } break; case kPraatTests_TIME_UNSIGNED_TO_FLOAT_BUILTIN: { double sum = 0.0; uint32 nu = (uint32) n; for (uint32 iu = 1; iu <= nu; iu ++) sum += (double) iu; t = Melder_stopwatch (); // 1.35 MelderInfo_writeLine (sum); } break; case kPraatTests_TIME_UNSIGNED_TO_FLOAT_EXTERN: { double sum = 0.0; uint32 nu = (uint32) n; for (uint32 iu = 1; iu <= nu; iu ++) sum += (double) (int32) (iu - 2147483647L - 1) + 2147483648.0; t = Melder_stopwatch (); // 0.96 MelderInfo_writeLine (sum); } break; case kPraatTests_TIME_STRING_MELDER_32: { autoMelderString string; char32 word [] { U"abc" }; word [2] = NUMrandomInteger ('a', 'z'); for (int64 i = 1; i <= n; i ++) { MelderString_copy (& string, word); for (int j = 1; j <= 30; j ++) MelderString_append (& string, word); } t = Melder_stopwatch (); } break; case kPraatTests_TIME_STRING_MELDER_32_ALLOC: { char32 word [] { U"abc" }; word [2] = NUMrandomInteger ('a', 'z'); for (int64 i = 1; i <= n; i ++) { autoMelderString string; MelderString_copy (& string, word); for (int j = 1; j <= 30; j ++) MelderString_append (& string, word); } t = Melder_stopwatch (); } break; case kPraatTests_TIME_STRING_CPP_S: { std::string s = ""; char word [] { "abc" }; word [2] = (char) NUMrandomInteger ('a', 'z'); for (int64 i = 1; i <= n; i ++) { s = word; for (int j = 1; j <= 30; j ++) s += word; } t = Melder_stopwatch (); } break; case kPraatTests_TIME_STRING_CPP_C: { std::basic_string<char> s = ""; char word [] { "abc" }; word [2] = (char) NUMrandomInteger ('a', 'z'); for (int64 i = 1; i <= n; i ++) { s = word; for (int j = 1; j <= 30; j ++) s += word; } t = Melder_stopwatch (); } break; case kPraatTests_TIME_STRING_CPP_WS: { std::wstring s = L""; wchar_t word [] { L"abc" }; word [2] = NUMrandomInteger ('a', 'z'); for (int64 i = 1; i <= n; i ++) { s = word; for (int j = 1; j <= 30; j ++) s += word; } t = Melder_stopwatch (); } break; case kPraatTests_TIME_STRING_CPP_WC: { std::basic_string<wchar_t> s = L""; wchar_t word [] { L"abc" }; word [2] = NUMrandomInteger ('a', 'z'); for (int64 i = 1; i <= n; i ++) { s = word; for (int j = 1; j <= 30; j ++) s += word; } t = Melder_stopwatch (); } break; case kPraatTests_TIME_STRING_CPP_32: { std::basic_string<char32_t> s = U""; char32 word [] { U"abc" }; word [2] = NUMrandomInteger ('a', 'z'); for (int64 i = 1; i <= n; i ++) { s = word; for (int j = 1; j <= 30; j ++) s += word; } t = Melder_stopwatch (); } break; case kPraatTests_TIME_STRING_CPP_U32STRING: { std::u32string s = U""; char32 word [] { U"abc" }; word [2] = NUMrandomInteger ('a', 'z'); for (int64 i = 1; i <= n; i ++) { s = word; for (int j = 1; j <= 30; j ++) s += word; } t = Melder_stopwatch (); } break; case kPraatTests_TIME_STRCPY: { char buffer [100]; char word [] { "abc" }; word [2] = (char) NUMrandomInteger ('a', 'z'); for (int64 i = 1; i <= n; i ++) { strcpy (buffer, word); for (int j = 1; j <= 30; j ++) strcpy (buffer + strlen (buffer), word); } t = Melder_stopwatch (); MelderInfo_writeLine (Melder_peek8to32 (buffer)); } break; case kPraatTests_TIME_WCSCPY: { wchar_t buffer [100]; wchar_t word [] { L"abc" }; word [2] = NUMrandomInteger ('a', 'z'); for (int64 i = 1; i <= n; i ++) { wcscpy (buffer, word); for (int j = 1; j <= 30; j ++) wcscpy (buffer + wcslen (buffer), word); } t = Melder_stopwatch (); } break; case kPraatTests_TIME_STR32CPY: { char32 buffer [100]; char32 word [] { U"abc" }; word [2] = NUMrandomInteger ('a', 'z'); for (int64 i = 1; i <= n; i ++) { str32cpy (buffer, word); for (int j = 1; j <= 30; j ++) str32cpy (buffer + str32len (buffer), word); } t = Melder_stopwatch (); MelderInfo_writeLine (buffer); } break; case kPraatTests_TIME_GRAPHICS_TEXT_TOP: { autoPraatPicture picture; for (int64 i = 1; i <= n; i ++) { Graphics_textTop (GRAPHICS, false, U"hello world"); } t = Melder_stopwatch (); } break; case kPraatTests_THING_AUTO: { int numberOfThingsBefore = theTotalNumberOfThings; { Melder_casual (U"1\n"); autoDaata data = Thing_new (Daata); Thing_setName (data.get(), U"hello"); Melder_casual (U"2\n"); testData (data.get()); testAutoData (data.move()); autoDaata data18 = Thing_new (Daata); testAutoData (data18.move()); fprintf (stderr, "3\n"); autoDaata data2 = newAutoData (); fprintf (stderr, "4\n"); autoDaata data3 = newAutoData (); fprintf (stderr, "5\n"); //data2 = data; // disabled l-value copy assignment from same class fprintf (stderr, "6\n"); autoOrdered ordered = Thing_new (Ordered); fprintf (stderr, "7\n"); //data = ordered; // disabled l-value copy assignment from subclass data = ordered.move(); //ordered = data; // disabled l-value copy assignment from superclass //ordered = data.move(); // assignment from superclass to subclass is rightfully refused by compiler fprintf (stderr, "8\n"); data2 = newAutoData (); fprintf (stderr, "8a\n"); autoDaata data5 = newAutoData (); fprintf (stderr, "8b\n"); data2 = data5.move(); fprintf (stderr, "9\n"); //ordered = data; // rightfully refused by compiler fprintf (stderr, "10\n"); //autoOrdered ordered2 = Thing_new (Daata); // rightfully refused by compiler fprintf (stderr, "11\n"); autoDaata data4 = Thing_new (Ordered); // constructor fprintf (stderr, "12\n"); //autoDaata data6 = data4; // disabled l-value copy constructor from same class fprintf (stderr, "13\n"); autoDaata data7 = data4.move(); fprintf (stderr, "14\n"); autoOrdered ordered3 = Thing_new (Ordered); autoDaata data8 = ordered3.move(); fprintf (stderr, "15\n"); //autoDaata data9 = ordered; // disabled l-value copy constructor from subclass fprintf (stderr, "16\n"); autoDaata data10 = data7.move(); fprintf (stderr, "17\n"); autoDaata data11 = Thing_new (Daata); // constructor, move assignment, null destructor fprintf (stderr, "18\n"); data11 = Thing_new (Ordered); fprintf (stderr, "19\n"); testAutoDataRef (data11); fprintf (stderr, "20\n"); //data11 = nullptr; // disabled implicit assignment of pointer to autopointer fprintf (stderr, "21\n"); } int numberOfThingsAfter = theTotalNumberOfThings; fprintf (stderr, "Number of things: before %d, after %d\n", numberOfThingsBefore, numberOfThingsAfter); #if 1 MelderCallback<void,structDaata>::FunctionType f; typedef void (*DataFunc) (Daata); typedef void (*OrderedFunc) (Ordered); DataFunc dataFun; OrderedFunc orderedFun; MelderCallback<void,structDaata> dataFun2 (dataFun); MelderCallback<void,structOrdered> orderedFun2 (orderedFun); MelderCallback<void,structDaata> dataFun3 (orderedFun); //MelderCallback<void,structOrdered> orderedFun3 (dataFun); // rightfully refused by compiler autoDaata data = Thing_new (Daata); dataFun3 (data.get()); #endif } break; } MelderInfo_writeLine (Melder_single (t / n * 1e9), U" nanoseconds"); MelderInfo_close (); return 1; }
void structSoundEditor :: v_draw () { Sampled data = (Sampled) this -> data; Graphics_Viewport viewport; bool showAnalysis = p_spectrogram_show || p_pitch_show || p_intensity_show || p_formant_show; Melder_assert (data); Melder_assert (d_sound.data || d_longSound.data); /* * We check beforehand whether the window fits the LongSound buffer. */ if (d_longSound.data && d_endWindow - d_startWindow > d_longSound.data -> bufferLength) { Graphics_setColour (d_graphics.get(), Graphics_WHITE); Graphics_setWindow (d_graphics.get(), 0.0, 1.0, 0.0, 1.0); Graphics_fillRectangle (d_graphics.get(), 0.0, 1.0, 0.0, 1.0); Graphics_setColour (d_graphics.get(), Graphics_BLACK); Graphics_setTextAlignment (d_graphics.get(), Graphics_CENTRE, Graphics_BOTTOM); Graphics_text (d_graphics.get(), 0.5, 0.5, U"(window longer than ", Melder_float (Melder_single (d_longSound.data -> bufferLength)), U" seconds)"); Graphics_setTextAlignment (d_graphics.get(), Graphics_CENTRE, Graphics_TOP); Graphics_text (d_graphics.get(), 0.5, 0.5, U"(zoom in to see the samples)"); return; } /* Draw sound. */ if (showAnalysis) viewport = Graphics_insetViewport (d_graphics.get(), 0.0, 1.0, 0.5, 1.0); Graphics_setColour (d_graphics.get(), Graphics_WHITE); Graphics_setWindow (d_graphics.get(), 0.0, 1.0, 0.0, 1.0); Graphics_fillRectangle (d_graphics.get(), 0.0, 1.0, 0.0, 1.0); TimeSoundEditor_drawSound (this, d_sound.minimum, d_sound.maximum); Graphics_flushWs (d_graphics.get()); if (showAnalysis) Graphics_resetViewport (d_graphics.get(), viewport); /* Draw analyses. */ if (showAnalysis) { /* Draw spectrogram, pitch, formants. */ viewport = Graphics_insetViewport (d_graphics.get(), 0.0, 1.0, 0.0, 0.5); v_draw_analysis (); Graphics_flushWs (d_graphics.get()); Graphics_resetViewport (d_graphics.get(), viewport); } /* Draw pulses. */ if (p_pulses_show) { if (showAnalysis) viewport = Graphics_insetViewport (d_graphics.get(), 0.0, 1.0, 0.5, 1.0); v_draw_analysis_pulses (); TimeSoundEditor_drawSound (this, d_sound.minimum, d_sound.maximum); // second time, partially across the pulses Graphics_flushWs (d_graphics.get()); if (showAnalysis) Graphics_resetViewport (d_graphics.get(), viewport); } /* Update buttons. */ long first, last; long selectedSamples = Sampled_getWindowSamples (data, d_startSelection, d_endSelection, & first, & last); v_updateMenuItems_file (); if (d_sound.data) { GuiThing_setSensitive (cutButton , selectedSamples != 0 && selectedSamples < d_sound.data -> nx); GuiThing_setSensitive (copyButton , selectedSamples != 0); GuiThing_setSensitive (zeroButton , selectedSamples != 0); GuiThing_setSensitive (reverseButton , selectedSamples != 0); } }
void structPolygon :: v_info () { our structData :: v_info (); MelderInfo_writeLine (U"Number of points: ", our numberOfPoints); MelderInfo_writeLine (U"Perimeter: ", Melder_single (Polygon_perimeter (this))); }
void SoundEditor::draw () { long first, last, selectedSamples; Graphics_Viewport viewport; int showAnalysis = _spectrogram.show || _pitch.show || _intensity.show || _formant.show; Melder_assert (_data != NULL); Melder_assert (_sound.data != NULL || _longSound.data != NULL); /* * We check beforehand whether the window fits the LongSound buffer. */ if (_longSound.data && _endWindow - _startWindow > _longSound.data -> bufferLength) { Graphics_setColour (_graphics, Graphics_WHITE); Graphics_setWindow (_graphics, 0, 1, 0, 1); Graphics_fillRectangle (_graphics, 0, 1, 0, 1); Graphics_setColour (_graphics, Graphics_BLACK); Graphics_setTextAlignment (_graphics, Graphics_CENTRE, Graphics_BOTTOM); Graphics_text3 (_graphics, 0.5, 0.5, L"(window longer than ", Melder_float (Melder_single (_longSound.data -> bufferLength)), L" seconds)"); Graphics_setTextAlignment (_graphics, Graphics_CENTRE, Graphics_TOP); Graphics_text1 (_graphics, 0.5, 0.5, L"(zoom in to see the samples)"); return; } /* Draw sound. */ if (showAnalysis) viewport = Graphics_insetViewport (_graphics, 0, 1, 0.5, 1); Graphics_setColour (_graphics, Graphics_WHITE); Graphics_setWindow (_graphics, 0, 1, 0, 1); Graphics_fillRectangle (_graphics, 0, 1, 0, 1); draw_sound (_sound.minimum, _sound.maximum); Graphics_flushWs (_graphics); if (showAnalysis) Graphics_resetViewport (_graphics, viewport); /* Draw analyses. */ if (showAnalysis) { /* Draw spectrogram, pitch, formants. */ viewport = Graphics_insetViewport (_graphics, 0, 1, 0, 0.5); draw_analysis (); Graphics_flushWs (_graphics); Graphics_resetViewport (_graphics, viewport); } /* Draw pulses. */ if (_pulses.show) { if (showAnalysis) viewport = Graphics_insetViewport (_graphics, 0, 1, 0.5, 1); draw_analysis_pulses (); draw_sound (_sound.minimum, _sound.maximum); /* Second time, partially across the pulses. */ Graphics_flushWs (_graphics); if (showAnalysis) Graphics_resetViewport (_graphics, viewport); } /* Update buttons. */ selectedSamples = Sampled_getWindowSamples (_data, _startSelection, _endSelection, & first, & last); updateMenuItems_file (); if (_sound.data) { GuiObject_setSensitive (_cutButton, selectedSamples != 0 && selectedSamples < _sound.data -> nx); GuiObject_setSensitive (_copyButton, selectedSamples != 0); GuiObject_setSensitive (_zeroButton, selectedSamples != 0); GuiObject_setSensitive (_reverseButton, selectedSamples != 0); } }
void structVocalTract :: v_info () { structDaata :: v_info (); MelderInfo_writeLine (U"Vocal tract length: ", Melder_single (xmax), U" metres"); MelderInfo_writeLine (U"Number of sections: ", nx); MelderInfo_writeLine (U"Section length: ", Melder_single (dx), U" metres"); }
void structSound :: v_info () { structData :: v_info (); const double rho_c = 400; /* rho = 1.14 kg m-3; c = 353 m s-1; [rho c] = kg m-2 s-1 */ double minimum = z [1] [1], maximum = minimum; MelderInfo_writeLine (U"Number of channels: ", ny, ny == 1 ? U" (mono)" : ny == 2 ? U" (stereo)" : U""); MelderInfo_writeLine (U"Time domain:"); MelderInfo_writeLine (U" Start time: ", xmin, U" seconds"); MelderInfo_writeLine (U" End time: ", xmax, U" seconds"); MelderInfo_writeLine (U" Total duration: ", xmax - xmin, U" seconds"); MelderInfo_writeLine (U"Time sampling:"); MelderInfo_writeLine (U" Number of samples: ", nx); MelderInfo_writeLine (U" Sampling period: ", dx, U" seconds"); MelderInfo_writeLine (U" Sampling frequency: ", Melder_single (1.0 / dx), U" Hz"); MelderInfo_writeLine (U" First sample centred at: ", x1, U" seconds"); {// scope double sum = 0.0, sumOfSquares = 0.0; for (long channel = 1; channel <= ny; channel ++) { double *amplitude = z [channel]; for (long i = 1; i <= nx; i ++) { double value = amplitude [i]; sum += value; sumOfSquares += value * value; if (value < minimum) minimum = value; if (value > maximum) maximum = value; } } MelderInfo_writeLine (U"Amplitude:"); MelderInfo_writeLine (U" Minimum: ", Melder_single (minimum), U" Pascal"); MelderInfo_writeLine (U" Maximum: ", Melder_single (maximum), U" Pascal"); double mean = sum / (nx * ny); MelderInfo_writeLine (U" Mean: ", Melder_single (mean), U" Pascal"); MelderInfo_writeLine (U" Root-mean-square: ", Melder_single (sqrt (sumOfSquares / (nx * ny))), U" Pascal"); double penergy = sumOfSquares * dx / ny; /* Pa2 s = kg2 m-2 s-3 */ MelderInfo_write (U"Total energy: ", Melder_single (penergy), U" Pascal\u00B2 sec"); double energy = penergy / rho_c; /* kg s-2 = Joule m-2 */ MelderInfo_writeLine (U" (energy in air: ", Melder_single (energy), U" Joule/m\u00B2)"); double power = energy / (dx * nx); /* kg s-3 = Watt/m2 */ MelderInfo_write (U"Mean power (intensity) in air: ", Melder_single (power), U" Watt/m\u00B2"); if (power != 0.0) { MelderInfo_writeLine (U" = ", Melder_half (10 * log10 (power / 1e-12)), U" dB"); } else { MelderInfo_writeLine (U""); } } if (nx > 1) { for (long channel = 1; channel <= ny; channel ++) { double *amplitude = z [channel]; double sum = 0.0; for (long i = 1; i <= nx; i ++) { double value = amplitude [i]; sum += value; } double mean = sum / nx, stdev = 0.0; for (long i = 1; i <= nx; i ++) { double value = amplitude [i] - mean; stdev += value * value; } stdev = sqrt (stdev / (nx - 1)); MelderInfo_writeLine (U"Standard deviation in channel ", channel, U": ", Melder_single (stdev), U" Pascal"); } } }
static void info (I) { iam (Sound); const double rho_c = 400; /* rho = 1.14 kg m-3; c = 353 m s-1; [rho c] = kg m-2 s-1 */ long numberOfSamples = my nx; double minimum = my z [1] [1], maximum = minimum; classData -> info (me); MelderInfo_writeLine3 (L"Number of channels: ", Melder_integer (my ny), my ny == 1 ? L" (mono)" : my ny == 2 ? L" (stereo)" : L""); MelderInfo_writeLine1 (L"Time domain:"); MelderInfo_writeLine3 (L" Start time: ", Melder_double (my xmin), L" seconds"); MelderInfo_writeLine3 (L" End time: ", Melder_double (my xmax), L" seconds"); MelderInfo_writeLine3 (L" Total duration: ", Melder_double (my xmax - my xmin), L" seconds"); MelderInfo_writeLine1 (L"Time sampling:"); MelderInfo_writeLine2 (L" Number of samples: ", Melder_integer (my nx)); MelderInfo_writeLine3 (L" Sampling period: ", Melder_double (my dx), L" seconds"); MelderInfo_writeLine3 (L" Sampling frequency: ", Melder_single (1.0 / my dx), L" Hz"); MelderInfo_writeLine3 (L" First sample centred at: ", Melder_double (my x1), L" seconds"); double sum = 0.0, sumOfSquares = 0.0; for (long channel = 1; channel <= my ny; channel ++) { double *amplitude = my z [channel]; for (long i = 1; i <= numberOfSamples; i ++) { double value = amplitude [i]; sum += value; sumOfSquares += value * value; if (value < minimum) minimum = value; if (value > maximum) maximum = value; } } MelderInfo_writeLine1 (L"Amplitude:"); MelderInfo_writeLine3 (L" Minimum: ", Melder_single (minimum), L" Pascal"); MelderInfo_writeLine3 (L" Maximum: ", Melder_single (maximum), L" Pascal"); double mean = sum / (my nx * my ny); MelderInfo_writeLine3 (L" Mean: ", Melder_single (mean), L" Pascal"); MelderInfo_writeLine3 (L" Root-mean-square: ", Melder_single (sqrt (sumOfSquares / (my nx * my ny))), L" Pascal"); double penergy = sumOfSquares * my dx / my ny; /* Pa2 s = kg2 m-2 s-3 */ MelderInfo_write3 (L"Total energy: ", Melder_single (penergy), L" Pascal\u00B2 sec"); double energy = penergy / rho_c; /* kg s-2 = Joule m-2 */ MelderInfo_writeLine3 (L" (energy in air: ", Melder_single (energy), L" Joule/m\u00B2)"); double power = energy / (my dx * my nx); /* kg s-3 = Watt/m2 */ MelderInfo_write3 (L"Mean power (intensity) in air: ", Melder_single (power), L" Watt/m\u00B2"); if (power != 0.0) { MelderInfo_writeLine3 (L" = ", Melder_half (10 * log10 (power / 1e-12)), L" dB"); } else { MelderInfo_writeLine1 (L""); } if (my nx > 1) { for (long channel = 1; channel <= my ny; channel ++) { double *amplitude = my z [channel]; double sum = 0.0; for (long i = 1; i <= numberOfSamples; i ++) { double value = amplitude [i]; sum += value; } double mean = sum / my nx, stdev = 0.0; for (long i = 1; i <= numberOfSamples; i ++) { double value = amplitude [i] - mean; stdev += value * value; } stdev = sqrt (stdev / (my nx - 1)); MelderInfo_writeLine5 (L"Standard deviation in channel ", Melder_integer (channel), L": ", Melder_single (stdev), L" Pascal"); } } }