【音频处理】Channel Vocoder 算法简介

系列文章目录



Channel Vocoder

在各类剪辑软件中,有一类音效非常的魔幻、富有科技感,例如:

这类音效背后的原理来自原 Channel Vocoder(声道声码器)。Channel vocoder 最初由 Homer Dudley 在 1930s 发明,发明的初衷是为了做语音通信,但就目前来看,它在音效上取得了更多的进展。

Channel vocoder 的输入有两个两个信号:载波信号(carrier)和调制信号(modulator)。在音效场景中,carrier 通常是一个谐波丰富的音频,例如锯齿波或者小提琴等声音,而 modulator 通常是语音信号;算法的输出,则是将两个信号进行了某种混合,使得两种信号被叠加在一起,可以产生经典的机器人音效,它作为一种特殊效果在好莱坞中被广泛使用。下面视频是本人实现的 channel vocoder 示例,是一种非常「机械」的声音。

channel_vocoder_video

算法原理

Channel vocoder 的算法实现可以分为时域滤波器实现和频域傅里叶变换实现。

时域滤波器实现

请添加图片描述

Channel vocoder 在时域上可以被描述为 filter-bank 模型,算法处理逻辑如上图,我们对着图来说。

首先,需要选定一组 Band-Pass Filter,用来过滤出特定频率的音频信息,例如我可以选定 [337.5, 575, 850, 1200, 1700, 2350]。

接着,对于 carrier,经过 BPF 后得到不同频段的信号即可;对于 modulator,经过 BPF 处理后,我们还要获取到这个信号的包络(envelope)。获取包络方式多种多样,一种简易的方式是取信号的能量值,并经过一个 Low-Pass Filter 即可。

然后,将 modulator 的包络与 carrier 的相同频段信号做一个相乘,最后累加所有频段信号就可得到最终的输出。这里 有一个在线体验 channel vocoder 的页面,用的就是 filter-band 模型。

这里思考几个问题:

  1. 我要选多少个频段?没有一个固定的值,它可以被设置为算法的一个参数。频段越多计算量越大,但输出信号中 modulator 信号越清晰;频段越少,计算越快,但输出信号「机械感」越强,modulator 信号越不清晰。具体感受可以注意文章开头中视频中对 「Number Band」参数的调整。
  2. modulator 与 carrier 信号长度不一致怎么办?modulator 通常是语音信号,考虑在直播场景下使用 channel vocoder 音效的话,modulator 是无限长的,carrier 是一段固定长度的音频,可以重复循环使用 carrier。

频域傅里叶变换

请添加图片描述

时域上实现 channel vocoder ,需要使用了非常多的 Band-Pass Filter 来过滤出特定的频段,这种方式计算量很大。Channel Vocoder 音效的原理无非是:

  1. 在 carrier 和 modulator 信号中,找到特定频率的信息
  2. 将 modulator 频段信息进行某种非线性操作(例如找到包络),然后将这个结果与 carrier 频段信息相结合

为了达到上述两个目标,Channel Vocoder 现代实现通常用 FFT 替换 Band-Pass Filter。当使用很多频段时,这种方法更快,而且非线性和低通滤波都可以很容易地使用 FFT 的幅度来完成。FFT Channel vocoder 算法处理逻辑如上图,具体的:

  1. 对 modulator 进行 FFT,得到 FFT Bins,将 FFT Bins 分为 N 个 band,对每个 band 的幅度取均值,得到 b N b_N bN
  2. 对 carrier 进行 FFT,得到 FFT Bins,将 FFT Bins 分为 N 个 band,对每个 band 的幅度取均值,得到 a N a_N aN
  3. 完成 1、2 后,对于每个 band,我们计算得到 s = b N a N s = \frac{b_N}{a_N} s=aNbN,将 s 与当前的 carrier band 相乘,使 carrier 带上 modulator 的信息
  4. 最后,对相乘后的 FFT Bins 做 IFFT 得到时域输出信号

频域上实现 channel vocoder,计算量骤降,Number Bands 轻松设置到 256 都没有问题,而 Band-Filter 模型设置到 64 已经非常吃性能了,并且 Number Bands 参数可以实时调整不影响效果。但频域实现代码复杂性较高,需要在输入和输出两个入口设置 ringbuffer 以保证信号连续性,这同时也会引入一定的延迟(取决与 FFT 的 window size)。

总结

本文介绍了 Channel vocoder,它是一种非常神奇的音效,可以用来实现经典的机器人音效。Channel vocoder 可以使用时域和频域两种实现方法。时域方法中,它被看出是一种 filter-band 模型,通过 band-pass filter 过滤出特定频段的信号,然后将 modulator 中的包络信息附加到 carrier 中来实现;频域方法,经过 FFT 后,对每个 band 进行取均值的,将 modulator 中的各 band 的均值与 carrier 的 band 相乘,然后 IFFT 得到时域输出信号。频域方法计算量更小,参数调整更优化,因此目前大多实现都是频域方法,但它会引入算法延迟。

参考

猜你喜欢

转载自blog.csdn.net/weiwei9363/article/details/127461433