2.1.5 实例:声波的叠加
如1.5节所述,我们研究的简单语音模型需要进一步“润色”,以产生类似于乐器发出的声音。润色的方法有很多种,其中一种方法是使用函数,我们可以将函数系统地应用于1.5节中产生的简单正弦波上,以产生更为复杂的声波。为了描述如何使用函数有效地解决复杂而有趣的计算问题,下面我们将讨论一个实现与playthattune.py(程序1.5.8)相同功能的程序,但在每个音符之上八度和之下八度分别增加了和声以产生更逼真的声音效果。
1. 和弦与和声
类似标准A音的音符声调单一,听起来不太悦耳,因为我们习惯的声音大多包含其他许多成分。吉他弦上的声音与乐器的木质部分、你所在房间的墙壁等通过回声相呼应。我们可以认为这种效果等同于修改基本的正弦波。例如,绝大多数乐器产生和声(不同八度下的同一个音符,且音量较轻),你也可以通过和弦产生音乐(同时产生多个音符)。通过叠加可组合多个声音:把多个声波简单地叠加在一起,并通过调整幅度以保证结果位于区间-1和+1之间。结果表明,当我们使用这种方法叠加多个不同频率的正弦波时,会产生任意复杂的波形。
事实上,作为十九世纪某个数学家引以为豪的结论,认为任何光滑的周期性函数可以表示为若干正弦波和余弦波之和,这就是著名的傅里叶级数。这种数学观点对应的概念在于,我们可以使用乐器或人声创建大量的音乐,所有的音乐都是由不同的振荡曲线组合而成。任何一个声音都对应一条曲线,同样任何一条曲线都对应一个声音,所以可通过叠加创建任意的复合曲线。通过叠加波形创建复合声音的示意图如图2-1-10所示。
图2-1-10 通过叠加波形来创建复合声音
2. 声波计算
在1.5节,我们已经了解如何使用数值数组表示声波,即表示其采样点的值。现在,我们使用类似的数组作为函数的返回值和参数,以创建声波数组。例如,如下函数带两个参数:频率(以赫兹为单位)和时长(以秒为单位),返回一个表示声波的数组(更精确地讲,一个使用标准采样频率44 ...
Get 程序设计导论:Python语言实践 now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.