wolffd@0: function points=FMPoints(len, freq, fmFreq, fmAmp, fs) wolffd@0: % points=FMPoints(len, freq, fmFreq, fmAmp, fs) wolffd@0: % Generates (fractional) sample locations for frequency-modulated impulses wolffd@0: % len = number of samples wolffd@0: % freq = pitch frequency (Hz) wolffd@0: % fmFreq = vibrato frequency (Hz) (defaults to 6 Hz) wolffd@0: % fmAmp = max change in pitch (defaults to 5% of freq) wolffd@0: % fs = sample frequency (defaults to 22254.545454 samples/s) wolffd@0: % wolffd@0: % Basic formula: phase angle = 2*pi*freq*t + (fmAmp/fmFreq)*sin(2*pi*fmFreq*t) wolffd@0: % k-th zero crossing approximately at sample number wolffd@0: % (fs/freq)*(k - (fmAmp/(2*pi*fmFreq))*sin(2*pi*k*(fmFreq/freq))) wolffd@0: wolffd@0: % (c) 1998 Interval Research Corporation wolffd@0: wolffd@0: if nargin<2, wolffd@0: fprintf('Format: sig=fmPoints(len, freq [, fmAmp, fmFreq, sampleRate])\n'); wolffd@0: return; wolffd@0: end; wolffd@0: if nargin<5, wolffd@0: fs=22254.545454; wolffd@0: end; wolffd@0: if nargin<4, wolffd@0: fmAmp=0.05*freq; wolffd@0: end; wolffd@0: if nargin<3, wolffd@0: fmFreq=6; wolffd@0: end; wolffd@0: wolffd@0: kmax=fix(freq*(len/fs)); wolffd@0: points=0:kmax-1; wolffd@0: points=1+(fs/freq)*(points-(fmAmp/(2*pi*fmFreq))* ... wolffd@0: sin(2*pi*(fmFreq/freq)*points));