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