The Karplus-Strong Algorithm

来源:互联网 发布:仿京东商城源码 php 编辑:程序博客网 时间:2024/06/06 01:31


本系列文章由 @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),它是一种标准的合成技术,它将一段采样信号一遍遍重复,从而产生一组纯粹的周期信号,我们定义Yt是第t个采样信号值,则波表合成算法的数学表达式可写为:

Yt=Ytp,(1)

其中,参数p被称为波表长度(Wavetable length )或者周期性参数(Periodicity parameter)。信号循环的初始条件完全决定了最终的音色。通常来说,输入的简单波形信号,例如sine wave,triangle wave,square wave等,当输入采样频率是fs时,音调的频率为fs/p

波表合成算法非常简单,但是因为产生的是完全周期性的音调,而略显无聊。传统的乐器产生的声音是随着时间变化而变化的,人们所想要的就是这样一个较为符合现实情况的函数模型,波表合成算法之后,相继有FM synthesis,additive synthesis,subtractive synthesis, waveshaping等算法提出,这些全都是基于波表合成算法进行进一步的修整处理。

为此,究竟什么样的修整对于波表合成算法是真正有效的呢?如果没有修整,那么必然导致产生的音乐是单纯周期性的,和弦部分也是固定不变的。同时,为了产生近似周期的输出,从一个阶段到另一个阶段对于信号的修正变化必须较小。(考虑到计算机的计算水平和内存大小限制,当时对于算法的计算量和内存占用也进行了要求,现在这些限制早已不是问题。)

2 Karplus-Strong Algorithm

基于上面的知识,我们再来看Karplus-Strong Algorithm算法,这是一种简单的修整方法,原论文中针对拨弦(Plucked-String)和击鼓(Drum)进行了算法描述。Fig 1是该算法的简单示意图,从中可以看出,这种修整方法就是对连续的两个采样信号进行求平均。



KarplusStrong
Fig 1: Rigidly terminated string with the simplest frequency-dependent loss filter. All loss factors (possibly including losses due to yielding terminations) have been consolidated at a single point and replaced by a one-zero filter approximation.

对于拨弦算法(Plucked-String Algorithm, invented by Alex Strong in 1978):

Yt=12(Ytp+Ytp1),(2)

实验显示这种平均处理,能够基于原波形产生缓慢的衰减,并且倾向于具有 p+1/2的采样周期和fs/(p+1/2)的采样频率,算法非常简单高效。为了产生一个现实的声音,需要初始时输入较多高的谐波,通常的在每一新的小节开始部分被填入随机数值,由于重复的在波表中采样,这种随意数值并不会产生嘘声和噪声。这种利用随机数初始化,具有最明显的优势就是:每个重复的片段中和弦波形结构都会具有细微的差异,从而听起来就像来自于同一乐器,但却不是简单机械的重复。

在没有衰减的情况下,按照上述方法产生的随机波表本质上等价于具有Nyquist频率(Nyquist frequency)的谐波,听起来就像簧风琴(Reed Organ)。而具有衰减时,较高的谐波会很快衰减,产生跟吉他拨弦声( plucked-string sound)很像的声音。

对于击鼓算法(Drum Algorithm, discovered by Kevin Karplus in 1979):

Yt={+12(Ytp+Ytp1);12(Ytp+Ytp1);probability bprobability 1b,(3)

其中,b被称为融合因子(blend factor),不难发现,当b=1时,算法就简化为了Plucked-String Algorithm。其它就不在做过多介绍。

3 Karplus–Strong String Synthesis

让我们来看看,Karplus–Strong Algorithm是如何合成声音的,如Fig 2所示。



String Systhesis
Fig 2: A illumination of the Karplus–Strong string synthesis.

  • 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
1 0