调制类效果器是一种允许用户对输入音频产生随时间变化的部分效果的效果器,根据调制的参数不同,大致分为以下类型
音量调制类效果器允许用户对输入音频的音量产生随时间变化的效果器,假设有数字音频流 X[n] 以及某个随时间变化的数字信号(即调制波)d[n] 则此类效果器可以直接定义如下:
Y[n]=d[n]X[n]
当 d[n] 周期较长,以至于在一个音频窗口内近似相等时,其与普通包络线类似。当 d[n] 周期较短时,此时形成此类效果器的特例,即环形调制 (Ring Modulation, 简称 RM).
此类型也有可能将调制后效果与原始音频按某比例叠加,形式化写为
Y[n]=kd[n]X[n]+X[n]
其中 Y[n] 表示输出音频, k 是一个比例常数。此情况下即构成幅度调制 (Amplitude Modulation, 简称 AM).
时间调制类效果器允许用户对输入音频的起始时间产生随时间变化的效果器,常常用于制作一些粒子化效果,假设有数字音频流 X[n] 以及调制波 d[n] 则此类效果器可以直接定义如下:
Y[n]=kX[d[n]]+X[n]
其中 Y[n] 表示输出音频, k 是一个比例常数,当 k=0 时,此类效果器即构成粒子效果器,当 k=0 时,此类效果器会构成延迟调制类效果器,此类效果器的典型代表是移相器、镶边、合唱等,详见延迟类效果器。特别地,此类效果器可以视作数字滤波器的特例。
频率调制类效果器允许用户对输入音频的频率产生随时间变化的效果器。为了达到对频率的变化,一般有如下常见方法:
Phase Vocoder 的核心思想是在频域上直接移动频率并对产生的相位失真进行修正。其一般过程如下:
设数字音频流 x[n] 对其加窗并进行傅里叶变换得到
X[m,k]=n=0∑N−1w[n]x[n+mH]e−N2nkπi
其中 k 是频率索引,N 是窗函数长度,w[n] 是窗函数,H 是帧移。
从而得到原始信号的相位信息 argX[m,k]. 不同于一般的傅里叶变换提取频率的方式,Phase Vocoder 引入了相位信息以更高精度地估算瞬时频率,其具体估算方法如下:
首先计算相邻帧之间的相位差 Δϕ[m,k]=argX[m,k]−argX[m−1,k] 并调整到 [−π,π) 区间内,从而修正后的瞬时频率如下:
f[m,k]=2πfs(HΔϕ[m,k]+N2πk)
其中 fs 是采样率。
之后对频率进行变换(如加上某个频段 f[m,k]+Δf 或倍增频率 αf[m,k] 等等)得到调整后频率 f′[m,k]. 对频率变换后信号进行相位 ψ[m,k] 重建以修正可能产生的相位失真
ψ[m,k]=ψ[m−1,k]+2πfsf′[m,k]H
根据 f′[m,k] 对应的频率分配新的频率索引 k′ 并由此重建得到频域输出
Y[m,k′]=∣X[m,k]∣eiψ[m,k]
对该信号进行逆变换得到时域输出信号
y[n]=m∑[N1k=0∑N−1Y[m,k]⋅eN2πkni]⋅w(n−mH)
同理也可以进行时变音调不变的拉伸
希尔伯特变换法的核心思想是通过生成解析信号直接操作频率。其一般过程如下:
设存在数字音频流 x[n] 利用希尔伯特变换构建得到解析信号
X[n]=x[n]+iH{x}[n]
对解析信号乘以复指数并取实部得到输出
Y[n]=Re(X[n]ei2πΔfn)
其中 Δf 为频率偏移量,变换后的频率满足 f′=f+Δf 其中 f 是原始频率。
实践过程因为希尔波特变换需要无限长脉冲,因此常常使用全通滤波器堆叠模拟。
Overlap-add (简称 OLA) 类方法是一类允许用户改变音频长度但不改变音调的方法,结合重采样技术可以实现改变音调而不改变长度。其核心思想是将原始输入拆分为重叠的多份,并由此移动重叠部分以达到延长时间但不改变音调的效果。下面介绍应用相对广泛的两种 OLA 类方法
Pitch Synchronous Overlap and Add 简称 PSOLA 是假定信号存在某种周期性并由此将信号分割成与该周期同步的短时片段并应用 OLA 的方法。其大致过程如下:
设存在数字音频流 X[n] 对其应用频率检测后得到基频为 fb 并由此计算基频周期 Tb=fb1 并得到原始音频流的一个拆分
s[n,m]=X[n]w[n−mfsTb]
其中 fs 是采样率,w 是窗函数,一般来说,窗函数长度取在 [2fs3Tb,fs2Tb] 中。设我们将要将音调改变 α 倍则帧间隔调整量应满足 nm=round(mfsαTb) 之后重建输出信号
Y[n]=m∑s[n−nm,m]w[n−nm]
Waveform Similarity Overlap and Add 简称 WSOLA 是通过分析信号找寻最相似部分并以此为依据进行分割并应用 OLA 的方法,其大致过程如下:
假设我们需要将原始音频拉伸 β 倍,设数字音频流 X[n],对于任一步长 S 对原始音频进行拆分得到
s[n,m]=X[n]w(n−mS)
其中 w 是窗函数,其长度一般需要多于 S+2Δ 且在每帧前后至少有 Δ 个数据点与上/下一帧重合其中 Δ 是搜索窗口大小,用于寻找相似部分。则重建输出信号的过程如下
对于第零帧,直接采样原始音频
y[n,0]=s[n,0]
对于第 k 帧,取第 k−1 帧的末尾部分即
y′[n,k]=y[n,k−1]−y[n⋅u[kβS−n],k−1]
其中 u[n] 是单位阶跃函数,分析第 k 个切片 s[n,m],寻找 tk∈[−Δ,+Δ] 中使得相似度量函数 C(y′[n,k],s[n−t,k]) 输出相似度最大的 tk 作为本帧的偏移,累加到输出音频上。最终得到整体的输出音频大致如下:
Y[n]=m∑s[n−tm,m]w(n−mβS)
其中相似度函数可以使用相关系数,即
C(y′[n,k],s[n−t,k])=n=0∑L−1y′[n,k]2n=0∑L−1s[n−t,k]2n=0∑L−1y′[n,k]s[n−t,k]
其中 L 是重叠部分长度,或者使用均方误差
C(y′[n,k],s[n−t,k])=L1n=0∑L−1(y′[n,k]−s[n−t,k])2
此时均方误差越小表示相似性越高。
得到拉伸后音频对音频进行重采样即可得到改变音调后的输出音频。音调改变倍数满足 α=β1.
下表对比了上述四种方法的优劣
名称 |
能力 |
优势 |
劣势 |
Phase Vocoder |
音调移动、频率移动、音调不变拉伸 |
全能,适用性最广 |
计算复杂,FFT 引入的延迟会对相位及瞬态产生影响 |
希尔伯特变换 |
频率线性移动 |
低延迟,计算量低 |
可能产生混叠失真,无法进行音调转换 |
PSOLA |
音调移动,音调不变拉伸 |
实时性高、无相位问题 |
需要相对明确的基频(如语音信息) |
WSOLA + 重采样 |
音调移动,音调不变拉伸 |
非周期信号友好,自然度高 |
计算开销大 |