音效处理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=ωs1−cvsl1+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(t−Dt)
其中
D
t
D_t
Dt 为单位为秒的时变延迟,在离散实现中,
D
t
D_t
Dt 不是一个整数,
x
(
t
−
D
t
)
x(t-D_t)
x(t−Dt) 可以采用插值法等技术来近似到任意的精度(参考 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(t−Dt)=ejωs⋅(t−Dt)
该信号的瞬时相位为:
θ
(
t
)
=
∠
y
(
t
)
=
ω
s
⋅
(
t
−
D
t
)
\\theta(t)=\\angle y(t)=\\omega_s \\cdot\\left(t-D_t\\right)
θ(t)=∠y(t)=ωs⋅(t−Dt)
然后通过微分得出瞬时频率:
ω
l
=
ω
s
(
1
−
D
˙
t
)
(2)
\\omega_l=\\omega_s\\left(1-\\dotD_t\\right) \\tag2
ωl=ωs(1−D˙t)(2)
其中
ω
l
\\omega_l
ωl表示输出频率,
D
˙
t
≜
Δ
d
D
t
\\dotD_t \\triangleq \\frac\\Deltad D_t
D˙t≜dΔ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 压缩器算法简介
音频处理Loudness Normalization 响度均衡算法简介