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 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")")); } }
Any Cochleagram_to_Excitation (I, double t) { iam (Cochleagram); long column = Matrix_xToNearestColumn (me, t), ifreq; Excitation thee; if (column < 1) column = 1; if (column > my nx) column = my nx; thee = Excitation_create (my dy, my ny); if (! thee) return NULL; for (ifreq = 1; ifreq <= my ny; ifreq ++) thy z [1] [ifreq] = my z [ifreq] [column]; return thee; }
autoExcitation Cochleagram_to_Excitation (Cochleagram me, double t) { try { long column = Matrix_xToNearestColumn (me, t); if (column < 1) column = 1; if (column > my nx) column = my nx; autoExcitation thee = Excitation_create (my dy, my ny); for (long ifreq = 1; ifreq <= my ny; ifreq ++) thy z [1] [ifreq] = my z [ifreq] [column]; return thee; } catch (MelderError) { Melder_throw (me, U": slice at time ", t, U" seconds not extracted to Excitation."); } }