Commit 0eafc4b2 authored by Rafael Laboissière's avatar Rafael Laboissière
Browse files

New upstream version 6.0.43

parent 2563a726
Loading
Loading
Loading
Loading
+4 −5
Original line number Diff line number Diff line
@@ -636,8 +636,7 @@ autoEEG EEGs_concatenate (OrderedOf<structEEG>* me) {
			Melder_throw (U"Cannot concatenate zero EEG objects.");
		EEG first = my at [1];
		integer numberOfChannels = first -> numberOfChannels;
		autostring32vector channelNames;
		channelNames. copyFrom (first -> channelNames);
		autostring32vector channelNames = STRVECclone (first -> channelNames.get());
		for (integer ieeg = 2; ieeg <= my size; ieeg ++) {
			EEG other = my at [ieeg];
			if (other -> numberOfChannels != numberOfChannels)
@@ -672,7 +671,7 @@ autoEEG EEG_extractPart (EEG me, double tmin, double tmax, bool preserveTimes) {
	try {
		autoEEG thee = Thing_new (EEG);
		thy numberOfChannels = my numberOfChannels;
		thy channelNames. copyFrom (my channelNames);
		thy channelNames = STRVECclone (my channelNames.get());
		thy sound = Sound_extractPart (my sound.get(), tmin, tmax, kSound_windowShape::RECTANGULAR, 1.0, preserveTimes);
		thy textgrid = TextGrid_extractPart (my textgrid.get(), tmin, tmax, preserveTimes);
		thy xmin = thy textgrid -> xmin;
@@ -724,7 +723,7 @@ autoEEG EEG_MixingMatrix_to_EEG_unmix (EEG me, MixingMatrix you) {
	his sound = Sound_MixingMatrix_unmix (my sound.get(), you);
	his textgrid = Data_copy (my textgrid.get());
	his numberOfChannels = your numberOfColumns;
	his channelNames. copyFrom (your columnLabels);
	his channelNames = STRVECclone (your columnLabels.get());
	return him;
}

@@ -742,7 +741,7 @@ autoEEG EEG_MixingMatrix_to_EEG_mix (EEG me, MixingMatrix you) {
	his sound = Sound_MixingMatrix_mix (my sound.get(), you);
	his textgrid = Data_copy (my textgrid.get());
	his numberOfChannels = your numberOfRows;
	his channelNames. copyFrom (your rowLabels);
	his channelNames = STRVECclone (your rowLabels.get());
	return him;
}

+6 −7
Original line number Diff line number Diff line
@@ -47,10 +47,9 @@ Thing_implement (ERPTier, AnyTier, 0);

integer ERPTier_getChannelNumber (ERPTier me, conststring32 channelName) {
	for (integer ichan = 1; ichan <= my numberOfChannels; ichan ++) {
		if (Melder_equ (my channelNames [ichan].get(), channelName)) {
		if (Melder_equ (my channelNames [ichan].get(), channelName))
			return ichan;
	}
	}
	return 0;
}

@@ -71,7 +70,7 @@ static autoERPTier EEG_PointProcess_to_ERPTier (EEG me, PointProcess events, dou
		Function_init (thee.get(), fromTime, toTime);
		thy numberOfChannels = my numberOfChannels - EEG_getNumberOfExtraSensors (me);
		Melder_assert (thy numberOfChannels > 0);
		thy channelNames. copyFrom (my channelNames);
		thy channelNames = STRVECclone (my channelNames.get());
		integer numberOfEvents = events -> nt;
		double soundDuration = toTime - fromTime;
		double samplingPeriod = my sound -> dx;
@@ -246,7 +245,7 @@ autoERP ERPTier_extractERP (ERPTier me, integer eventNumber) {
				newChannel [isample] = oldChannel [isample];
			}
		}
		thy channelNames. copyFrom (my channelNames);
		thy channelNames = STRVECclone (my channelNames.get());
		return thee;
	} catch (MelderError) {
		Melder_throw (me, U": ERP not extracted.");
@@ -281,7 +280,7 @@ autoERP ERPTier_to_ERP_mean (ERPTier me) {
			}
		}
		Melder_assert (mean -> ny == my numberOfChannels);
		mean -> channelNames. copyFrom (my channelNames);
		mean -> channelNames = STRVECclone (my channelNames.get());
		return mean;
	} catch (MelderError) {
		Melder_throw (me, U": mean not computed.");
@@ -298,7 +297,7 @@ autoERPTier ERPTier_extractEventsWhereColumn_number (ERPTier me, Table table, in
		autoERPTier thee = Thing_new (ERPTier);
		Function_init (thee.get(), my xmin, my xmax);
		thy numberOfChannels = my numberOfChannels;
		thy channelNames. copyFrom (my channelNames);
		thy channelNames = STRVECclone (my channelNames.get());
		for (integer ievent = 1; ievent <= my points.size; ievent ++) {
			ERPPoint oldEvent = my points.at [ievent];
			TableRow row = table -> rows.at [ievent];
@@ -327,7 +326,7 @@ autoERPTier ERPTier_extractEventsWhereColumn_string (ERPTier me, Table table,
		autoERPTier thee = Thing_new (ERPTier);
		Function_init (thee.get(), my xmin, my xmax);
		thy numberOfChannels = my numberOfChannels;
		thy channelNames. copyFrom (my channelNames);
		thy channelNames = STRVECclone (my channelNames.get());
		for (integer ievent = 1; ievent <= my points.size; ievent ++) {
			ERPPoint oldEvent = my points.at [ievent];
			TableRow row = table -> rows.at [ievent];
+9 −8
Original line number Diff line number Diff line
@@ -246,8 +246,10 @@ static int Sound_into_LPC_Frame_marple (Sound me, LPC_Frame thee, double tol1, d
	}
	e0 *= 2.0;
	if (e0 == 0.0) {
		m = 0; thy gain *= 0.5; /* because e0 is twice the energy */
		thy nCoefficients = m; return 0; // warning no signal
		m = 0;
		thy gain *= 0.5; /* because e0 is twice the energy */
		thy nCoefficients = m;
		return 0; // warning no signal
	}
	double q1 = 1.0 / e0;
	double q2 = q1 * x [1], q = q1 * x [1] * x [1], w = q1 * x [n] * x [n];
@@ -370,7 +372,7 @@ end:

static autoLPC _Sound_to_LPC (Sound me, int predictionOrder, double analysisWidth, double dt, double preEmphasisFrequency, int method, double tol1, double tol2) {
	double t1, samplingFrequency = 1.0 / my dx;
	double windowDuration = 2 * analysisWidth; /* gaussian window */
	double windowDuration = 2.0 * analysisWidth; /* gaussian window */
	integer numberOfFrames, frameErrorCount = 0;
	Melder_require (Melder_roundDown (windowDuration / my dx) > predictionOrder, 
		U"Analysis window duration too short.\n For a prediction order of ", predictionOrder,
@@ -388,12 +390,12 @@ static autoLPC _Sound_to_LPC (Sound me, int predictionOrder, double analysisWidt

	autoMelderProgress progress (U"LPC analysis");

	if (preEmphasisFrequency < samplingFrequency / 2) {
	if (preEmphasisFrequency < samplingFrequency / 2.0) {
		Sound_preEmphasis (sound.get(), preEmphasisFrequency);
	}

	for (integer i = 1; i <= numberOfFrames; i ++) {
		LPC_Frame lpcframe = (LPC_Frame) & thy d_frames [i];
		LPC_Frame lpcframe = & thy d_frames [i];
		double t = Sampled_indexToX (thee.get(), i);
		LPC_Frame_init (lpcframe, predictionOrder);
		Sound_into_Sound (sound.get(), sframe.get(), t - windowDuration / 2);
@@ -416,10 +418,9 @@ static autoLPC _Sound_to_LPC (Sound me, int predictionOrder, double analysisWidt
				frameErrorCount ++;
			}
		}
		if ((i % 10) == 1) {
		if (i % 10 == 1)
			Melder_progress ( (double) i / numberOfFrames, U"LPC analysis of frame ", i, U" out of ", numberOfFrames, U".");
	}
	}
	return thee;
}

+35 −35
Original line number Diff line number Diff line
/* Artword.cpp
 *
 * Copyright (C) 1992-2009,2011,2015-2017 Paul Boersma
 * Copyright (C) 1992-2009,2011,2015-2018 Paul Boersma
 *
 * This code is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
@@ -49,10 +49,8 @@ autoArtword Artword_create (double totalTime) {

void Artword_setDefault (Artword me, kArt_muscle muscle) {
	ArtwordData f = & my data [(int) muscle];
	NUMvector_free <double> (f -> times, 1);
	NUMvector_free <double> (f -> targets, 1);
	f -> times = NUMvector <double> (1, 2);
	f -> targets = NUMvector <double> (1, 2);
	f -> times = VECzero (2);
	f -> targets = VECzero (2);
	f -> numberOfTargets = 2;
	f -> times [1] = 0.0;
	f -> targets [1] = 0.0;
@@ -61,49 +59,52 @@ void Artword_setDefault (Artword me, kArt_muscle muscle) {
	f -> _iTarget = 1;
}

static void ArtwordData_setTarget (ArtwordData me, double time, double target) {
	Melder_assert (my numberOfTargets >= 2);
	int32 insertionPosition = 1;   // should be able to go up to 32768
	while (insertionPosition <= my numberOfTargets && my times [insertionPosition] < time)
		insertionPosition ++;
	Melder_assert (insertionPosition <= my numberOfTargets);   // can never insert past totalTime
	if (my times [insertionPosition] != time) {
		if (my numberOfTargets == INT16_MAX)
			Melder_throw (U"An Artword cannot have more than ", INT16_MAX, U" targets.");
		my times.insert (insertionPosition);
		my targets.insert (insertionPosition);
		my numberOfTargets ++;   // maintain invariant
	}
	my targets [insertionPosition] = target;
	my times [insertionPosition] = time;
}

void Artword_setTarget (Artword me, kArt_muscle muscle, double time, double target) {
	try {
		Melder_assert ((int) muscle >= 1);
		Melder_assert ((int) muscle <= (int) kArt_muscle::MAX);
		Melder_assert (muscle <= kArt_muscle::MAX);
		ArtwordData f = & my data [(int) muscle];
		Melder_assert (f -> numberOfTargets >= 2);
		int32 insertionPosition = 1;   // should be able to go up to 32768
		if (time < 0.0) time = 0.0;
		if (time > my totalTime) time = my totalTime;
		while (insertionPosition <= f -> numberOfTargets && f -> times [insertionPosition] < time)
			insertionPosition ++;
		Melder_assert (insertionPosition <= f -> numberOfTargets);   // can never insert past totalTime
		if (f -> times [insertionPosition] != time) {
			if (f -> numberOfTargets == INT16_MAX)
				Melder_throw (U"An Artword cannot have more than ", INT16_MAX, U" targets.");
			integer numberOfTargets = f -> numberOfTargets;
			NUMvector_insert <double> (& f -> times, 1, & numberOfTargets, insertionPosition);
			numberOfTargets = f -> numberOfTargets;
			NUMvector_insert <double> (& f -> targets, 1, & numberOfTargets, insertionPosition);
			f -> numberOfTargets ++;
		}
		f -> targets [insertionPosition] = target;
		f -> times [insertionPosition] = time;
		ArtwordData_setTarget (& my data [(int) muscle], time, target);
	} catch (MelderError) {
		Melder_throw (me, U": target not set.");
	}
}

double Artword_getTarget (Artword me, kArt_muscle muscle, double time) {
	ArtwordData f = & my data [(int) muscle];
	double *times = f -> times, *targets = f -> targets;
	int16 targetNumber = f -> _iTarget;
static double ArtwordData_getTarget (ArtwordData me, double time) {
	int16 targetNumber = my _iTarget;
	if (! targetNumber) targetNumber = 1;
	while (time > times [targetNumber + 1] && targetNumber < f -> numberOfTargets - 1)
	while (time > my times [targetNumber + 1] && targetNumber < my numberOfTargets - 1)
		targetNumber ++;
	while (time < times [targetNumber] && targetNumber > 1)
	while (time < my times [targetNumber] && targetNumber > 1)
		targetNumber --;
	f -> _iTarget = targetNumber;
	Melder_assert (targetNumber > 0 && targetNumber < f -> numberOfTargets);
	return targets [targetNumber] + (time - times [targetNumber]) *
		(targets [targetNumber + 1] - targets [targetNumber]) /
		(times [targetNumber + 1] - times [targetNumber]);
	my _iTarget = targetNumber;
	Melder_assert (targetNumber > 0 && targetNumber < my numberOfTargets);
	return my targets [targetNumber] + (time - my times [targetNumber]) *
		(my targets [targetNumber + 1] - my targets [targetNumber]) /
		(my times [targetNumber + 1] - my times [targetNumber]);
}

double Artword_getTarget (Artword me, kArt_muscle muscle, double time) {
	return ArtwordData_getTarget (& my data [(int) muscle], time);
}

void Artword_removeTarget (Artword me, kArt_muscle muscle, int16 targetNumber) {
@@ -133,8 +134,7 @@ void Artword_intoArt (Artword me, Art art, double time) {
void Artword_draw (Artword me, Graphics g, kArt_muscle muscle, bool garnish) {
	int16 numberOfTargets = my data [(int) muscle]. numberOfTargets;
	if (numberOfTargets > 0) {
		autoNUMvector <double> x (1, numberOfTargets);
		autoNUMvector <double> y (1, numberOfTargets);
		auto x = VECraw (numberOfTargets), y = VECraw (numberOfTargets);
		Graphics_setInner (g);
		Graphics_setWindow (g, 0, my totalTime, -1.0, 1.0);
		for (int16 i = 1; i <= numberOfTargets; i ++) {
+3 −3
Original line number Diff line number Diff line
/* Artword_def.h
 *
 * Copyright (C) 1992-2005,2008,2009,2011,2015-2017 Paul Boersma
 * Copyright (C) 1992-2005,2008,2009,2011,2015-2018 Paul Boersma
 *
 * This code is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
@@ -21,8 +21,8 @@
oo_DEFINE_STRUCT (ArtwordData)

	oo_INT16 (numberOfTargets)
	oo_DOUBLE_VECTOR (targets, numberOfTargets)
	oo_DOUBLE_VECTOR (times, numberOfTargets)
	oo_VEC (targets, numberOfTargets)
	oo_VEC (times, numberOfTargets)

	#if oo_DECLARING
		oo_INT16 (_iTarget)
Loading