波形声音编程的一点笔记

陪她去流浪 桃子 2019年02月23日 编辑 阅读次数:2768

声明

这篇文章是我自学波形声音相关的零散学习笔记汇总。我非专业人士,内容不完全保证正确性,请读者不要被误导。如果文章出现描述不清晰、知识错误,请在评论中批评指正,非常感谢。

文章起稿于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)。

结语

我将在下一篇文章将用代码来简单模拟一下声音的产生———弹奏一段五线谱曲子。

标签:音频