void Matrix_drawSliceY (Matrix me, Graphics g, double x, double ymin, double ymax, double min, double max) { if (x < my xmin || x > my xmax) { return; } long ix = Matrix_xToNearestColumn (me, x); if (ymax <= ymin) { ymin = my ymin; ymax = my ymax; } long iymin, iymax; long ny = Matrix_getWindowSamplesY (me, ymin, ymax, &iymin, &iymax); if (ny < 1) { return; } if (max <= min) { Matrix_getWindowExtrema (me, ix, ix, iymin, iymax, &min, &max); } if (max <= min) { min -= 0.5; max += 0.5; } autoNUMvector<double> y (iymin, iymax); Graphics_setWindow (g, ymin, ymax, min, max); Graphics_setInner (g); for (long i = iymin; i <= iymax; i++) { y[i] = my z[i][ix]; } Graphics_function (g, y.peek(), iymin, iymax, Matrix_rowToY (me, iymin), Matrix_rowToY (me, iymax)); Graphics_unsetInner (g); }
void FilterBank_paint (FilterBank me, Graphics g, double xmin, double xmax, double ymin, double ymax, double minimum, double maximum, int garnish) { if (xmax <= xmin) { xmin = my xmin; xmax = my xmax; } if (ymax <= ymin) { ymin = my ymin; ymax = my ymax; } long ixmin, ixmax, iymin, iymax; (void) Matrix_getWindowSamplesX (me, xmin - 0.49999 * my dx, xmax + 0.49999 * my dx, &ixmin, &ixmax); (void) Matrix_getWindowSamplesY (me, ymin - 0.49999 * my dy, ymax + 0.49999 * my dy, &iymin, &iymax); if (maximum <= minimum) { (void) Matrix_getWindowExtrema (me, ixmin, ixmax, iymin, iymax, &minimum, &maximum); } if (maximum <= minimum) { minimum -= 1.0; maximum += 1.0; } if (xmin >= xmax || ymin >= ymax) { return; } Graphics_setInner (g); Graphics_setWindow (g, xmin, xmax, ymin, ymax); Graphics_image (g, my z, ixmin, ixmax, Sampled_indexToX (me, ixmin - 0.5), Sampled_indexToX (me, ixmax + 0.5), iymin, iymax, SampledXY_indexToY (me, iymin - 0.5), SampledXY_indexToY (me, iymax + 0.5), minimum, maximum); Graphics_unsetInner (g); if (garnish) { Graphics_drawInnerBox (g); Graphics_marksLeft (g, 2, 1, 1, 0); Graphics_textLeft (g, 1, GetFreqScaleText (my v_getFrequencyScale ())); Graphics_marksBottom (g, 2, 1, 1, 0); Graphics_textBottom (g, 1, U"Time (s)"); } }
double Matrix_getStandardDeviation (Matrix me, double xmin, double xmax, double ymin, double ymax) { if (xmax <= xmin) { xmin = my xmin; xmax = my xmax; } if (ymax <= ymin) { ymin = my ymin; ymax = my ymax; } long ixmin, ixmax, iymin, iymax; if ((Matrix_getWindowSamplesX (me, xmin, xmax, & ixmin, & ixmax) == 0) || (Matrix_getWindowSamplesY (me, ymin, ymax, & iymin, & iymax) == 0)) { return NUMundefined; } long nx = ixmax - ixmin + 1, ny = iymax - iymin + 1; if (nx == 1 && ny == 1) { return NUMundefined; } double mean = Matrix_getMean (me, xmin, xmax, ymin, ymax), sum = 0; for (long row = iymin; row <= iymax; row++) { for (long col = ixmin; col <= ixmax; col++) { double val = my z[row][col] - mean; sum += val * val; } } return sqrt (sum / (nx * ny - 1)); }
static void cellArrayOrImage (Matrix me, Graphics g, double xmin, double xmax, double ymin, double ymax, double minimum, double maximum, bool interpolate) { if (xmax <= xmin) { xmin = my xmin; xmax = my xmax; } if (ymax <= ymin) { ymin = my ymin; ymax = my ymax; } long ixmin, ixmax, iymin, iymax; (void) Matrix_getWindowSamplesX (me, xmin - 0.49999 * my dx, xmax + 0.49999 * my dx, & ixmin, & ixmax); (void) Matrix_getWindowSamplesY (me, ymin - 0.49999 * my dy, ymax + 0.49999 * my dy, & iymin, & iymax); if (maximum <= minimum) (void) Matrix_getWindowExtrema (me, ixmin, ixmax, iymin, iymax, & minimum, & maximum); if (maximum <= minimum) { minimum -= 1.0; maximum += 1.0; } if (xmin >= xmax || ymin >= ymax) return; Graphics_setInner (g); Graphics_setWindow (g, xmin, xmax, ymin, ymax); if (interpolate) Graphics_image (g, my z, ixmin, ixmax, Sampled_indexToX (me, ixmin - 0.5), Sampled_indexToX (me, ixmax + 0.5), iymin, iymax, SampledXY_indexToY (me, iymin - 0.5), SampledXY_indexToY (me, iymax + 0.5), minimum, maximum); else Graphics_cellArray (g, my z, ixmin, ixmax, Sampled_indexToX (me, ixmin - 0.5), Sampled_indexToX (me, ixmax + 0.5), iymin, iymax, SampledXY_indexToY (me, iymin - 0.5), SampledXY_indexToY (me, iymax + 0.5), minimum, maximum); Graphics_rectangle (g, xmin, xmax, ymin, ymax); Graphics_unsetInner (g); }
void PowerCepstrogram_paint (PowerCepstrogram me, Graphics g, double tmin, double tmax, double qmin, double qmax, double dBmaximum, int autoscaling, double dynamicRangedB, double dynamicCompression, int garnish) { if (tmax <= tmin) { tmin = my xmin; tmax = my xmax; } if (qmax <= qmin) { qmin = my ymin; qmax = my ymax; } long itmin, itmax, ifmin, ifmax; if (! Matrix_getWindowSamplesX (me, tmin - 0.49999 * my dx, tmax + 0.49999 * my dx, & itmin, & itmax) || ! Matrix_getWindowSamplesY (me, qmin - 0.49999 * my dy, qmax + 0.49999 * my dy, & ifmin, & ifmax)) { return; } autoMatrix thee = Data_copy (me); double min = 1e308, max = -min; for (long i = 1; i <= my ny; i++) { for (long j = 1; j <= my nx; j++) { double val = TO10LOG (my z[i][j]); min = val < min ? val : min; max = val > max ? val : max; thy z[i][j] = val; } } double dBminimum = dBmaximum - dynamicRangedB; if (autoscaling) { dBminimum = min; dBmaximum = max; } for (long j = 1; j <= my nx; j++) { double lmax = thy z[1][j]; for (long i = 2; i <= my ny; i++) { if (thy z[i][j] > lmax) { lmax = thy z[i][j]; } } double factor = dynamicCompression * (max - lmax); for (long i = 1; i <= my ny; i++) { thy z[i][j] += factor; } } Graphics_setInner (g); Graphics_setWindow (g, tmin, tmax, qmin, qmax); Graphics_image (g, thy z, itmin, itmax, Matrix_columnToX (thee.get(), itmin - 0.5), Matrix_columnToX (thee.get(), itmax + 0.5), ifmin, ifmax, Matrix_rowToY (thee.get(), ifmin - 0.5), Matrix_rowToY (thee.get(), ifmax + 0.5), dBminimum, dBmaximum); Graphics_unsetInner (g); if (garnish) { Graphics_drawInnerBox (g); Graphics_textBottom (g, true, U"Time (s)"); Graphics_marksBottom (g, 2, true, true, false); Graphics_marksLeft (g, 2, true, true, false); Graphics_textLeft (g, true, U"Quefrency (s)"); } }
void BandFilterSpectrogram_drawSpectrumAtNearestTimeSlice (BandFilterSpectrogram me, Graphics g, double time, double fmin, double fmax, double dBmin, double dBmax, int garnish) { if (time < my xmin || time > my xmax) { return; } if (fmin == 0 && fmax == 0) { // autoscaling fmin = my ymin; fmax = my ymax; } if (fmax <= fmin) { fmin = my ymin; fmax = my ymax; } long icol = Matrix_xToNearestColumn (me, time); icol = icol < 1 ? 1 : (icol > my nx ? my nx : icol); autoNUMvector<double> spectrum (1, my ny); for (long i = 1; i <= my ny; i++) { spectrum[i] = my v_getValueAtSample (icol, i, 1); // dB's } long iymin, iymax; if (Matrix_getWindowSamplesY (me, fmin, fmax, &iymin, &iymax) < 2) { // too few values return; } if (dBmin == dBmax) { // autoscaling dBmin = spectrum[iymin]; dBmax = dBmin; for (long i = iymin + 1; i <= iymax; i++) { if (spectrum[i] < dBmin) { dBmin = spectrum[i]; } else if (spectrum[i] > dBmax) { dBmax = spectrum[i]; } } if (dBmin == dBmax) { dBmin -= 1; dBmax += 1; } } Graphics_setWindow (g, fmin, fmax, dBmin, dBmax); Graphics_setInner (g); double x1 = my y1 + (iymin -1) * my dy, y1 = spectrum[iymin]; for (long i = iymin + 1; i <= iymax - 1; i++) { double x2 = my y1 + (i -1) * my dy, y2 = spectrum[i]; double xo1, yo1, xo2, yo2; if (NUMclipLineWithinRectangle (x1, y1, x2, y2, fmin, dBmin, fmax, dBmax, &xo1, &yo1, &xo2, &yo2)) { Graphics_line (g, xo1, yo1, xo2, yo2); } x1 = x2; y1 = y2; } Graphics_unsetInner (g); if (garnish) { Graphics_drawInnerBox (g); Graphics_marksBottom (g, 2, 1, 1, 0); Graphics_marksLeft (g, 2, 1, 1, 0); Graphics_textLeft (g, 1, U"Power (dB)"); Graphics_textBottom (g, 1, Melder_cat (U"Frequency (", my v_getFrequencyUnit (), U")")); } }
void Matrix_drawAsSquares (Matrix me, Graphics g, double xmin, double xmax, double ymin, double ymax, int garnish) { Graphics_Colour colour = Graphics_inqColour (g); long ixmin, ixmax, iymin, iymax; if (xmax <= xmin) { xmin = my xmin; xmax = my xmax; } long nx = Matrix_getWindowSamplesX (me, xmin, xmax, &ixmin, &ixmax); if (ymax <= ymin) { ymin = my ymin; ymax = my ymax; } long ny = Matrix_getWindowSamplesY (me, ymin, ymax, &iymin, &iymax); double min, max = nx > ny ? nx : ny; double dx = (xmax - xmin) / max, dy = (ymax - ymin) / max; Graphics_setInner (g); Graphics_setWindow (g, xmin, xmax, ymin, ymax); Matrix_getWindowExtrema (me, ixmin, ixmax, iymin, iymax, & min, & max); double wAbsMax = fabs (max) > fabs (min) ? fabs (max) : fabs (min); for (long i = iymin; i <= iymax; i++) { double y = Matrix_rowToY (me, i); for (long j = ixmin; j <= ixmax; j++) { double x = Matrix_columnToX (me, j); double d = 0.95 * sqrt (fabs (my z[i][j]) / wAbsMax); if (d > 0) { double x1WC = x - d * dx / 2, x2WC = x + d * dx / 2; double y1WC = y - d * dy / 2, y2WC = y + d * dy / 2; if (my z[i][j] > 0) { Graphics_setColour (g, Graphics_WHITE); } Graphics_fillRectangle (g, x1WC, x2WC, y1WC, y2WC); Graphics_setColour (g, colour); Graphics_rectangle (g, x1WC, x2WC , y1WC, y2WC); } } } Graphics_setGrey (g, 0.0); Graphics_unsetInner (g); if (garnish) { Graphics_drawInnerBox (g); Graphics_marksLeft (g, 2, true, true, false); if (ymin * ymax < 0.0) { Graphics_markLeft (g, 0.0, true, true, true, nullptr); } Graphics_marksBottom (g, 2, true, true, false); if (xmin * xmax < 0.0) { Graphics_markBottom (g, 0.0, true, true, true, nullptr); } } }
void Spectrogram_paintInside (Spectrogram me, Graphics g, double tmin, double tmax, double fmin, double fmax, double maximum, int autoscaling, double dynamic, double preemphasis, double dynamicCompression) { if (tmax <= tmin) { tmin = my xmin; tmax = my xmax; } if (fmax <= fmin) { fmin = my ymin; fmax = my ymax; } long itmin, itmax, ifmin, ifmax; if (! Matrix_getWindowSamplesX (me, tmin - 0.49999 * my dx, tmax + 0.49999 * my dx, & itmin, & itmax) || ! Matrix_getWindowSamplesY (me, fmin - 0.49999 * my dy, fmax + 0.49999 * my dy, & ifmin, & ifmax)) return; Graphics_setWindow (g, tmin, tmax, fmin, fmax); autoNUMvector <double> preemphasisFactor (ifmin, ifmax); autoNUMvector <double> dynamicFactor (itmin, itmax); /* Pre-emphasis in place; also compute maximum after pre-emphasis. */ for (long ifreq = ifmin; ifreq <= ifmax; ifreq ++) { preemphasisFactor [ifreq] = (preemphasis / NUMln2) * log (ifreq * my dy / 1000.0); for (long itime = itmin; itime <= itmax; itime ++) { double value = my z [ifreq] [itime]; /* Power. */ value = (10.0/NUMln10) * log ((value + 1e-30) / 4.0e-10) + preemphasisFactor [ifreq]; /* dB */ if (value > dynamicFactor [itime]) dynamicFactor [itime] = value; /* Local maximum. */ my z [ifreq] [itime] = value; } } /* Compute global maximum. */ if (autoscaling) { maximum = 0.0; for (long itime = itmin; itime <= itmax; itime ++) if (dynamicFactor [itime] > maximum) maximum = dynamicFactor [itime]; } /* Dynamic compression in place. */ for (long itime = itmin; itime <= itmax; itime ++) { dynamicFactor [itime] = dynamicCompression * (maximum - dynamicFactor [itime]); for (long ifreq = ifmin; ifreq <= ifmax; ifreq ++) my z [ifreq] [itime] += dynamicFactor [itime]; } Graphics_image (g, my z, itmin, itmax, Matrix_columnToX (me, itmin - 0.5), Matrix_columnToX (me, itmax + 0.5), ifmin, ifmax, Matrix_rowToY (me, ifmin - 0.5), Matrix_rowToY (me, ifmax + 0.5), maximum - dynamic, maximum); for (long ifreq = ifmin; ifreq <= ifmax; ifreq ++) for (long itime = itmin; itime <= itmax; itime ++) { double value = 4.0e-10 * exp ((my z [ifreq] [itime] - dynamicFactor [itime] - preemphasisFactor [ifreq]) * (NUMln10 / 10.0)) - 1e-30; my z [ifreq] [itime] = value > 0.0 ? value : 0.0; } }
void Matrix_paintSurface (Matrix me, Graphics g, double xmin, double xmax, double ymin, double ymax, double minimum, double maximum, double elevation, double azimuth) { if (xmax <= xmin) { xmin = my xmin; xmax = my xmax; } if (ymax <= ymin) { ymin = my ymin; ymax = my ymax; } long ixmin, ixmax, iymin, iymax; (void) Matrix_getWindowSamplesX (me, xmin, xmax, & ixmin, & ixmax); (void) Matrix_getWindowSamplesY (me, ymin, ymax, & iymin, & iymax); if (maximum <= minimum) (void) Matrix_getWindowExtrema (me, ixmin, ixmax, iymin, iymax, & minimum, & maximum); if (maximum <= minimum) { minimum -= 1.0; maximum += 1.0; } Graphics_setInner (g); Graphics_setWindow (g, -1.0, 1.0, minimum, maximum); Graphics_surface (g, my z, ixmin, ixmax, Matrix_columnToX (me, ixmin), Matrix_columnToX (me, ixmax), iymin, iymax, Matrix_rowToY (me, iymin), Matrix_rowToY (me, iymax), minimum, maximum, elevation, azimuth); Graphics_unsetInner (g); }
double Matrix_getMean (Matrix me, double xmin, double xmax, double ymin, double ymax) { if (xmax <= xmin) { xmin = my xmin; xmax = my xmax; } if (ymax <= ymin) { ymin = my ymin; ymax = my ymax; } long ixmin, ixmax, iymin, iymax; if ((Matrix_getWindowSamplesX (me, xmin, xmax, & ixmin, & ixmax) == 0) || (Matrix_getWindowSamplesY (me, ymin, ymax, & iymin, & iymax) == 0)) { return NUMundefined; } double sum = 0.0; for (long row = iymin; row <= iymax; row++) { for (long col = ixmin; col <= ixmax; col++) { sum += my z[row][col]; } } return sum / ((iymax - iymin + 1) * (ixmax - ixmin + 1)); }
void PowerCepstrogram_paint (PowerCepstrogram me, Graphics g, double tmin, double tmax, double qmin, double qmax, double dBminimum, double dBmaximum, int garnish) { if (tmax <= tmin) { tmin = my xmin; tmax = my xmax; } if (qmax <= qmin) { qmin = my ymin; qmax = my ymax; } long itmin, itmax, ifmin, ifmax; if (! Matrix_getWindowSamplesX (me, tmin - 0.49999 * my dx, tmax + 0.49999 * my dx, & itmin, & itmax) || ! Matrix_getWindowSamplesY (me, qmin - 0.49999 * my dy, qmax + 0.49999 * my dy, & ifmin, & ifmax)) { return; } autoMatrix thee = (Matrix) Data_copy (me); double min = 1e38, max = -min; for (long i = 1; i <= my ny; i++) { for (long j = 1; j <= my nx; j++) { double val = TO10LOG (my z[i][j]); min = val < min ? val : min; max = val > max ? val : max; thy z[i][j] = val; } } if (dBmaximum <= dBminimum) { dBminimum = min; dBmaximum = max; } Graphics_setInner (g); Graphics_setWindow (g, tmin, tmax, qmin, qmax); Graphics_image (g, thy z, itmin, itmax, Matrix_columnToX (thee.peek(), itmin - 0.5), Matrix_columnToX (thee.peek(), itmax + 0.5), ifmin, ifmax, Matrix_rowToY (thee.peek(), ifmin - 0.5), Matrix_rowToY (thee.peek(), ifmax + 0.5), dBminimum, dBmaximum); Graphics_unsetInner (g); if (garnish) { Graphics_drawInnerBox (g); Graphics_textBottom (g, 1, L"Time (s)"); Graphics_marksBottom (g, 2, 1, 1, 0); Graphics_marksLeft (g, 2, 1, 1, 0); Graphics_textLeft (g, 1, L"Quefrency (s)"); } }
void Matrix_drawOneContour (Matrix me, Graphics g, double xmin, double xmax, double ymin, double ymax, double height) { bool xreversed = xmin > xmax, yreversed = ymin > ymax; if (xmax == xmin) { xmin = my xmin; xmax = my xmax; } if (ymax == ymin) { ymin = my ymin; ymax = my ymax; } if (xreversed) { double temp = xmin; xmin = xmax; xmax = temp; } if (yreversed) { double temp = ymin; ymin = ymax; ymax = temp; } long ixmin, ixmax, iymin, iymax; (void) Matrix_getWindowSamplesX (me, xmin, xmax, & ixmin, & ixmax); (void) Matrix_getWindowSamplesY (me, ymin, ymax, & iymin, & iymax); if (xmin == xmax || ymin == ymax) return; Graphics_setInner (g); Graphics_setWindow (g, xreversed ? xmax : xmin, xreversed ? xmin : xmax, yreversed ? ymax : ymin, yreversed ? ymin : ymax); Graphics_contour (g, my z, ixmin, ixmax, Matrix_columnToX (me, ixmin), Matrix_columnToX (me, ixmax), iymin, iymax, Matrix_rowToY (me, iymin), Matrix_rowToY (me, iymax), height); Graphics_rectangle (g, xmin, xmax, ymin, ymax); Graphics_unsetInner (g); }
void Matrix_formula_part (Matrix me, double xmin, double xmax, double ymin, double ymax, const char32 *expression, Interpreter interpreter, Matrix target) { try { if (xmax <= xmin) { xmin = my xmin; xmax = my xmax; } if (ymax <= ymin) { ymin = my ymin; ymax = my ymax; } long ixmin, ixmax, iymin, iymax; (void) Matrix_getWindowSamplesX (me, xmin, xmax, & ixmin, & ixmax); (void) Matrix_getWindowSamplesY (me, ymin, ymax, & iymin, & iymax); struct Formula_Result result; Formula_compile (interpreter, me, expression, kFormula_EXPRESSION_TYPE_NUMERIC, true); if (! target) target = me; for (long irow = iymin; irow <= iymax; irow ++) { for (long icol = ixmin; icol <= ixmax; icol ++) { Formula_run (irow, icol, & result); target -> z [irow] [icol] = result. result.numericResult; } } } catch (MelderError) { Melder_throw (me, U": formula not completed."); } }
void Matrix_drawRows (Matrix me, Graphics g, double xmin, double xmax, double ymin, double ymax, double minimum, double maximum) { if (xmax <= xmin) { xmin = my xmin; xmax = my xmax; } if (ymax <= ymin) { ymin = my ymin; ymax = my ymax; } long ixmin, ixmax, iymin, iymax; (void) Matrix_getWindowSamplesX (me, xmin, xmax, & ixmin, & ixmax); (void) Matrix_getWindowSamplesY (me, ymin, ymax, & iymin, & iymax); if (maximum <= minimum) (void) Matrix_getWindowExtrema (me, ixmin, ixmax, iymin, iymax, & minimum, & maximum); if (maximum <= minimum) { minimum -= 1.0; maximum += 1.0; } if (xmin >= xmax) return; Graphics_setInner (g); for (long iy = iymin; iy <= iymax; iy ++) { Graphics_setWindow (g, xmin, xmax, minimum - (iy - iymin) * (maximum - minimum), maximum + (iymax - iy) * (maximum - minimum)); Graphics_function (g, my z [iy], ixmin, ixmax, Matrix_columnToX (me, ixmin), Matrix_columnToX (me, ixmax)); } Graphics_unsetInner (g); if (iymin < iymax) Graphics_setWindow (g, xmin, xmax, my y1 + (iymin - 1.5) * my dy, my y1 + (iymax - 0.5) * my dy); }
void BandFilterSpectrogram_paintImage (BandFilterSpectrogram me, Graphics g, double xmin, double xmax, double ymin, double ymax, double minimum, double maximum, int garnish) { if (xmax <= xmin) { xmin = my xmin; xmax = my xmax; } if (ymax <= ymin) { ymin = my ymin; ymax = my ymax; } long ixmin, ixmax, iymin, iymax; (void) Matrix_getWindowSamplesX (me, xmin - 0.49999 * my dx, xmax + 0.49999 * my dx, &ixmin, &ixmax); (void) Matrix_getWindowSamplesY (me, ymin - 0.49999 * my dy, ymax + 0.49999 * my dy, &iymin, &iymax); autoMatrix thee = Spectrogram_to_Matrix_dB ((Spectrogram) me, 4e-10, 10, -100); if (maximum <= minimum) { (void) Matrix_getWindowExtrema (thee.peek(), ixmin, ixmax, iymin, iymax, &minimum, &maximum); } if (maximum <= minimum) { minimum -= 1.0; maximum += 1.0; } if (xmin >= xmax || ymin >= ymax) { return; } Graphics_setInner (g); Graphics_setWindow (g, xmin, xmax, ymin, ymax); Graphics_image (g, thy z, ixmin, ixmax, Sampled_indexToX (thee.peek(), ixmin - 0.5), Sampled_indexToX (thee.peek(), ixmax + 0.5), iymin, iymax, SampledXY_indexToY (thee.peek(), iymin - 0.5), SampledXY_indexToY (thee.peek(), iymax + 0.5), minimum, maximum); Graphics_unsetInner (g); if (garnish) { Graphics_drawInnerBox (g); Graphics_marksLeft (g, 2, 1, 1, 0); Graphics_textLeft (g, 1, Melder_cat (U"Frequency (", my v_getFrequencyUnit (), U")")); Graphics_marksBottom (g, 2, 1, 1, 0); Graphics_textBottom (g, 1, U"Time (s)"); } }
void Matrix_paintContours (Matrix me, Graphics g, double xmin, double xmax, double ymin, double ymax, double minimum, double maximum) { double border [1 + 30]; if (xmax <= xmin) { xmin = my xmin; xmax = my xmax; } if (ymax <= ymin) { ymin = my ymin; ymax = my ymax; } long ixmin, ixmax, iymin, iymax, iborder; (void) Matrix_getWindowSamplesX (me, xmin, xmax, & ixmin, & ixmax); (void) Matrix_getWindowSamplesY (me, ymin, ymax, & iymin, & iymax); if (maximum <= minimum) (void) Matrix_getWindowExtrema (me, ixmin, ixmax, iymin, iymax, & minimum, & maximum); if (maximum <= minimum) { minimum -= 1.0; maximum += 1.0; } for (iborder = 1; iborder <= 30; iborder ++) border [iborder] = minimum + iborder * (maximum - minimum) / (30 + 1); if (xmin >= xmax || ymin >= ymax) return; Graphics_setInner (g); Graphics_setWindow (g, xmin, xmax, ymin, ymax); Graphics_grey (g, my z, ixmin, ixmax, Matrix_columnToX (me, ixmin), Matrix_columnToX (me, ixmax), iymin, iymax, Matrix_rowToY (me, iymin), Matrix_rowToY (me, iymax), 30, border); Graphics_rectangle (g, xmin, xmax, ymin, ymax); Graphics_unsetInner (g); }
void Formant_formula (Formant me, double tmin, double tmax, long formantmin, long formantmax, Interpreter interpreter, wchar_t *expression) { try { long numberOfPossibleFormants = my maxnFormants; if (tmax <= tmin) { tmin = my xmin; tmax = my xmax; } if (formantmax >= formantmin) { formantmin = 1; formantmax = numberOfPossibleFormants; } formantmin = formantmin < 1 ? 1 : formantmin; formantmax = formantmax > numberOfPossibleFormants ? numberOfPossibleFormants : formantmax; autoMatrix fb = Matrix_create (my xmin, my xmax, my nx, my dx, my x1, 1.0, 2 * numberOfPossibleFormants, 2 * numberOfPossibleFormants, 1.0, 1.0); for (long iframe = 1; iframe <= my nx; iframe ++) { Formant_Frame frame = & my d_frames [iframe]; int numberOfFormants = frame -> nFormants < numberOfPossibleFormants ? frame -> nFormants : numberOfPossibleFormants; for (long iformant = 1; iformant <= numberOfFormants; iformant++) { if (iformant <= frame -> nFormants) { fb -> z[2 * iformant - 1][iframe] = frame -> formant[iformant].frequency; fb -> z[2 * iformant ][iframe] = frame -> formant[iformant].bandwidth; } } } // Apply formula double ymin = 2 * formantmin - 1, ymax = 2 * formantmax; Matrix_formula_part (fb.peek(), tmin, tmax, ymin, ymax, expression, interpreter, NULL); // Put results back in Formant long ixmin, ixmax, iymin, iymax; (void) Matrix_getWindowSamplesX (fb.peek(), tmin, tmax, & ixmin, & ixmax); (void) Matrix_getWindowSamplesY (fb.peek(), ymin, ymax, & iymin, & iymax); for (long iframe = ixmin; iframe <= ixmax; iframe++) { // if some of the formant frequencies are set to zero => remove the formant Formant_Frame frame = & my d_frames [iframe]; int numberOfFormants = frame -> nFormants < formantmax ? frame -> nFormants : formantmax; int iformantto = formantmin > 1 ? formantmin - 1 : 0; for (long iformant = formantmin; iformant <= numberOfFormants; iformant++) { double frequency = fb -> z[2 * iformant - 1][iframe]; double bandWidth = fb -> z[2 * iformant ][iframe]; if (frequency > 0 && bandWidth > 0) { iformantto++; frame -> formant[iformantto].frequency = frequency; frame -> formant[iformantto].bandwidth = bandWidth; } else { frame -> formant[iformant].frequency = frame -> formant[iformant].bandwidth = 0; } } // shift the (higher) formants down if necessary. for (long iformant = formantmax + 1; iformant <= frame -> nFormants; iformant++) { double frequency = fb -> z[2 * iformant - 1][iframe]; double bandWidth = fb -> z[2 * iformant ][iframe]; if (frequency > 0 && bandWidth > 0) { iformantto++; frame -> formant[iformantto].frequency = frequency; frame -> formant[iformantto].bandwidth = bandWidth; } else { frame -> formant[iformant].frequency = frame -> formant[iformant].bandwidth = 0; } } frame -> nFormants = iformantto; } } catch (MelderError) { Melder_throw (me, ": not filtered."); } }
void Matrix_drawDistribution (Matrix me, Graphics g, double xmin, double xmax, double ymin, double ymax, double minimum, double maximum, long nBins, double freqMin, double freqMax, bool cumulative, bool garnish) { if (nBins <= 0) { return; } if (xmax <= xmin) { xmin = my xmin; xmax = my xmax; } if (ymax <= ymin) { ymin = my ymin; ymax = my ymax; } long ixmin, ixmax, iymin, iymax; if ((Matrix_getWindowSamplesX (me, xmin, xmax, & ixmin, & ixmax) == 0) || (Matrix_getWindowSamplesY (me, ymin, ymax, & iymin, & iymax) == 0)) { return; } if (maximum <= minimum) { Matrix_getWindowExtrema (me, ixmin, ixmax, iymin, iymax, & minimum, & maximum); } if (maximum <= minimum) { minimum -= 1.0; maximum += 1.0; } // Count the numbers per bin and the total if (nBins < 1) { nBins = 10; } autoNUMvector<long> freq (1, nBins); double binWidth = (maximum - minimum) / nBins; long nxy = 0; for (long i = iymin; i <= iymax; i++) { for (long j = ixmin; j <= ixmax; j++) { long bin = 1 + (long) floor ( (my z[i][j] - minimum) / binWidth); if (bin <= nBins && bin > 0) { freq[bin]++; nxy ++; } } } if (freqMax <= freqMin) { if (cumulative) { freqMin = 0; freqMax = 1.0; } else { NUMvector_extrema (freq.peek(), 1, nBins, & freqMin, & freqMax); if (freqMax <= freqMin) { freqMin = freqMin > 1.0 ? freqMin - 1.0 : 0.0; freqMax += 1.0; } } } Graphics_setInner (g); Graphics_setWindow (g, minimum, maximum, freqMin, freqMax); double fi = 0.0; for (long i = 1; i <= nBins; i++) { double ftmp = freq[i]; fi = cumulative ? fi + freq[i] / nxy : freq[i]; ftmp = fi; if (ftmp > freqMax) { ftmp = freqMax; } if (ftmp > freqMin) { Graphics_rectangle (g, minimum + (i - 1) * binWidth, minimum + i * binWidth, freqMin, ftmp); } } Graphics_unsetInner (g); if (garnish) { Graphics_drawInnerBox (g); Graphics_marksBottom (g, 2, true, true, false); Graphics_marksLeft (g, 2, true, true, false); if (! cumulative) { Graphics_textLeft (g, true, U"Number/bin"); } } }