本系列文章由 @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. BZOJ 3786 星系探索 (splay+dfs序)

    题目大意:给你一棵树,支持一下三种操作 1.获取某节点到根节点的路径上所有节点的权值和 2.更换某棵子树的父亲 3.某子树内所有节点的权值都增加一个值w 当时想到了splay维护dfs序,查完题解发现 ...

  2. Python中的itertools.product

    例子1:import itertoolsa = itertools.product([1,2,3],[100,200])print(a)for item in itertools.product([1 ...

  3. debian 9 安装Virtual Box

    1.去官网下载deb包,例如包名: virtualbox-.2_5.2.18-124319_Debian_stretch_amd64.deb 2.安装 .2_5.2.18-124319_Debian_ ...

  4. python课堂知识的几点总结

    1.执行python脚本的两种方式:利用python进入解释器和找到可执行文件1.py 2.位和字节:一个字节是8位,计算机运行时是以字节为单位,存储的时候是以位为单位 3.编码发展:ASCII只有0 ...

  5. springboot的几个缓存相关注解

    @Cacheable:查询 几个属性: ​ cacheNames/value:指定缓存组件的名字: ​ key:缓存数据使用的key,可以用来指定.默认即使用方法参数的值 ​ keyGenerator ...

  6. js内置对象——Math

    Math()是JavaScript的内置对象(对于内置对象的理解,会单独写文章说明),包含了很多数学相关的方法: 常用方法: 1 Math.ceil(x) //取最近的最大整数返回 2 Math.fl ...

  7. Java线程:CountDownLatch 与Thread 的 join()

    需求: 主程序中需要等待所有子线程完成后 再继续任务 两种实现方式: 一种使用join() 方法:当在当前线程中调用某个线程 thread 的 join() 方法时,当前线程就会阻塞,直到thread ...

  8. Image Processing for Very Large Images

    The key idea here is the partial image descriptor VIPS(VASARI Image Processing System) 是近几年逐渐兴起的针对大图 ...

  9. Intellij idea 自动完成的变量名称首字母变为小写

    Intellij idea 自动完成的变量名称首字母变为小写 好像没有什么好的自动办法,自己输入一个小写的字母吧,然后Idea会出提示.

  10. Struts2中的异步提交(ajaxfileupload异步上传(图片)插件的使用)

    server端採用struts2来处理文件上传. 所需环境: jquery.js ajaxfileupload.js struts2所依赖的jar包 及struts2-json-plugin-2.1. ...