⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 makevowel.m

📁 IIR Filter Coefficient Quantization Example % written by DRB on 6-Dec-2004 for ECE3703 % % Looks
💻 M
字号:
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;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -