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),它是一种标准的合成技术,它将一段采样信号一遍遍重复,从而产生一组纯粹的周期信号,我们定义Yt是第t个采样信号值,则波表合成算法的数学表达式可写为:
其中,参数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是该算法的简单示意图,从中可以看出,这种修整方法就是对连续的两个采样信号进行求平均。
对于拨弦算法(Plucked-String Algorithm, invented by Alex Strong in 1978):
实验显示这种平均处理,能够基于原波形产生缓慢的衰减,并且倾向于具有 p+1/2的采样周期和fs/(p+1/2)的采样频率,算法非常简单高效。为了产生一个现实的声音,需要初始时输入较多高的谐波,通常的在每一新的小节开始部分被填入随机数值,由于重复的在波表中采样,这种随意数值并不会产生嘘声和噪声。这种利用随机数初始化,具有最明显的优势就是:每个重复的片段中和弦波形结构都会具有细微的差异,从而听起来就像来自于同一乐器,但却不是简单机械的重复。
在没有衰减的情况下,按照上述方法产生的随机波表本质上等价于具有Nyquist频率(Nyquist frequency)的谐波,听起来就像簧风琴(Reed Organ)。而具有衰减时,较高的谐波会很快衰减,产生跟吉他拨弦声( plucked-string sound)很像的声音。
对于击鼓算法(Drum Algorithm, discovered by Kevin Karplus in 1979):
其中,b被称为融合因子(blend factor),不难发现,当b=1时,算法就简化为了Plucked-String Algorithm。其它就不在做过多介绍。
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
The Karplus-Strong Algorithm的更多相关文章
- 《In Search of an Understandable Consensus Algorithm》翻译
Abstract Raft是一种用于管理replicated log的consensus algorithm.它能和Paxos产生同样的结果,有着和Paxos同样的性能,但是结构却不同于Paxos:它 ...
- POJ2699 The Maximum Number of Strong Kings
Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 2102 Accepted: 975 Description A tour ...
- Evolutionary Computing: 2. Genetic Algorithm(1)
本篇博文讲述基因算法(Genetic Algorithm),基因算法是最著名的进化算法. 内容依然来自博主的听课记录和教授的PPT. Outline 简单基因算法 个体表达 变异 重组 选择重组还是变 ...
- POJ2699 The Maximum Number of Strong Kings(最大流)
枚举所有Strong King的状态(最多1024种左右),然后判断是否合法. 判定合法用网络流,源点-比赛-人-汇点,这样连边. 源点向每场比赛连容量为1的边: 如果一场比赛,A和B,A是Stron ...
- 【POJ】【2699】The Maximum Number of Strong Kings
网络流/最大流/二分or贪心 题目大意:有n个队伍,两两之间有一场比赛,胜者得分+1,负者得分+0,问最多有几只队伍打败了所有得分比他高的队伍? 可以想到如果存在这样的“strong king”那么一 ...
- nyoj 1100 WAJUEJI which home strong!
WAJUEJI which home strong! 时间限制:1000 ms | 内存限制:65535 KB 难度:2 描述 在一个山沟里,姐弟俩同时考上了大学.但由于家里拮据,所以这并不是 ...
- The Maximum Number of Strong Kings
poj2699:http://poj.org/problem?id=2699 题意:n个人,进行n*(n-1)/2场比赛,赢一场则得到一分.如果一个人打败了所有比他分数高的对手,或者他就是分数最高的, ...
- 【POJ2699】The Maximum Number of Strong Kings(网络流)
Description A tournament can be represented by a complete graph in which each vertex denotes a playe ...
- An Attempt to Understand Boosting Algorithm(s)
An Attempt to Understand Boosting Algorithm(s) WELCOME! Here you will find daily news and tutorials ...
随机推荐
- [置顶]
openHAB 体系结构与编程模型 (1) --- 术语
openHAB 术语 Item : 对硬件设备属性的抽象 ( Items are objects that can be read from or written to in order to int ...
- 2019-03-18 OpenCV Tesseract-OCR 下载 安装 配置(cv2 报错)
OpenCV 下载 安装 配置 1.下载和Python版本对应的版本,此为下载地址 2.安装(在powershell管理员模式下安装) pip3 install .\opencv_python-3.4 ...
- Shiro:整合swagger2时需要放行的资源
filterMap.put("/swagger-ui.html", "anon"); filterMap.put("/swagger-resource ...
- 命令行 对MYSQL导入sql
1 use database name; //选择使用的数据库 2 mysql>source d:\datafilename.sql 导入sql
- UVALive 3231 Fair Share
Fair Share Time Limit: 3000ms Memory Limit: 131072KB This problem will be judged on UVALive. Origina ...
- Bootstrap组件之页头、缩略图
.page-header--指定div元素包裹页头组件. <div class="page-header"> <h1>小镇菇凉<small> 2 ...
- scrapy研究探索(二)——爬w3school.com.cn
下午被一个问题困扰了好一阵.终于使用还有一种方式解决. 開始教程二.关于Scrapy安装.介绍等请移步至教程(一)(http://blog.csdn.net/u012150179/article/de ...
- bzoj2150: 部落战争(匈牙利)
2150: 部落战争 题目:传送门 题解: 辣鸡数据..毁我AC率 先说做法,很容易就可以看出是二分图匹配的最小路径覆盖(可能是之前不久刚做过类似的题) 一开始还傻逼逼的去直接连边然后准备跑floyd ...
- web forms page和control的生命周期life cycle交互,以及page生命周期中每个event中需要做什么事情
只有 page_load和page_init这些可以autoeventwireup RenderControl只提供override public override void RenderContro ...
- 使用ffmpeg批量合并flv文件
title: 使用ffmpeg批量合并flv文件 toc: false date: 2018-10-14 16:08:19 categories: methods tags: ffmpeg flv 使 ...