1 /* Sound_PointProcess.cpp 2 * 3 * Copyright (C) 2010-2011,2015,2017 Paul Boersma 4 * 5 * This code is free software; you can redistribute it and/or modify 6 * it under the terms of the GNU General Public License as published by 7 * the Free Software Foundation; either version 2 of the License, or (at 8 * your option) any later version. 9 * 10 * This code is distributed in the hope that it will be useful, but 11 * WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 13 * See the GNU General Public License for more details. 14 * 15 * You should have received a copy of the GNU General Public License 16 * along with this work. If not, see <http://www.gnu.org/licenses/>. 17 */ 18 19 /* 20 * pb 2010/12/09 created 21 * pb 2011/06/08 C++ 22 */ 23 24 #include "Sound_PointProcess.h" 25 26 autoSound Sound_PointProcess_to_SoundEnsemble_correlate (Sound me, PointProcess thee, double fromLag, double toLag) { 27 try { 28 if (my ny > 1) 29 Melder_throw (U"Sound should be mono."); 30 integer numberOfPoints = thy nt; 31 double hisDuration = toLag - fromLag; 32 integer numberOfSamples = Melder_ifloor (hisDuration / my dx) + 1; 33 if (numberOfSamples < 1) 34 Melder_throw (U"Time window too short."); 35 double midTime = 0.5 * (fromLag + toLag); 36 double hisPhysicalDuration = numberOfSamples * my dx; 37 double firstTime = midTime - 0.5 * hisPhysicalDuration + 0.5 * my dx; // distribute the samples evenly over the time domain 38 autoSound him = Sound_create (numberOfPoints, fromLag, toLag, numberOfSamples, my dx, firstTime); 39 for (integer ipoint = 1; ipoint <= numberOfPoints; ipoint ++) { 40 double myTimeOfPoint = thy t [ipoint]; 41 double hisTimeOfPoint = 0.0; 42 double mySample = 1.0 + (myTimeOfPoint - my x1) / my dx; 43 double hisSample = 1.0 + (hisTimeOfPoint - his x1) / my dx; 44 integer sampleDifference = Melder_iround_tieDown (mySample - hisSample); 45 for (integer isample = 1; isample <= numberOfSamples; isample ++) { 46 integer jsample = isample + sampleDifference; 47 his z [ipoint] [isample] = jsample < 1 || jsample > my nx ? 0.0 : my z [1] [jsample]; 48 } 49 } 50 return him; 51 } catch (MelderError) { 52 Melder_throw (me, U" & ", thee, U": Sound ensemble not created."); 53 } 54 } 55 56 /* End of file Sound_PointProcess.cpp */ 57