波形声音编程的一点笔记
声明
这篇文章是我自学波形声音相关的零散学习笔记汇总。我非专业人士,内容不完全保证正确性,请读者不要被误导。如果文章出现描述不清晰、知识错误,请在评论中批评指正,非常感谢。
文章起稿于2018年6月,发表于2019年2月。
前言
本人最近在模拟一整套的硬件芯片(包括:CPU,声卡,显卡,一些外设等)。在编写声音芯片相关的模拟时,由于完全缺乏相关的专业知识,不知道从何下手。 所以,暂停了那个项目的开发工作,转到这里先学习一下声音相关的知识。这篇文章来源于一边学习、请教的过程中,记录而来(虽然内容并不多,也不深入)。
声音的产生
大概是在中学的物理课堂上我们学过以下声音的概念:
- 声音是由物体振动产生的声波;
- 声音是一种通过介质传播并被听觉器官感知的波动现象;
- 发出振动的物体叫作声源。
声音至少有以下一些特性:
-
音色
我们之所以能区别出吉他和钢琴的声音的不同,是因为它们有着不同的音色,音色是由发声的物体决定的。从具体来看,不同的发声物体将会产生不同的波形,不同的波形产生不同音色的声音。
-
音调
声音是一种波,它有频率。频率的高低决定了音调的高低,即音高。频率越低,音调越低,频率越高,音调越高。频率的单位是赫兹(Hz),频率越高,声音通常越刺耳。
-
音量
音量就是经常所说的声音的大小。音量是由振幅决定的。平常说的声音太小听不见、太大了耳朵受不了,就是指音量。
比如下图的例子:
从上图可以简单地了解到:不同的音乐器材产生了不同的波形声音。这些不同的声波,它们的振幅、频率、波形均不相同。
傅里叶变换
如果读者学过(我没学过,尴尬!)傅里叶变换的话,应该知道: 傅里叶变换用于把信号在时域与频域之间进行变换。
没学过也无所谓,简单说就是:复杂的周期函数可以表示成一系列简单的正弦、余弦函数之和。
如果还不理解,可以看下面这个图:
所以,可以简单地认为:复杂的声音就是由简单的正弦、余弦合成而来的。
声音的采样
声音其实是一个模拟量、连续量(数学概念),然而我们的存储介质只能保存数字量、离散量。
比如我们的声音是由这个函数产生的:$f(x) = \sin x$
.
它的波形如下:
根据高数的概念,$f(x) = \sin x$
是一个连续函数的意思是说:$f(x)$
在 $x$
取任意值时,均有定义。
我们如果能保存这个波形在任意时刻$f(x)$
的值,那么,就能完整地记录该波形产生的声音。
但是,这个任意时刻无法完整被保存起来。比如:
- 如果我们保存第0、1、2、3时刻的值,那第0.1、0.2、0.3……的值怎么保存呢?
- 如果我们保存第0.0、0.1、0.2、0.3时刻的值,那第0.01、0.02、0.03……的值怎么保存呢?
没办法,不可能完全保存起来(除非用类似磁带的装置)。
类似上面提到的这种保存间隔相等时间时刻的函数值的这种方式,叫作采样(Sampling)。
通常,我们把1秒内的采样个数叫作采样率,单位是赫兹(Hertz,Hz)。采样值的范围叫作量化精度。采样率越高,就越能还原出更加原始的波形。
比如上面的第0.0、0.1、0.2、0.3……0.9秒采集一共10次,那么它的采样率即是:10Hz。
这种被采样而来得到的数据是离散的,是数字量。
这种工作通常通过**模数转换器(AD)**采样而来,比如 ADC0809
就是一款非常普通的8位模数/数模芯片。
CD唱片的采样
国际标准的CD音质的唱片的采样率是44KHz,量化精度是16位(0~65525 或 -32768~32767),双声道立体声(2.0)。
结语
我将在下一篇文章将用代码来简单模拟一下声音的产生———弹奏一段五线谱曲子。