本文整理汇总了C++中NUMdefined函数的典型用法代码示例。如果您正苦于以下问题:C++ NUMdefined函数的具体用法?C++ NUMdefined怎么用?C++ NUMdefined使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了NUMdefined函数的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。
示例1: menu_cb_addPointAtCursor
static void menu_cb_addPointAtCursor (RealTierEditor me, EDITOR_ARGS_DIRECT) {
if (NUMdefined (my v_minimumLegalValue ()) && my ycursor < my v_minimumLegalValue ())
Melder_throw (U"Cannot add a point below ", my v_minimumLegalValue (), my v_rightTickUnits (), U".");
if (NUMdefined (my v_maximumLegalValue ()) && my ycursor > my v_maximumLegalValue ())
Melder_throw (U"Cannot add a point above ", my v_maximumLegalValue (), my v_rightTickUnits (), U".");
Editor_save (me, U"Add point");
RealTier_addPoint ((RealTier) my data, 0.5 * (my d_startSelection + my d_endSelection), my ycursor);
RealTierEditor_updateScaling (me);
FunctionEditor_redraw (me);
Editor_broadcastDataChanged (me);
}
开发者ID:DsRQuicke,项目名称:praat,代码行数:11,代码来源:RealTierEditor.cpp
示例2: Sound_findExtremum
static double Sound_findExtremum (Sound me, double tmin, double tmax, int includeMaxima, int includeMinima) {
long imin = Sampled_xToLowIndex (me, tmin), imax = Sampled_xToHighIndex (me, tmax);
double iextremum;
Melder_assert (NUMdefined (tmin));
Melder_assert (NUMdefined (tmax));
if (imin < 1) imin = 1;
if (imax > my nx) imax = my nx;
iextremum = findExtremum_3 (my z [1], my ny > 1 ? my z [2] : NULL, imin - 1, imax - imin + 1, includeMaxima, includeMinima);
if (iextremum)
return my x1 + (imin - 1 + iextremum - 1) * my dx;
else
return (tmin + tmax) / 2;
}
开发者ID:alekstorm,项目名称:tala,代码行数:13,代码来源:Pitch_to_PointProcess.cpp
示例3: menu_cb_MoveCursorToZero
static void menu_cb_MoveCursorToZero (SoundEditor me, EDITOR_ARGS_DIRECT) {
double zero = Sound_getNearestZeroCrossing ((Sound) my data, 0.5 * (my d_startSelection + my d_endSelection), 1); // STEREO BUG
if (NUMdefined (zero)) {
my d_startSelection = my d_endSelection = zero;
FunctionEditor_marksChanged (me, true);
}
}
开发者ID:imieza,项目名称:praat,代码行数:7,代码来源:SoundEditor.cpp
示例4: Sound_getNearestZeroCrossing
int SoundEditor::menu_cb_MoveCursorToZero (EDITOR_ARGS) {
SoundEditor *editor = (SoundEditor *)editor_me;
double zero = Sound_getNearestZeroCrossing ((Sound) editor->_data, 0.5 * (editor->_startSelection + editor->_endSelection), 1); // STEREO BUG
if (NUMdefined (zero)) {
editor->_startSelection = editor->_endSelection = zero;
editor->marksChanged ();
}
return 1;
}
开发者ID:alekstorm,项目名称:tala,代码行数:9,代码来源:SoundEditor.cpp
示例5: PointProcess_isPeriod
static bool PointProcess_isPeriod (PointProcess me, long ileft, double minimumPeriod, double maximumPeriod, double maximumPeriodFactor) {
/*
* This function answers the question: is the interval from point 'ileft' to point 'ileft+1' a period?
*/
long iright = ileft + 1;
/*
* Period condition 1: both 'ileft' and 'iright' have to be within the point process.
*/
if (ileft < 1 || iright > my nt) {
return false;
} else {
/*
* Period condition 2: the interval has to be within the boundaries, if specified.
*/
if (minimumPeriod == maximumPeriod) {
return true; // all intervals count as periods, irrespective of absolute size and relative size
} else {
double interval = my t [iright] - my t [ileft];
if (interval <= 0.0 || interval < minimumPeriod || interval > maximumPeriod) {
return false;
} else if (! NUMdefined (maximumPeriodFactor) || maximumPeriodFactor < 1.0) {
return true;
} else {
/*
* Period condition 3: the interval cannot be too different from both of its neigbours, if any.
*/
double previousInterval = ileft <= 1 ? NUMundefined : my t [ileft] - my t [ileft - 1];
double nextInterval = iright >= my nt ? NUMundefined : my t [iright + 1] - my t [iright];
double previousIntervalFactor = NUMdefined (previousInterval) && previousInterval > 0.0 ? interval / previousInterval : NUMundefined;
double nextIntervalFactor = NUMdefined (nextInterval) && nextInterval > 0.0 ? interval / nextInterval : NUMundefined;
if (! NUMdefined (previousIntervalFactor) && ! NUMdefined (nextIntervalFactor)) {
return true; // no neighbours: this is a period
}
if (NUMdefined (previousIntervalFactor) && previousIntervalFactor > 0.0 && previousIntervalFactor < 1.0) {
previousIntervalFactor = 1.0 / previousIntervalFactor;
}
if (NUMdefined (nextIntervalFactor) && nextIntervalFactor > 0.0 && nextIntervalFactor < 1.0) {
nextIntervalFactor = 1.0 / nextIntervalFactor;
}
if (NUMdefined (previousIntervalFactor) && previousIntervalFactor > maximumPeriodFactor &&
NUMdefined (nextIntervalFactor) && nextIntervalFactor > maximumPeriodFactor)
{
return false;
}
}
}
}
return true;
}
开发者ID:READSEARCH,项目名称:praat,代码行数:49,代码来源:PointProcess.cpp
示例6: BandFilterSpectrogram_drawFrequencyScale
// xmin, xmax in hz versus bark/mel or lin
void BandFilterSpectrogram_drawFrequencyScale (BandFilterSpectrogram me, Graphics g, double xmin, double xmax, double ymin, double ymax, int garnish) {
if (xmin < 0 || xmax < 0 || ymin < 0 || ymax < 0) {
Melder_warning (U"Frequencies must be >= 0.");
return;
}
// scale is in hertz
if (xmin >= xmax) { // autoscaling
xmin = 0;
xmax = my v_frequencyToHertz (my ymax);
}
if (ymin >= ymax) { // autoscaling
ymin = my ymin;
ymax = my ymax;
}
long n = 2000;
Graphics_setInner (g);
Graphics_setWindow (g, xmin, xmax, ymin, ymax);
double dx = (xmax - xmin) / (n - 1);
double x1 = xmin, y1 = my v_hertzToFrequency (x1);
for (long i = 2; i <= n; i++) {
double x2 = x1 + dx, y2 = my v_hertzToFrequency (x2);
if (NUMdefined (y1) && NUMdefined (y2)) {
double xo1, yo1, xo2, yo2;
if (NUMclipLineWithinRectangle (x1, y1, x2, y2, xmin, ymin, xmax, ymax, &xo1, &yo1, &xo2, &yo2)) {
Graphics_line (g, xo1, yo1, xo2, yo2);
}
}
x1 = x2; y1 = y2;
}
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"Frequency (Hz)");
}
}
开发者ID:davideberdin,项目名称:praat,代码行数:45,代码来源:Spectrogram_extensions.cpp
示例7: menu_cb_MoveEtoZero
static void menu_cb_MoveEtoZero (SoundEditor me, EDITOR_ARGS_DIRECT) {
double zero = Sound_getNearestZeroCrossing ((Sound) my data, my d_endSelection, 1); // STEREO BUG
if (NUMdefined (zero)) {
my d_endSelection = zero;
if (my d_startSelection > my d_endSelection) {
double dummy = my d_startSelection;
my d_startSelection = my d_endSelection;
my d_endSelection = dummy;
}
FunctionEditor_marksChanged (me, true);
}
}
开发者ID:imieza,项目名称:praat,代码行数:12,代码来源:SoundEditor.cpp
示例8: PointProcess_Sound_to_AmplitudeTier_point
autoAmplitudeTier PointProcess_Sound_to_AmplitudeTier_point (PointProcess me, Sound thee) {
try {
long imin, imax, numberOfPeaks = PointProcess_getWindowPoints (me, my xmin, my xmax, & imin, & imax);
if (numberOfPeaks < 3) return nullptr;
autoAmplitudeTier him = AmplitudeTier_create (my xmin, my xmax);
for (long i = imin; i <= imax; i ++) {
double value = Vector_getValueAtX (thee, my t [i], Vector_CHANNEL_AVERAGE, Vector_VALUE_INTERPOLATION_SINC700);
if (NUMdefined (value)) RealTier_addPoint (him.peek(), my t [i], value);
}
return him;
} catch (MelderError) {
Melder_throw (me, U" & ", thee, U": not converted to AmplitudeTier.");
}
}
开发者ID:guilhermegarcia,项目名称:praat-1,代码行数:14,代码来源:AmplitudeTier.cpp
示例9: Sound_FormantGrid_filter_inline
void Sound_FormantGrid_filter_inline (Sound me, FormantGrid formantGrid) {
double dt = my dx;
if (formantGrid -> formants -> size && formantGrid -> bandwidths -> size)
for (long iformant = 1; iformant <= formantGrid -> formants -> size; iformant ++) {
RealTier formantTier = (RealTier) formantGrid -> formants -> item [iformant];
RealTier bandwidthTier = (RealTier) formantGrid -> bandwidths -> item [iformant];
for (long isamp = 1; isamp <= my nx; isamp ++) {
double t = my x1 + (isamp - 1) * my dx;
/*
* Compute LP coefficients.
*/
double formant, bandwidth;
formant = RealTier_getValueAtTime (formantTier, t);
bandwidth = RealTier_getValueAtTime (bandwidthTier, t);
if (NUMdefined (formant) && NUMdefined (bandwidth)) {
double cosomdt = cos (2 * NUMpi * formant * dt);
double r = exp (- NUMpi * bandwidth * dt);
/* Formants at 0 Hz or the Nyquist are single poles, others are double poles. */
if (fabs (cosomdt) > 0.999999) { /* Allow for round-off errors. */
/* single pole: D(z) = 1 - r z^-1 */
for (long channel = 1; channel <= my ny; channel ++) {
if (isamp > 1) my z [channel] [isamp] += r * my z [channel] [isamp - 1];
}
} else {
/* double pole: D(z) = 1 + p z^-1 + q z^-2 */
double p = - 2 * r * cosomdt;
double q = r * r;
for (long channel = 1; channel <= my ny; channel ++) {
if (isamp > 1) my z [channel] [isamp] -= p * my z [channel] [isamp - 1];
if (isamp > 2) my z [channel] [isamp] -= q * my z [channel] [isamp - 2];
}
}
}
}
}
}
开发者ID:georgiee,项目名称:lip-sync-lpc,代码行数:36,代码来源:FormantGrid.cpp
示例10: v_getValueAtSample
double structVector :: v_getValueAtSample (long isamp, long ilevel, int unit) {
// Preconditions:
// 1 <= isamp <= my nx
// 0 <= ilevel <= my ny
double value;
if (ilevel > Vector_CHANNEL_AVERAGE) {
value = z [ilevel] [isamp];
} else if (ny == 1) {
value = z [1] [isamp]; // optimization
} else if (ny == 2) {
value = 0.5 * (z [1] [isamp] + z [2] [isamp]); // optimization
} else {
double sum = 0.0;
for (long channel = 1; channel <= ny; channel ++) {
sum += z [channel] [isamp];
}
value = sum / ny;
}
return NUMdefined (value) ? v_convertStandardToSpecialUnit (value, ilevel, unit) : NUMundefined;
}
开发者ID:psibre,项目名称:praat,代码行数:20,代码来源:Vector.cpp
示例11: Sampled_getQuantile
double Sampled_getQuantile (I, double xmin, double xmax, double quantile, long ilevel, int unit) {
iam (Sampled);
long i, imin, imax, numberOfDefinedSamples = 0;
double *values = NUMdvector (1, my nx), result = NUMundefined;
iferror return NUMundefined;
Function_unidirectionalAutowindow (me, & xmin, & xmax);
if (! Function_intersectRangeWithDomain (me, & xmin, & xmax)) return NUMundefined;
Sampled_getWindowSamples (me, xmin, xmax, & imin, & imax);
for (i = imin; i <= imax; i ++) {
double value = our getValueAtSample (me, i, ilevel, unit);
if (NUMdefined (value)) {
values [++ numberOfDefinedSamples] = value;
}
}
if (numberOfDefinedSamples >= 1) {
NUMsort_d (numberOfDefinedSamples, values);
result = NUMquantile (numberOfDefinedSamples, values, quantile);
}
NUMdvector_free (values, 1);
return result;
}
开发者ID:alekstorm,项目名称:tala,代码行数:21,代码来源:Sampled.cpp
示例12: Pitch_Intensity_draw
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);
}
}
开发者ID:Crisil,项目名称:praat,代码行数:40,代码来源:Pitch_Intensity.cpp
示例13: Sampled_speckleInside
static void Sampled_speckleInside (Sampled me, Graphics g, double xmin, double xmax, double ymin, double ymax,
double speckle_mm, long ilevel, int unit)
{
Function_unidirectionalAutowindow (me, & xmin, & xmax);
long ixmin, ixmax;
Sampled_getWindowSamples (me, xmin, xmax, & ixmin, & ixmax);
if (Function_isUnitLogarithmic (me, ilevel, unit)) {
ymin = Function_convertStandardToSpecialUnit (me, ymin, ilevel, unit);
ymax = Function_convertStandardToSpecialUnit (me, ymax, ilevel, unit);
}
if (ymax <= ymin) return;
Graphics_setWindow (g, xmin, xmax, ymin, ymax);
for (long ix = ixmin; ix <= ixmax; ix ++) {
double value = Sampled_getValueAtSample (me, ix, ilevel, unit);
if (NUMdefined (value)) {
double x = Sampled_indexToX (me, ix);
if (value >= ymin && value <= ymax) {
Graphics_fillCircle_mm (g, x, value, speckle_mm);
}
}
}
}
开发者ID:arizona-phonological-imaging-lab,项目名称:ultrapraat,代码行数:22,代码来源:Sampled.cpp
示例14: Sampled_getQuantile
double Sampled_getQuantile (Sampled me, double xmin, double xmax, double quantile, long ilevel, int unit) {
try {
autoNUMvector <double> values (1, my nx);
Function_unidirectionalAutowindow (me, & xmin, & xmax);
if (! Function_intersectRangeWithDomain (me, & xmin, & xmax)) return NUMundefined;
long imin, imax, numberOfDefinedSamples = 0;
Sampled_getWindowSamples (me, xmin, xmax, & imin, & imax);
for (long i = imin; i <= imax; i ++) {
double value = my v_getValueAtSample (i, ilevel, unit);
if (NUMdefined (value)) {
values [++ numberOfDefinedSamples] = value;
}
}
double result = NUMundefined;
if (numberOfDefinedSamples >= 1) {
NUMsort_d (numberOfDefinedSamples, values.peek());
result = NUMquantile (numberOfDefinedSamples, values.peek(), quantile);
}
return result;
} catch (MelderError) {
Melder_throw (me, ": quantile not computed.");
}
}
开发者ID:arizona-phonological-imaging-lab,项目名称:ultrapraat,代码行数:23,代码来源:Sampled.cpp
示例15: PointProcess_Sound_to_AmplitudeTier_period
autoAmplitudeTier PointProcess_Sound_to_AmplitudeTier_period (PointProcess me, Sound thee, double tmin, double tmax,
double pmin, double pmax, double maximumPeriodFactor)
{
try {
if (tmax <= tmin) tmin = my xmin, tmax = my xmax;
long imin, imax;
long numberOfPeaks = PointProcess_getWindowPoints (me, tmin, tmax, & imin, & imax);
if (numberOfPeaks < 3) Melder_throw (U"Too few pulses between ", tmin, U" and ", tmax, U" seconds.");
autoAmplitudeTier him = AmplitudeTier_create (tmin, tmax);
for (long i = imin + 1; i < imax; i ++) {
double p1 = my t [i] - my t [i - 1], p2 = my t [i + 1] - my t [i];
double intervalFactor = p1 > p2 ? p1 / p2 : p2 / p1;
if (pmin == pmax || (p1 >= pmin && p1 <= pmax && p2 >= pmin && p2 <= pmax && intervalFactor <= maximumPeriodFactor)) {
double peak = Sound_getHannWindowedRms (thee, my t [i], 0.2 * p1, 0.2 * p2);
if (NUMdefined (peak) && peak > 0.0)
RealTier_addPoint (him.peek(), my t [i], peak);
}
}
return him;
} catch (MelderError) {
Melder_throw (me, U" & ", thee, U": not converted to AmplitudeTier.");
}
}
开发者ID:guilhermegarcia,项目名称:praat-1,代码行数:23,代码来源:AmplitudeTier.cpp
示例16: Sound_to_Intensity_
static autoIntensity Sound_to_Intensity_ (Sound me, double minimumPitch, double timeStep, int subtractMeanPressure) {
try {
/*
* Preconditions.
*/
if (! NUMdefined (minimumPitch)) Melder_throw (U"(Sound-to-Intensity:) Minimum pitch undefined.");
if (! NUMdefined (timeStep)) Melder_throw (U"(Sound-to-Intensity:) Time step undefined.");
if (timeStep < 0.0) Melder_throw (U"(Sound-to-Intensity:) Time step should be zero or positive instead of ", timeStep, U".");
if (my dx <= 0.0) Melder_throw (U"(Sound-to-Intensity:) The Sound's time step should be positive.");
if (minimumPitch <= 0.0) Melder_throw (U"(Sound-to-Intensity:) Minimum pitch should be positive.");
/*
* Defaults.
*/
if (timeStep == 0.0) timeStep = 0.8 / minimumPitch; // default: four times oversampling Hanning-wise
double windowDuration = 6.4 / minimumPitch;
Melder_assert (windowDuration > 0.0);
double halfWindowDuration = 0.5 * windowDuration;
long halfWindowSamples = (long) floor (halfWindowDuration / my dx);
autoNUMvector <double> amplitude (- halfWindowSamples, halfWindowSamples);
autoNUMvector <double> window (- halfWindowSamples, halfWindowSamples);
for (long i = - halfWindowSamples; i <= halfWindowSamples; i ++) {
double x = i * my dx / halfWindowDuration, root = 1 - x * x;
window [i] = root <= 0.0 ? 0.0 : NUMbessel_i0_f ((2 * NUMpi * NUMpi + 0.5) * sqrt (root));
}
long numberOfFrames;
double thyFirstTime;
try {
Sampled_shortTermAnalysis (me, windowDuration, timeStep, & numberOfFrames, & thyFirstTime);
} catch (MelderError) {
Melder_throw (U"The duration of the sound in an intensity analysis should be at least 6.4 divided by the minimum pitch (", minimumPitch, U" Hz), "
U"i.e. at least ", 6.4 / minimumPitch, U" s, instead of ", my xmax - my xmin, U" s.");
}
autoIntensity thee = Intensity_create (my xmin, my xmax, numberOfFrames, timeStep, thyFirstTime);
for (long iframe = 1; iframe <= numberOfFrames; iframe ++) {
double midTime = Sampled_indexToX (thee.peek(), iframe);
long midSample = Sampled_xToNearestIndex (me, midTime);
long leftSample = midSample - halfWindowSamples, rightSample = midSample + halfWindowSamples;
double sumxw = 0.0, sumw = 0.0, intensity;
if (leftSample < 1) leftSample = 1;
if (rightSample > my nx) rightSample = my nx;
for (long channel = 1; channel <= my ny; channel ++) {
for (long i = leftSample; i <= rightSample; i ++) {
amplitude [i - midSample] = my z [channel] [i];
}
if (subtractMeanPressure) {
double sum = 0.0;
for (long i = leftSample; i <= rightSample; i ++) {
sum += amplitude [i - midSample];
}
double mean = sum / (rightSample - leftSample + 1);
for (long i = leftSample; i <= rightSample; i ++) {
amplitude [i - midSample] -= mean;
}
}
for (long i = leftSample; i <= rightSample; i ++) {
sumxw += amplitude [i - midSample] * amplitude [i - midSample] * window [i - midSample];
sumw += window [i - midSample];
}
}
intensity = sumxw / sumw;
intensity /= 4e-10;
thy z [1] [iframe] = intensity < 1e-30 ? -300 : 10 * log10 (intensity);
}
return thee;
} catch (MelderError) {
Melder_throw (me, U": intensity analysis not performed.");
}
}
开发者ID:eginhard,项目名称:praat,代码行数:72,代码来源:Sound_to_Intensity.cpp
示例17: Sound_getPowerInAir
double Sound_getPowerInAir (Sound me) {
long n;
double sum2 = getSumOfSquares (me, 0, 0, & n);
return NUMdefined (sum2) ? sum2 / (n * my ny) / 400 : NUMundefined;
}
开发者ID:psibre,项目名称:praat,代码行数:5,代码来源:Sound.cpp
示例18: Sampled_getMaximumAndX
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;
}
开发者ID:arizona-phonological-imaging-lab,项目名称:ultrapraat,代码行数:62,代码来源:Sampled.cpp
示例19: TimeSoundEditor_drawSound
//.........这里部分代码省略.........
maximum = middle + 0.5 * maximumExtent;
}
} else {
minimum = visibleMinimum;
maximum = visibleMaximum;
}
} else if (my p_sound_scalingStrategy == kTimeSoundEditor_scalingStrategy_BY_WINDOW_AND_CHANNEL) {
if (longSound) {
LongSound_getWindowExtrema (longSound, my d_startWindow, my d_endWindow, ichan, & minimum, & maximum);
} else {
Matrix_getWindowExtrema (sound, first, last, ichan, ichan, & minimum, & maximum);
}
} else if (my p_sound_scalingStrategy == kTimeSoundEditor_scalingStrategy_FIXED_HEIGHT) {
if (longSound) {
LongSound_getWindowExtrema (longSound, my d_startWindow, my d_endWindow, ichan, & minimum, & maximum);
} else {
Matrix_getWindowExtrema (sound, first, last, ichan, ichan, & minimum, & maximum);
}
double channelExtent = my p_sound_scaling_height;
double middle = 0.5 * (minimum + maximum);
minimum = middle - 0.5 * channelExtent;
maximum = middle + 0.5 * channelExtent;
} else if (my p_sound_scalingStrategy == kTimeSoundEditor_scalingStrategy_FIXED_RANGE) {
minimum = my p_sound_scaling_minimum;
maximum = my p_sound_scaling_maximum;
}
if (minimum == maximum) { horizontal = true; minimum -= 1.0; maximum += 1.0;}
Graphics_setWindow (my d_graphics, my d_startWindow, my d_endWindow, minimum, maximum);
if (horizontal) {
Graphics_setTextAlignment (my d_graphics, Graphics_RIGHT, Graphics_HALF);
double mid = 0.5 * (minimum + maximum);
Graphics_text (my d_graphics, my d_startWindow, mid, Melder_float (Melder_half (mid)));
} else {
if (! cursorVisible || ! NUMdefined (cursorFunctionValue) || Graphics_dyWCtoMM (my d_graphics, cursorFunctionValue - minimum) > 5.0) {
Graphics_setTextAlignment (my d_graphics, Graphics_RIGHT, Graphics_BOTTOM);
Graphics_text (my d_graphics, my d_startWindow, minimum, Melder_float (Melder_half (minimum)));
}
if (! cursorVisible || ! NUMdefined (cursorFunctionValue) || Graphics_dyWCtoMM (my d_graphics, maximum - cursorFunctionValue) > 5.0) {
Graphics_setTextAlignment (my d_graphics, Graphics_RIGHT, Graphics_TOP);
Graphics_text (my d_graphics, my d_startWindow, maximum, Melder_float (Melder_half (maximum)));
}
}
if (minimum < 0 && maximum > 0 && ! horizontal) {
Graphics_setWindow (my d_graphics, 0, 1, minimum, maximum);
if (! cursorVisible || ! NUMdefined (cursorFunctionValue) || fabs (Graphics_dyWCtoMM (my d_graphics, cursorFunctionValue - 0.0)) > 3.0) {
Graphics_setTextAlignment (my d_graphics, Graphics_RIGHT, Graphics_HALF);
Graphics_text (my d_graphics, 0, 0, U"0");
}
Graphics_setColour (my d_graphics, Graphics_CYAN);
Graphics_setLineType (my d_graphics, Graphics_DOTTED);
Graphics_line (my d_graphics, 0, 0, 1, 0);
Graphics_setLineType (my d_graphics, Graphics_DRAWN);
}
/*
* Garnish the drawing area of each channel.
*/
Graphics_setWindow (my d_graphics, 0, 1, 0, 1);
Graphics_setColour (my d_graphics, Graphics_CYAN);
Graphics_innerRectangle (my d_graphics, 0, 1, 0, 1);
Graphics_setColour (my d_graphics, Graphics_BLACK);
if (nchan > 1) {
Graphics_setTextAlignment (my d_graphics, Graphics_LEFT, Graphics_HALF);
const char32 *channelName = my v_getChannelName (ichan);
static MelderString channelLabel;
MelderString_copy (& channelLabel, ( channelName ? U"ch" : U"Channel " ), ichan);
if (channelName)
开发者ID:motiz88,项目名称:praat,代码行数:67,代码来源:TimeSoundEditor.cpp
示例20: Sampled_drawInside
void Sampled_drawInside (Sampled me, Graphics g, double xmin, double xmax, double ymin, double ymax,
double speckle_mm, long ilevel, int unit)
{
try {
if (speckle_mm != 0.0) {
Sampled_speckleInside (me, g, xmin, xmax, ymin, ymax, speckle_mm, ilevel, unit);
return;
}
Function_unidirectionalAutowindow (me, & xmin, & xmax);
long ixmin, ixmax, startOfDefinedStretch = -1;
Sampled_getWindowSamples (me, xmin, xmax, & ixmin, & ixmax);
if (Function_isUnitLogarithmic (me, ilevel, unit)) {
ymin = Function_convertStandardToSpecialUnit (me, ymin, ilevel, unit);
ymax = Function_convertStandardToSpecialUnit (me, ymax, ilevel, unit);
}
if (ymax <= ymin) return;
Graphics_setWindow (g, xmin, xmax, ymin, ymax);
autoNUMvector <double> xarray (ixmin - 1, ixmax + 1);
autoNUMvector <double> yarray (ixmin - 1, ixmax + 1);
double previousValue = Sampled_getValueAtSample (me, ixmin - 1, ilevel, unit);
if (NUMdefined (previousValue)) {
startOfDefinedStretch = ixmin - 1;
xarray [ixmin - 1] = Sampled_indexToX (me, ixmin - 1);
yarray [ixmin - 1] = previousValue;
}
for (long ix = ixmin; ix <= ixmax; ix ++) {
double x = Sampled_indexToX (me, ix), value = Sampled_getValueAtSample (me, ix, ilevel, unit);
if (NUMdefined (value)) {
if (NUMdefined (previousValue)) {
xarray [ix] = x;
yarray [ix] = value;
} else {
startOfDefinedStretch = ix - 1;
xarray [ix - 1] = x - 0.5 * my dx;
yarray [ix - 1] = value;
xarray [ix] = x;
yarray [ix] = value;
}
} else if (NUMdefined (previousValue)) {
Melder_assert (startOfDefinedStretch >= ixmin - 1);
if (ix > ixmin) {
xarray [ix] = x - 0.5 * my dx;
yarray [ix] = previousValue;
if (xarray [startOfDefinedStretch] < xmin) {
double phase = (xmin - xarray [startOfDefinedStretch]) / my dx;
xarray [startOfDefinedStretch] = xmin;
yarray [startOfDefinedStretch] = phase * yarray [startOfDefinedStretch + 1] + (1.0 - phase) * yarray [startOfDefinedStretch];
}
Graphics_polyline (g, ix + 1 - startOfDefinedStretch, & xarray [startOfDefinedStretch], & yarray [startOfDefinedStretch]);
}
startOfDefinedStretch = -1;
}
previousValue = value;
}
if (startOfDefinedStretch > -1) {
double x = Sampled_indexToX (me, ixmax + 1), value = Sampled_getValueAtSample (me, ixmax + 1, ilevel, unit);
Melder_assert (NUMdefined (previousValue));
if (NUMdefined (value)) {
xarray [ixmax + 1] = x;
yarray [ixmax + 1] = value;
} else {
xarray [ixmax + 1] = x - 0.5 * my dx;
yarray [ixmax + 1] = previousValue;
}
if (xarray [startOfDefinedStretch] < xmin) {
double phase = (xmin - xarray [startOfDefinedStretch]) / my dx;
xarray [startOfDefinedStretch] = xmin;
yarray [startOfDefinedStretch] = phase * yarray [startOfDefinedStretch + 1] + (1.0 - phase) * yarray [startOfDefinedStretch];
}
if (xarray [ixmax + 1] > xmax) {
double phase = (xarray [ixmax + 1] - xmax) / my dx;
xarray [ixmax + 1] = xmax;
yarray [ixmax + 1] = phase * yarray [ixmax] + (1.0 - phase) * yarray [ixmax + 1];
}
Graphics_polyline (g, ixmax + 2 - startOfDefinedStretch, & xarray [startOfDefinedStretch], & yarray [startOfDefinedStretch]);
}
} catch (MelderError) {
Melder_clearError ();
}
}
开发者ID:arizona-phonological-imaging-lab,项目名称:ultrapraat,代码行数:80,代码来源:Sampled.cpp
注:本文中的NUMdefined函数示例由纯净天空整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。 |
请发表评论