Mercurial > hg > camir-aes2014
diff toolboxes/MIRtoolbox1.3.2/AuditoryToolbox/MakeVowel.m @ 0:e9a9cd732c1e tip
first hg version after svn
author | wolffd |
---|---|
date | Tue, 10 Feb 2015 15:05:51 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/toolboxes/MIRtoolbox1.3.2/AuditoryToolbox/MakeVowel.m Tue Feb 10 15:05:51 2015 +0000 @@ -0,0 +1,130 @@ +function y=MakeVowel(len, pitch, sampleRate, f1, f2, f3) +% MakeVowel(len, pitch [, sampleRate, f1, f2, f3]) - Make a vowel with +% "len" samples and the given pitch. The sample rate defaults to +% be 22254.545454 Hz (the native Mactinosh Sampling Rate). The +% formant frequencies are f1, f2 & f3. Some common vowels are +% Vowel f1 f2 f3 +% /a/ 730 1090 2440 +% /i/ 270 2290 3010 +% /u/ 300 870 2240 +% +% The pitch variable can either be a scalar indicating the actual +% pitch frequency, or an array of impulse locations. Using an +% array of impulses allows this routine to compute vowels with +% varying pitch. +% +% Alternatively, f1 can be replaced with one of the following strings +% 'a', 'i', 'u' and the appropriate formant frequencies are +% automatically selected. +% Modified by R. Duda, 3/13/94 + +% (c) 1998 Interval Research Corporation + +if nargin < 2, + fprintf('Format: y = MakeVowel(len, pitch [, sampleRate, f1, f2, f3])\n'); + return; +end; + +if nargin < 6; f3 = 0; end; +if nargin < 5; f2 = 0; end; +if nargin < 4, + f1 = 0; +else + if isstr(f1) + if f1 == 'a' | f1 == '/a/' + f1=730; f2=1090; f3=2440; + elseif f1 == 'i' | f1 == '/i/' + f1=270; f2=2290; f3=3010; + elseif f1 == 'u' | f1 == '/u/' + f1=300; f2=870; f3=2240; + end + end; +end; + +if nargin < 3, + sampleRate = 22254.545454; +elseif sampleRate < 1000, % Apparently for test purposes + sampleRate = 22254.545454; +end; + +% GlottalPulses(pitch, fs, len) - Generate a stream of +% glottal pulses with the given pitch (in Hz) and sampling +% frequency (sampleRate). A vector of the requested length is returned. +y=zeros(1,len); +if length(pitch) > 1, % If true, use to determine points + points=pitch; % Check for valid sequence of points + if any(points~=sort(points)), + error('Values in pitch array must be in ascending order.') + end; + if points(1) < 1, + error('Values in pitch array cannot be less than 1.'); + end; + kmax=sum(points <= len); + if kmax == 0, + error('All values in pitch array exceed "len"; none should.'); + elseif kmax < length(points), + fprintf('Some values in pitch array exceed "len"; truncating.\n'); + points=points(1:kmax); + end; +else + points=1:sampleRate/pitch:len; +end; +indices=floor(points); + +% Use a triangular approximation to an impulse function. The important +% part is to keep the total amplitude the same. +y(indices) = (indices+1)-points; +y(indices+1) = points-indices; + +% GlottalFilter(x,fs) - Filter an impulse train and simulate the glottal +% transfer function. The sampling interval (sampleRate) is given in Hz. +% The filtering performed by this function is two first-order filters +% at 250Hz. +a = exp(-250*2*pi/sampleRate); +%y=filter([1,0,-1],[1,-2*a,a*a],y); % Not as good as one below.... +y=filter([1],[1,0,-a*a],y); + +% FormantFilter(input, f, fs) - Filter an input sequence to model one +% formant in a speech signal. The formant frequency (in Hz) is given +% by f and the bandwidth of the formant is a constant 50Hz. The +% sampling frequency in Hz is given by fs. +if f1 > 0 + cft = f1/sampleRate; + bw = 50; + q = f1/bw; + rho = exp(-pi * cft / q); + theta = 2 * pi * cft * sqrt(1-1/(4 * q*q)); + a2 = -2*rho*cos(theta); + a3 = rho*rho; + y=filter([1+a2+a3],[1,a2,a3],y); +end; + +% FormantFilter(input, f, fs) - Filter an input sequence to model one +% formant in a speech signal. The formant frequency (in Hz) is given +% by f and the bandwidth of the formant is a constant 50Hz. The +% sampling frequency in Hz is given by fs. +if f2 > 0 + cft = f2/sampleRate; + bw = 50; + q = f2/bw; + rho = exp(-pi * cft / q); + theta = 2 * pi * cft * sqrt(1-1/(4 * q*q)); + a2 = -2*rho*cos(theta); + a3 = rho*rho; + y=filter([1+a2+a3],[1,a2,a3],y); +end; + +% FormantFilter(input, f, fs) - Filter an input sequence to model one +% formant in a speech signal. The formant frequency (in Hz) is given +% by f and the bandwidth of the formant is a constant 50Hz. The +% sampling frequency in Hz is given by fs. +if f3 > 0 + cft = f3/sampleRate; + bw = 50; + q = f3/bw; + rho = exp(-pi * cft / q); + theta = 2 * pi * cft * sqrt(1-1/(4 * q*q)); + a2 = -2*rho*cos(theta); + a3 = rho*rho; + y=filter([1+a2+a3],[1,a2,a3],y); +end;