the vibrato effect, which is produced by varying the time delay. I would like to refer the readers to U. Zolzer's book, i.e., Digital audio effects, specifically, page 75 to 76.
function y = vibrato(x, fs, freq, width)
basic_delay_t = width;
basic_delay = round(basic_delay_t * fs);
basic_width = round(width * fs);
if(basic_width > basic_delay)
error('delay greater than basic delay !!!');
return;
end
delays = (basic_delay + basic_width + 1) + 1 + 2;
delay_line = zeros(delays, 1);
dt = 1 / fs;
y = zeros(size(x));
yh = 0;
for n = 1:length(x) - 1
tap = 1 + basic_delay + basic_width * sin( 2 * pi * freq * n * dt);
m = floor(tap);
frac = tap - m;
delay_line = [x(n); delay_line(1:delays-1)];
%y(n) = delay_line(m+1)*frac + delay_line(m)*(1 - frac);
% first order interpolation
y(n) = first_interpol(delay_line, frac, m);
% y(n) = allpass_interpol(delay_line, frac, m, yh);
% yh = y(n);
% spline interpolation
% y(n) = third_interpol(delay_line, frac, m);
end
end
function y = first_interpol(delay_line, frac, m)
y = delay_line(m+1)*frac + delay_line(m)*(1 - frac);
end
function y = allpass_interpol(delay_line, frac, m, yh)
y = delay_line(m+1)*frac + delay_line(m)*(1-frac) ...
-(1-frac)*yh;
end
function y = third_interpol(delay_line, frac, m)
delay_line = [zeros(2, 1); delay_line];
m = m + 2;
y = delay_line(m+1) * frac^3 ...
+ delay_line(m) * ((1+frac)^3 - 4*frac^3)/6 ...
+ delay_line(m-1) * ((2-frac)^3 - 4*(1-frac)^3)/6 ...
+ delay_line(m-2) * (1-frac)^3/6;
end