vibrato

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值