音效处理Vibrato 简介

Posted 芥末的无奈

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了音效处理Vibrato 简介相关的知识,希望对你有一定的参考价值。

系列文章目录


文章目录


一、Vibrato 是什么

“vibrato” 一词指的是,在一个音的音高上小的、准周期性的变化。“vibrato” 一词在不同领域有着不同的翻译,例如在小提琴中,“vibrato” 意旨 “揉弦”,是一种小提琴演奏技巧(参考小提琴手腕揉弦教学 | 英文教学中文字幕 【Penny Teaching】);在歌唱圈中,“vibrato” 指的是颤音(参考 最通俗易懂的颤音教学!你学废了吗?)。维基百科 vibrato 词条中同样也举了唱歌小提琴的例子,有兴趣可以听听看,提升对 vibrato 感性的认识。

下图是 440hz 正弦波经过 vibrato 音效后的结果,从频谱上能看到音高在周期性的变化。

下面的视频是 Libaa - Vibrato 的效果演示,一个夸张的 Vibrato 会产生相当滑稽的结果:

vibrato

vibrato_video

通过上述的例子,你应该对 vibrato 有了一些基本认识:它一种关于音调变化的音效。


二、Vibrato 原理

2.1 Time-varying delay line

vibrato 实现原理并不复杂,人们通常用一个 delay line 就能够完成 vibrato 算法。请回忆一下之前在【音效处理】Delay/Echo 简介 提到的 Delay 算法,Delay 算法延迟 D D D 个采样,其中 D D D 是一个固定的数字,而在 vibrato 算法中,延迟的时长是一个关于时间 t t t 的函数 D t D_t Dt,也就是说延迟时间是一个不停变化的数字的,我们称为 “Time-varying delay line(可变延迟线)”。

下图为 Vibrato 与 Delay 的块状图,Vibrato 实现中通常用 LFO 来生成 D t D_t Dt,此外 Vibrato 输出只有“湿”信号,没有 feedback 信号;而 Delay 算法中 D D D 是固定的,且输出时对 “干”和“湿”信号做了 mix。

2.2 多普勒效应

为什么一个随时间变化的延迟 D t D_t Dt 会造成音调的变化呢?背后的原理其实就是多普勒效应。关于多普勒效应的介绍请参考多普勒效应 - 知乎,本文不再过多赘述。

多普勒效应在生活中非常常见,类比到 Vibrato 音效中,你可以这么想象:有一个喇叭播放着音频,你站在原地,喇叭处于运动状态,它时而靠近你时而远离你,做着周期性的运动。当喇叭靠近你时,距离,声音从发出到你耳朵的延迟 D D D 小;当喇叭远离你时,距离,声音从发出到你耳朵的延迟 D D D 大。这意味着 D D D 是一个随时间变化的值,也就是上面提到的 D t D_t Dt多普勒效应造成了音高的变化

接下来讨论多普勒效应与 vibrato 之间的关系。首先,多普勒频移公式如下:
ω l = ω s 1 + v l s c 1 − v s l c (1) \\omega_l=\\omega_s \\frac1+\\fracv_l sc1-\\fracv_s lc \\tag1 ωl=ωs1cvsl1+cvls(1)
其中 ω s \\omega_s ωs 是声源静止状态下发生音频的频率, ω l \\omega_l ωl 是 Listener 接受到的频率, v l s v_l s vls 表示 Listener 相对于声源方向的传播介质(假设是空气)的速度, v s l v_s l vsl表示声源相对于 Listener 方向的传播介质的速度, c c c表示声速。在 多普勒效应(一维匀速运动) 有具体的习题,可以参考参考加深理解。

Vibrato 差分方程为:
y ( t ) = x ( t − D t ) y(t) = x(t - D_t) y(t)=x(tDt)
其中 D t D_t Dt 为单位为秒的时变延迟,在离散实现中, D t D_t Dt 不是一个整数, x ( t − D t ) x(t-D_t) x(tDt) 可以采用插值法等技术来近似到任意的精度(参考 Libaa - DelayLine::getInterpolation 方法)。

简单起见,让我们来研究 x ( t ) x(t) x(t)复正弦信号的情况,此时 x ( t ) x(t) x(t) 可表示为:
x ( t ) = e j ω s t x(t)=e^j \\omega_s t x(t)=ejωst
此时输出信号为:
y ( t ) = x ( t − D t ) = e j ω s ⋅ ( t − D t ) y(t)=x\\left(t-D_t\\right)=e^j \\omega_s \\cdot\\left(t-D_t\\right) y(t)=x(tDt)=ejωs(tDt)
该信号的瞬时相位为:
θ ( t ) = ∠ y ( t ) = ω s ⋅ ( t − D t ) \\theta(t)=\\angle y(t)=\\omega_s \\cdot\\left(t-D_t\\right) θ(t)=y(t)=ωs(tDt)
然后通过微分得出瞬时频率:
ω l = ω s ( 1 − D ˙ t ) (2) \\omega_l=\\omega_s\\left(1-\\dotD_t\\right) \\tag2 ωl=ωs(1D˙t)(2)
其中 ω l \\omega_l ωl表示输出频率, D ˙ t ≜ Δ d D t \\dotD_t \\triangleq \\frac\\Deltad D_t D˙tdΔDt 表示延迟 D t D_t Dt 的时间导数。

仔细观察公式(1)和公式(2)发现当 D ˙ t = − v l s c \\dotD_t=-\\fracv_l sc D˙t=cvls 时两个公式可以匹配上:
ω l = ω s ( 1 + v l s c ) = ω s 1 + v l s c 1 (3) \\omega_l=\\omega_s\\left(1+\\fracv_l sc\\right)=\\omega_s \\frac1+\\fracv_l sc1 \\tag3 ωl=ωs(1+cvls)=ωs音效处理Compressor 压缩器算法简介

音效处理Reverb 混响算法简介

音效处理Reverb 混响算法简介

音频处理Loudness Normalization 响度均衡算法简介

音频处理Loudness Normalization 响度均衡算法简介

音频处理Channel Vocoder 算法简介