本系列文章由 @YhL_Leo 出品,转载请注明出处。

文章链接: http://blog.csdn.net/yhl_leo/article/details/48730857


Karplus-Strong Algorithm[12] ,由Alex Strong和Kevin Karplus提出并对其实现进行了分析,两人共同研制了应用该算法的软件和硬件。是一种用于数字音乐合成的算法,具有实现成本低,易于控制,合成音好听入耳等特点。

1 Wavetable Synthesis Algorithm

在讲解Karplus-Strong Algorithm前,首先插入讲解一下波表合成算法(Wavetable Synthesis Algorithm),它是一种标准的合成技术,它将一段采样信号一遍遍重复,从而产生一组纯粹的周期信号,我们定义Yt是第t个采样信号值,则波表合成算法的数学表达式可写为:

Yt=Yt−p,(1)

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

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

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

2 Karplus-Strong Algorithm

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






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(Yt−p+Yt−p−1),(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(Yt−p+Yt−p−1);−12(Yt−p+Yt−p−1);probability bprobability 1−b,(3)

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

3 Karplus–Strong String Synthesis

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






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):滤波后输出的数据,同时被混合到输出结果中,并继续进行延迟和滤波。

参考文献:

The Karplus-Strong Algorithm的更多相关文章

  1. 《In Search of an Understandable Consensus Algorithm》翻译

    Abstract Raft是一种用于管理replicated log的consensus algorithm.它能和Paxos产生同样的结果,有着和Paxos同样的性能,但是结构却不同于Paxos:它 ...

  2. POJ2699 The Maximum Number of Strong Kings

    Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2102   Accepted: 975 Description A tour ...

  3. Evolutionary Computing: 2. Genetic Algorithm(1)

    本篇博文讲述基因算法(Genetic Algorithm),基因算法是最著名的进化算法. 内容依然来自博主的听课记录和教授的PPT. Outline 简单基因算法 个体表达 变异 重组 选择重组还是变 ...

  4. POJ2699 The Maximum Number of Strong Kings(最大流)

    枚举所有Strong King的状态(最多1024种左右),然后判断是否合法. 判定合法用网络流,源点-比赛-人-汇点,这样连边. 源点向每场比赛连容量为1的边: 如果一场比赛,A和B,A是Stron ...

  5. 【POJ】【2699】The Maximum Number of Strong Kings

    网络流/最大流/二分or贪心 题目大意:有n个队伍,两两之间有一场比赛,胜者得分+1,负者得分+0,问最多有几只队伍打败了所有得分比他高的队伍? 可以想到如果存在这样的“strong king”那么一 ...

  6. nyoj 1100 WAJUEJI which home strong!

    WAJUEJI which home strong! 时间限制:1000 ms  |  内存限制:65535 KB 难度:2   描述 在一个山沟里,姐弟俩同时考上了大学.但由于家里拮据,所以这并不是 ...

  7. The Maximum Number of Strong Kings

    poj2699:http://poj.org/problem?id=2699 题意:n个人,进行n*(n-1)/2场比赛,赢一场则得到一分.如果一个人打败了所有比他分数高的对手,或者他就是分数最高的, ...

  8. 【POJ2699】The Maximum Number of Strong Kings(网络流)

    Description A tournament can be represented by a complete graph in which each vertex denotes a playe ...

  9. An Attempt to Understand Boosting Algorithm(s)

    An Attempt to Understand Boosting Algorithm(s) WELCOME! Here you will find daily news and tutorials ...

随机推荐

  1. [置顶] openHAB 体系结构与编程模型 (1) --- 术语

    openHAB 术语 Item : 对硬件设备属性的抽象 ( Items are objects that can be read from or written to in order to int ...

  2. 2019-03-18 OpenCV Tesseract-OCR 下载 安装 配置(cv2 报错)

    OpenCV 下载 安装 配置 1.下载和Python版本对应的版本,此为下载地址 2.安装(在powershell管理员模式下安装) pip3 install .\opencv_python-3.4 ...

  3. Shiro:整合swagger2时需要放行的资源

    filterMap.put("/swagger-ui.html", "anon"); filterMap.put("/swagger-resource ...

  4. 命令行 对MYSQL导入sql

    1 use database name;  //选择使用的数据库 2 mysql>source d:\datafilename.sql  导入sql

  5. UVALive 3231 Fair Share

    Fair Share Time Limit: 3000ms Memory Limit: 131072KB This problem will be judged on UVALive. Origina ...

  6. Bootstrap组件之页头、缩略图

    .page-header--指定div元素包裹页头组件. <div class="page-header"> <h1>小镇菇凉<small> 2 ...

  7. scrapy研究探索(二)——爬w3school.com.cn

    下午被一个问题困扰了好一阵.终于使用还有一种方式解决. 開始教程二.关于Scrapy安装.介绍等请移步至教程(一)(http://blog.csdn.net/u012150179/article/de ...

  8. bzoj2150: 部落战争(匈牙利)

    2150: 部落战争 题目:传送门 题解: 辣鸡数据..毁我AC率 先说做法,很容易就可以看出是二分图匹配的最小路径覆盖(可能是之前不久刚做过类似的题) 一开始还傻逼逼的去直接连边然后准备跑floyd ...

  9. web forms page和control的生命周期life cycle交互,以及page生命周期中每个event中需要做什么事情

    只有 page_load和page_init这些可以autoeventwireup RenderControl只提供override public override void RenderContro ...

  10. 使用ffmpeg批量合并flv文件

    title: 使用ffmpeg批量合并flv文件 toc: false date: 2018-10-14 16:08:19 categories: methods tags: ffmpeg flv 使 ...