void Pitch_Intensity_draw (Pitch pitch, Intensity intensity, Graphics g, double f1, double f2, double s1, double s2, int garnish, int connect) { if (f2 <= f1) Pitch_getExtrema (pitch, & f1, & f2); if (f1 == 0.0) return; /* All voiceless. */ if (f1 == f2) { f1 -= 1.0; f2 += 1.0; } if (s2 <= s1) Matrix_getWindowExtrema (intensity, 0, 0, 1, 1, & s1, & s2); if (s1 == s2) { s1 -= 1.0; s2 += 1.0; } Graphics_setWindow (g, f1, f2, s1, s2); Graphics_setInner (g); long previousI = 0; double previousX = NUMundefined, previousY = NUMundefined; for (long i = 1; i <= pitch -> nx; i ++) { double t = Sampled_indexToX (pitch, i); double x = pitch -> frame [i]. candidate [1]. frequency; double y = Sampled_getValueAtX (intensity, t, Pitch_LEVEL_FREQUENCY, kPitch_unit_HERTZ, TRUE); if (x == 0) { continue; /* Voiceless. */ } if (connect & 1) Graphics_speckle (g, x, y); if ((connect & 2) && NUMdefined (previousX)) { if (previousI >= 1 && previousI < i - 1) { Graphics_setLineType (g, Graphics_DOTTED); } Graphics_line (g, previousX, previousY, x, y); Graphics_setLineType (g, Graphics_DRAWN); } previousX = x; previousY = y; previousI = i; } Graphics_unsetInner (g); if (garnish) { Graphics_drawInnerBox (g); Graphics_textBottom (g, 1, L"Fundamental frequency (Hz)"); Graphics_marksBottom (g, 2, 1, 1, 0); Graphics_textLeft (g, 1, L"Intensity (dB)"); Graphics_marksLeft (g, 2, 1, 1, 0); } }
double Pitch_getStrengthAtTime (Pitch me, double time, int unit, bool interpolate) { return Sampled_getValueAtX (me, time, Pitch_LEVEL_STRENGTH, unit, interpolate); }
double Pitch_getValueAtTime (Pitch me, double time, int unit, bool interpolate) { return Sampled_getValueAtX (me, time, Pitch_LEVEL_FREQUENCY, unit, interpolate); }
bool Pitch_isVoiced_t (Pitch me, double time) { return NUMdefined (Sampled_getValueAtX (me, time, Pitch_LEVEL_FREQUENCY, kPitch_unit_HERTZ, false)); }
double Formant_getBandwidthAtTime (Formant me, int iformant, double time, int bark) { return Sampled_getValueAtX (me, time, (iformant << 1) + 1, bark, TRUE); }
void structERPWindow :: v_drawSelectionViewer () { ERP erp = (ERP) data; Graphics_setWindow (d_graphics, -1.1, 1.1, -1.01, 1.19); Graphics_setGrey (d_graphics, 0.85); Graphics_fillRectangle (d_graphics, -1.1, 1.1, -1.01, 1.19); Graphics_setColour (d_graphics, Graphics_BLACK); long numberOfDrawableChannels = erp -> ny >= 64 && Melder_wcsequ (erp -> d_channelNames [64], L"O2") ? 64 : erp -> ny >= 32 && Melder_wcsequ (erp -> d_channelNames [32], L"Cz") ? 32 : 0; BiosemiLocationData *biosemiLocationData = numberOfDrawableChannels == 64 ? biosemiCapCoordinates64 : numberOfDrawableChannels == 32 ? biosemiCapCoordinates32 : 0; for (long ichan = 1; ichan <= numberOfDrawableChannels; ichan ++) { double inclination = (double) biosemiLocationData [ichan]. inclination; double azimuth = (double) biosemiLocationData [ichan]. azimuth; bool rightHemisphere = inclination >= 0.0; double r = fabs (inclination / 115.0); double theta = rightHemisphere ? azimuth * (NUMpi / 180.0) : (azimuth + 180.0) * (NUMpi / 180.0); biosemiLocationData [ichan]. topX = r * cos (theta); biosemiLocationData [ichan]. topY = r * sin (theta); } long n = 201; double d = 2.0 / (n - 1); autoNUMvector <double> mean (1, numberOfDrawableChannels); for (long ichan = 1; ichan <= numberOfDrawableChannels; ichan ++) { mean [ichan] = d_startSelection == d_endSelection ? Sampled_getValueAtX (erp, d_startSelection, ichan, 0, true) : Vector_getMean (erp, d_startSelection, d_endSelection, ichan); } autoNUMmatrix <double> image (1, n, 1, n); for (long irow = 1; irow <= n; irow ++) { double y = -1.0 + (irow - 1) * d; for (long icol = 1; icol <= n; icol ++) { double x = -1.0 + (icol - 1) * d; if (x * x + y * y <= 1.0) { double value = NUMundefined, sum = 0.0, weight = 0.0; for (long ichan = 1; ichan <= numberOfDrawableChannels; ichan ++) { double dx = x - biosemiLocationData [ichan]. topX; double dy = y - biosemiLocationData [ichan]. topY; double distance = sqrt (dx * dx + dy * dy); if (distance < 1e-12) { value = mean [ichan]; break; } distance = distance * distance * distance * distance * distance * distance; sum += mean [ichan] / distance; weight += 1.0 / distance; } if (value == NUMundefined) value = ( sum == 0.0 ? 0.0 : sum / weight ); image [irow] [icol] = value; } } } double minimum = 0.0, maximum = 0.0; for (long irow = 1; irow <= n; irow ++) { for (long icol = 1; icol <= n; icol ++) { double value = image [irow] [icol]; if (value < minimum) minimum = value; else if (value > maximum) maximum = value; } } double absoluteExtremum = - minimum > maximum ? - minimum : maximum; if (d_sound_scalingStrategy == kTimeSoundEditor_scalingStrategy_FIXED_RANGE) { minimum = d_sound_scaling_minimum; maximum = d_sound_scaling_maximum; } else if (d_sound_scalingStrategy == kTimeSoundEditor_scalingStrategy_FIXED_HEIGHT) { double mean = 0.5 * (minimum + maximum); minimum = mean - 0.5 * d_sound_scaling_height; maximum = mean + 0.5 * d_sound_scaling_height; } else { minimum = - absoluteExtremum; maximum = absoluteExtremum; } for (long irow = 1; irow <= n; irow ++) { double y = -1.0 + (irow - 1) * d; for (long icol = 1; icol <= n; icol ++) { double x = -1.0 + (icol - 1) * d; if (x * x + y * y > 1.0) { image [irow] [icol] = minimum + 0.1875 * (maximum - minimum); // -0.625 * absoluteExtremum; } } } Graphics_image (d_graphics, image.peek(), 1, n, -1.0-0.5/n, 1.0+0.5/n, 1, n, -1.0-0.5/n, 1.0+0.5/n, minimum, maximum); Graphics_setLineWidth (d_graphics, 2.0); /* * Nose. */ Graphics_setGrey (d_graphics, 0.5); {// scope double x [3] = { -0.08, 0.0, 0.08 }, y [3] = { 0.99, 1.18, 0.99 }; Graphics_fillArea (d_graphics, 3, x, y); } Graphics_setColour (d_graphics, Graphics_BLACK); Graphics_line (d_graphics, -0.08, 0.99, 0.0, 1.18); Graphics_line (d_graphics, 0.08, 0.99, 0.0, 1.18); /* * Ears. */ Graphics_setGrey (d_graphics, 0.5); Graphics_fillRectangle (d_graphics, -1.09, -1.00, -0.08, 0.08); Graphics_fillRectangle (d_graphics, 1.09, 1.00, -0.08, 0.08); Graphics_setColour (d_graphics, Graphics_BLACK); Graphics_line (d_graphics, -0.99, 0.08, -1.09, 0.08); Graphics_line (d_graphics, -1.09, 0.08, -1.09, -0.08); Graphics_line (d_graphics, -1.09, -0.08, -0.99, -0.08); Graphics_line (d_graphics, 0.99, 0.08, 1.09, 0.08); Graphics_line (d_graphics, 1.09, 0.08, 1.09, -0.08); Graphics_line (d_graphics, 1.09, -0.08, 0.99, -0.08); /* * Scalp. */ Graphics_ellipse (d_graphics, -1.0, 1.0, -1.0, 1.0); Graphics_setLineWidth (d_graphics, 1.0); }
void structERP :: f_drawScalp (Graphics graphics, double tmin, double tmax, double vmin, double vmax, bool garnish) { Graphics_setInner (graphics); Graphics_setWindow (graphics, -1.0, 1.0, -1.0, 1.0); //Graphics_setGrey (graphics, 1.0); //Graphics_fillRectangle (graphics, -1.1, 1.1, -1.01, 1.19); //Graphics_setColour (graphics, Graphics_BLACK); long numberOfDrawableChannels = this -> ny >= 64 && Melder_wcsequ (this -> d_channelNames [64], L"O2") ? 64 : this -> ny >= 32 && Melder_wcsequ (this -> d_channelNames [32], L"Cz") ? 32 : 0; BiosemiLocationData *biosemiLocationData = numberOfDrawableChannels == 64 ? biosemiCapCoordinates64 : numberOfDrawableChannels == 32 ? biosemiCapCoordinates32 : 0; for (long ichan = 1; ichan <= numberOfDrawableChannels; ichan ++) { double inclination = (double) biosemiLocationData [ichan]. inclination; double azimuth = (double) biosemiLocationData [ichan]. azimuth; bool rightHemisphere = inclination >= 0.0; double r = fabs (inclination / 115.0); double theta = rightHemisphere ? azimuth * (NUMpi / 180.0) : (azimuth + 180.0) * (NUMpi / 180.0); biosemiLocationData [ichan]. topX = r * cos (theta); biosemiLocationData [ichan]. topY = r * sin (theta); } long n = 201; double d = 2.0 / (n - 1); autoNUMvector <double> mean (1, numberOfDrawableChannels); for (long ichan = 1; ichan <= numberOfDrawableChannels; ichan ++) { mean [ichan] = tmin == tmax ? Sampled_getValueAtX (this, tmin, ichan, 0, true) : Vector_getMean (this, tmin, tmax, ichan); } autoNUMmatrix <double> image (1, n, 1, n); for (long irow = 1; irow <= n; irow ++) { double y = -1.0 + (irow - 1) * d; for (long icol = 1; icol <= n; icol ++) { double x = -1.0 + (icol - 1) * d; if (x * x + y * y <= 1.0) { double value = NUMundefined, sum = 0.0, weight = 0.0; for (long ichan = 1; ichan <= numberOfDrawableChannels; ichan ++) { double dx = x - biosemiLocationData [ichan]. topX; double dy = y - biosemiLocationData [ichan]. topY; double distance = sqrt (dx * dx + dy * dy); if (distance < 1e-12) { value = mean [ichan]; break; } distance = distance * distance * distance * distance * distance * distance; sum += mean [ichan] / distance; weight += 1.0 / distance; } if (value == NUMundefined) value = ( sum == 0.0 ? 0.0 : sum / weight ); image [irow] [icol] = value; } } } for (long irow = 1; irow <= n; irow ++) { double y = -1.0 + (irow - 1) * d; for (long icol = 1; icol <= n; icol ++) { double x = -1.0 + (icol - 1) * d; if (x * x + y * y > 1.0) { image [irow] [icol] = vmin; } } } Graphics_image (graphics, image.peek(), 1, n, -1.0-0.5/n, 1.0+0.5/n, 1, n, -1.0-0.5/n, 1.0+0.5/n, vmin, vmax); Graphics_setLineWidth (graphics, 2.0); /* * Nose. */ Graphics_setGrey (graphics, 0.5); {// scope double x [3] = { -0.08, 0.0, 0.08 }, y [3] = { 0.99, 1.18, 0.99 }; Graphics_fillArea (graphics, 3, x, y); } Graphics_setColour (graphics, Graphics_BLACK); Graphics_line (graphics, -0.08, 0.99, 0.0, 1.18); Graphics_line (graphics, 0.08, 0.99, 0.0, 1.18); /* * Ears. */ Graphics_setGrey (graphics, 0.5); Graphics_fillRectangle (graphics, -1.09, -1.00, -0.08, 0.08); Graphics_fillRectangle (graphics, 1.09, 1.00, -0.08, 0.08); Graphics_setColour (graphics, Graphics_BLACK); Graphics_line (graphics, -0.99, 0.08, -1.09, 0.08); Graphics_line (graphics, -1.09, 0.08, -1.09, -0.08); Graphics_line (graphics, -1.09, -0.08, -0.99, -0.08); Graphics_line (graphics, 0.99, 0.08, 1.09, 0.08); Graphics_line (graphics, 1.09, 0.08, 1.09, -0.08); Graphics_line (graphics, 1.09, -0.08, 0.99, -0.08); /* * Scalp. */ Graphics_ellipse (graphics, -1.0, 1.0, -1.0, 1.0); Graphics_setLineWidth (graphics, 1.0); Graphics_unsetInner (graphics); if (garnish) { autoNUMmatrix <double> legend (1, n, 1, 2); for (long irow = 1; irow <= n; irow ++) { for (long icol = 1; icol <= 2; icol ++) { legend [irow] [icol] = (irow - 1) / (n - 1.0); } } Graphics_image (graphics, legend.peek(), 1, 2, 0.78, 0.98, 1, n, -0.8, +0.8, 0.0, 1.0); Graphics_rectangle (graphics, 0.78, 0.98, -0.8, +0.8); Graphics_setTextAlignment (graphics, Graphics_RIGHT, Graphics_TOP); Graphics_text2 (graphics, 1.0, -0.8, Melder_double (vmin * 1e6), L" \\muV"); Graphics_setTextAlignment (graphics, Graphics_RIGHT, Graphics_BOTTOM); Graphics_text2 (graphics, 1.0, +0.8, Melder_double (vmax * 1e6), L" \\muV"); } }
void Sampled_getMaximumAndX (Sampled me, double xmin, double xmax, long ilevel, int unit, int interpolate, double *return_maximum, double *return_xOfMaximum) { long imin, imax, i; double maximum = -1e301, xOfMaximum = 0.0; if (xmin == NUMundefined || xmax == NUMundefined) { maximum = xOfMaximum = NUMundefined; goto end; } Function_unidirectionalAutowindow (me, & xmin, & xmax); if (! Function_intersectRangeWithDomain (me, & xmin, & xmax)) { maximum = xOfMaximum = NUMundefined; // requested range and logical domain do not intersect goto end; } if (! Sampled_getWindowSamples (me, xmin, xmax, & imin, & imax)) { /* * No sample centres between tmin and tmax. * Try to return the greater of the values at these two points. */ double fleft = Sampled_getValueAtX (me, xmin, ilevel, unit, interpolate); double fright = Sampled_getValueAtX (me, xmax, ilevel, unit, interpolate); if (NUMdefined (fleft) && fleft > maximum) maximum = fleft, xOfMaximum = xmin; if (NUMdefined (fright) && fright > maximum) maximum = fright, xOfMaximum = xmax; } else { for (i = imin; i <= imax; i ++) { double fmid = my v_getValueAtSample (i, ilevel, unit); if (fmid == NUMundefined) continue; if (interpolate == FALSE) { if (fmid > maximum) maximum = fmid, xOfMaximum = i; } else { /* * Try an interpolation, possibly even taking into account a sample just outside the selection. */ double fleft = i <= 1 ? NUMundefined : my v_getValueAtSample (i - 1, ilevel, unit); double fright = i >= my nx ? NUMundefined : my v_getValueAtSample (i + 1, ilevel, unit); if (fleft == NUMundefined || fright == NUMundefined) { if (fmid > maximum) maximum = fmid, xOfMaximum = i; } else if (fmid > fleft && fmid >= fright) { double y [4], i_real, localMaximum; y [1] = fleft, y [2] = fmid, y [3] = fright; localMaximum = NUMimproveMaximum (y, 3, 2, NUM_PEAK_INTERPOLATE_PARABOLIC, & i_real); if (localMaximum > maximum) maximum = localMaximum, xOfMaximum = i_real + i - 2; } } } xOfMaximum = my x1 + (xOfMaximum - 1) * my dx; /* From index plus phase to time. */ /* Check boundary values. */ if (interpolate) { double fleft = Sampled_getValueAtX (me, xmin, ilevel, unit, TRUE); double fright = Sampled_getValueAtX (me, xmax, ilevel, unit, TRUE); if (NUMdefined (fleft) && fleft > maximum) maximum = fleft, xOfMaximum = xmin; if (NUMdefined (fright) && fright > maximum) maximum = fright, xOfMaximum = xmax; } if (xOfMaximum < xmin) xOfMaximum = xmin; if (xOfMaximum > xmax) xOfMaximum = xmax; } if (maximum == -1e301) maximum = xOfMaximum = NUMundefined; end: if (return_maximum) *return_maximum = maximum; if (return_xOfMaximum) *return_xOfMaximum = xOfMaximum; }
double Formant_getValueAtTime (Formant me, int iformant, double time, int bark) { return Sampled_getValueAtX (me, time, iformant << 1, bark, true); }