当前课程知识点:计算机音乐 > 第五章 一维振动模型 > 5.5 Karplus Strong算法 > Karplus Strong算法
同学们大家好
这一节我们将会对梳状滤波器略加修改
让它变成一个更真实的音色合成算法
也就是karplus strong算法
为了了解梳状滤波器所合成的声音
为什么不真实的原因
我们需要观察一下
真实的弹拨乐和刚才我们合成的声音
为什么具有比较大的差别
那么这个工作
我们可以在audacity里面去完成
让我们在audacity里面打开
刚才我们合成的这个声音
Imp_comb.wav
我们听起来是
有种电子声音的感觉的
我们来通过这个分析
频谱分析
来看一下我们生成的这个声音的频谱
那么我们的窗口会选择的大一点
正好我们可以清楚的看到这个
声音的频谱
那么如果我们所愿
这个声音本来是一个
白噪音的输入
那么通过梳状滤波器之后
它变成了具有
整数倍的峰值的谐波的形状
所以它会形成一种乐音的感觉
那么我们再来看一下真实的这个
弹拨乐声音
比如说我们打开
一个吉他
A2这根弦所发出来的声音
同样我们去分析一下它的这个
频谱
那么我们也是用
2048
这样的
窗口大小
我们可以看到它虽然也是
成整数倍关系的这样的一些频谱
但是这个频谱不像我们刚才看到的
频谱一样
刚才的这个频谱是
它的谐波
它的强度是完全平均分布的
我们可以看到
无论到多高频的地方
它的谐波的强度都是
基本上是一样的
真实乐器他的谐波越高频
是越低的一个分布
也就是说它具有这样的谐波消失的现象
那为了实现刚才我们看到的
谐波消失的滤波器
我们需要在梳状滤波器的基础之上
对高频的频段进行削减
那么我们可以看到
越高频的频段
它的振幅
其实是越低的
所以我们需要
通过一个算法
把本来是均匀分布的峰值
变成一个峰值递减的一个结构
那么我们观察这样的结构
其实我们只要在原来的
梳状滤波器的基础之上
再增加一个低通滤波器
就可以实现
高频衰减而低频保持比较高的峰值
那么这就是所谓的karplus strong算法
那么这算法是Kevin Karplus
在Alex Strong的研究基础上
进行修改而得到的算法
karplus strong算法非常的朴素
他只需要在梳状滤波器的延迟后面
再增加一个低通滤波器
就可以实现刚才的谐波消失的现象
也就是可以把原来平均分布的谐波谱
变成递减结构的谐波谱
从而模拟谐波消失的现象
那么这低通滤波器我们可以选择
非常简单的实现
比如说我们使用一个两点均值滤波器
那么前面在讲
频域的信号处理的时候
我们讲过这样的一个
两点求平均它实际上起到了是一个
低通滤波的效果
那么它将会对高频的部分做逐步的衰减
那么我们可以把两点均值滤波器
加到系统框图当中
从而得到karplus strong算法的差分方程
那么这个方程相当于把原来的
YN减L再乘一个系数
这样单独的一项
拆解成YN减L再加上外N减L减1
这两项的一个平均值
让我们简单的计算一下
它的频率响应函数Hz
那么它分子只有一项1
分母有三项
一减去0.5Z的负L次方
再减去0.5的Z负L加一次方
我们其实可以把前面的
有关Z的负L次方进行合并
也就是我们可以把前面两项合起来合成
Z的负L次方
剩下的两项是1/2加上Z的-1次方
这样做一个合并
这样我们就可以从分解的角度
来看这个频率响应函数
那么它相当于是一个梳状滤波器
那么代表的是
Z的负L次方这一项
以及再加上一个两点均值滤波器
是1/2加上Z的-1次方这一项
他们的一个在频域上的相乘得到的一个是
虽然是也有整数倍的谐波的结构
但是
它的高频的谐波是衰减的
那么接下来我们就使用python来验证一下
karplus strong算法的效果
实际上我们只需要在
刚才梳状滤波器的基础之上稍作修改
就可以完成karplus strong算法
那么我们只需要把这个
滤波器进行一个复制
改名为ks
然后其中我们少要一项零
从而
再去增加两项0.5
增加0.5以及
0.5
这样话就完成了刚才的这个
karplus strong滤波器的设计
然后我们在这里能不能把
comb就是梳状滤波器替换成
karplus strong算法
然后我们把这个
数字也进行一个修改
让我们听一下这个结果
我们给它重新的
存一下它的名字
然后运行一下看一下这个结果
我们听一下最后生成的结果
那可以听到现在的结果
就更加真实一点了
如果我们在里面去打开这个声音
Imp_ks这个声音
然后我们可以同样去
看一下它的频谱
我们可以看到比起刚才这频谱
它已经具有了谐波消失的结构了
所以
我们可以听到的声音是具有
谐波消失的这个特点的
目前我们使用的是一个极短的白噪音
来作为输入得到的合成效果
那么过于理想设置
难免会让人听出
这是一个人工合成的声音
那么我们也可以尝试使用
不同的激励信号作为输入
比如说我们在尤克里里面
我们可以让弦不要震动起来
那么简单的做法就是
用两个手指放在弦上面
那么我们用另一个手指去
扣这个两个手指之间的这部分
这样话它的振动就会被
我们放在弦上两手指所止掉
我们听到的是
这样单纯的一个弹拨的声音
那么如果我们把这个单纯的弹拨声音
录制下来
然后用刚才的python程序进行实验的话
我们就可以听到
有更真实的声音
那么接下来我们就使用刚才录制的这个声音
就是
单纯的一个弹拨的声音
不具有弦振动的声音作为一个激励信号
那么作为一个输入
也就是说我们把白噪声替换成
刚才的这个声音
好
X通过read函数进行读取
读取完之后一方面我们要做一个标准化
除此之外还
我们是一个两秒的信号
这个imp.wav是不足两秒的
所以我们需要在
X的后面补零
np.append
在X的后面补上若干个0
Np点zeros
一共是两秒这么多的
时间再减去X的长度
这样保证这个X能够扩充到两秒
然后输如到这个系统里面
它会产生一个两秒的合成的声音
那么运行一下看看
那么接下来我们再来听一下这个声音
听起来它质感就比刚才的
通过白噪声做输入信号的质感
就要强很多
因为它是用一个
真实的
激励信号来生成的声音
再加入低通滤波器之后
我们就完成了
谐波消失现象的模拟
从而使得合成的声音更加的真实
那在这个模型当中
我们是完全没有考虑到
弦的初始振动是如何完成的
显然使用不同的方式进行演奏
比如
我们可以用手指进行弹奏
我们可以用拨片进行弹奏
甚至我们可以用一个金属对弦进行敲击
我们听到的音色都会不一样
那么一个折中方法就是我们想办法
把刚才的这种
弦不振动的情况的初始震动录下来
那么把这个声音作为输入
进入到karplus strong算法当中
那么我们就可以得到一个更真实的声音
而实际上karplus strong算法
不仅可以模拟弹拨乐的声音
只要满足一维振动方程
那么通过不同的激励信号
我们可以得到不同的音色
下一节我们将会尝试把karplus strong算法
应用到管乐器当中
看一下它的效果
-欢迎辞
-1.1 计算机音乐导言
--计算机音乐导言
-1.2 计算机音乐课程主要内容
-1.3计算机音乐课程资源
-1.4 音乐的基本表达
--音乐的基本表达
-第一章作业
-2.1时域音频处理概述
--时域音频处理概述
-2.2 分窗处理1:OLA叠放
-2.3 分窗处理2:音量计算
-2.4 端点检测
--端点检测
-2.5 振幅包络
--振幅包络
-2.6 音频信号相乘
--音频信号相乘
-2.7 环形调制
--环形调制
-2.8 频率调制
--频率调制
-2.9 频率调制在音乐上的应用
-第二章作业
-3.1 频谱概述
--频谱概述
-3.2 傅里叶变换
--傅里叶变换
-3.3 短时傅里叶变换
--短时傅里叶变换
-3.4 加法合成
--加法合成
-3.5 线性滤波器
--线性滤波器
-3.6 京剧锣鼓经分析
--京剧锣鼓经分析
-第三章作业
-4.1 音色合成概述
--音色合成概述
-4.2 质点弹簧阻尼模型
--质点弹簧阻尼模型
-4.3 双线性滤波器
--双线性滤波器
-4.4 Modal合成
--Modal合成
-第四章测试
-5.1 一维振动模型概述
--一维振动模型概述
-5.2 弦振动模型
--弦振动模型
-5.3 达朗贝尔的行波解
--达朗贝尔的行波解
-5.4 梳状滤波器
--梳状滤波器
-5.5 Karplus Strong算法
-5.6 管状气鸣乐器模型
--管状气鸣乐器模型
-第五章作业
-6.1 音高跟踪概述
--音高跟踪
-6.2 时域音高跟踪
--时域音高跟踪
-6.3 频域音高跟踪
--频域音高跟踪
-6.4 K歌评分
--K歌评分
-第六章作业
-7.1 音频同步概述
--音频同步概述
-7.2 音乐特征提取 CQT
-7.3 音乐特征提取 Chroma
-7.4 动态时间规划概述
--动态时间规划概述
-7.5 动态时间规划实现
--动态时间规划实现
-第七章作业