The Karplus-Strong Algorithm
本系列文章由 @YhL_Leo 出品,转载请注明出处。
文章链接: http://blog.csdn.net/yhl_leo/article/details/48730857
Karplus-Strong Algorithm[1,2] ,由Alex Strong和Kevin Karplus提出并对其实现进行了分析,两人共同研制了应用该算法的软件和硬件。是一种用于数字音乐合成的算法,具有实现成本低,易于控制,合成音好听入耳等特点。
1 Wavetable Synthesis Algorithm
在讲解Karplus-Strong Algorithm前,首先插入讲解一下波表合成算法(Wavetable Synthesis Algorithm),它是一种标准的合成技术,它将一段采样信号一遍遍重复,从而产生一组纯粹的周期信号,我们定义
其中,参数
波表合成算法非常简单,但是因为产生的是完全周期性的音调,而略显无聊。传统的乐器产生的声音是随着时间变化而变化的,人们所想要的就是这样一个较为符合现实情况的函数模型,波表合成算法之后,相继有FM synthesis,additive synthesis,subtractive synthesis, waveshaping等算法提出,这些全都是基于波表合成算法进行进一步的修整处理。
为此,究竟什么样的修整对于波表合成算法是真正有效的呢?如果没有修整,那么必然导致产生的音乐是单纯周期性的,和弦部分也是固定不变的。同时,为了产生近似周期的输出,从一个阶段到另一个阶段对于信号的修正变化必须较小。(考虑到计算机的计算水平和内存大小限制,当时对于算法的计算量和内存占用也进行了要求,现在这些限制早已不是问题。)
2 Karplus-Strong Algorithm
基于上面的知识,我们再来看Karplus-Strong Algorithm算法,这是一种简单的修整方法,原论文中针对拨弦(Plucked-String)和击鼓(Drum)进行了算法描述。Fig 1是该算法的简单示意图,从中可以看出,这种修整方法就是对连续的两个采样信号进行求平均。
对于拨弦算法(Plucked-String Algorithm, invented by Alex Strong in 1978):
实验显示这种平均处理,能够基于原波形产生缓慢的衰减,并且倾向于具有
在没有衰减的情况下,按照上述方法产生的随机波表本质上等价于具有Nyquist频率(Nyquist frequency)的谐波,听起来就像簧风琴(Reed Organ)。而具有衰减时,较高的谐波会很快衰减,产生跟吉他拨弦声( plucked-string sound)很像的声音。
对于击鼓算法(Drum Algorithm, discovered by Kevin Karplus in 1979):
其中,
3 Karplus–Strong String Synthesis
让我们来看看,Karplus–Strong Algorithm是如何合成声音的,如Fig 2所示。
1 激励波形产生(Noise burst):即产生一段长度为
L 的样波,在原始的算法中,使用强烈白噪声(White noise),例如捶打音(hammered),拨弦音(plucked-string)以及其他形式的敲打音(percussion),其中除了杂乱的窄频带信号(narrowband signal)外,还含有一些宽频带信号(wideband signal),例如快速变化的正弦波、扫描波、锯齿波和方形波等;2 延迟(Delay):将输入信号反馈为具有延时长度
L 的样波;3 滤波(Filter):在原算法中,使用的是相邻的采样信号求均值法,此处为了维持稳定的正反馈循环(Positive feedback),并且使各个频率的信号增益(Gain)不超过1,因此采用了一阶低通滤波(low-pass filter);
4 递归(Recursion):滤波后输出的数据,同时被混合到输出结果中,并继续进行延迟和滤波。
参考文献:
- Kevin Karplus, Alex Strong, “Digital Synthesis of Plucked String and Drum Timbres”, Computer Music Journal (MIT Press) 7(2), 1983.
- David A. Jaffe, Julius O. Smith, “Extensions of the Karplus-Strong Plucked-String Algorithm”, Computer Music Journal (MIT Press), 7(2), 1983.
- https://ccrma.stanford.edu/~jos/pasp/Karplus_Strong_Algorithm.html
- https://en.wikipedia.org/wiki/Karplus%E2%80%93Strong_string_synthesis
- http://crypto.stanford.edu/~blynn/sound/karplusstrong.html