声音

2015年05月01日 06:55GMT+8

什么是声音

声音是由物体振动发生的, 正在发声的物体叫做声源。 物体在一秒钟之内振动的次数叫做频率,单位是赫兹,字母Hz.

声音是一种压力波, 声音作为波的一种,频率和振幅就成了描述波的重要属性, 频率的大小与我们通常所说的音高对应,而振幅影响声音的大小。

声音可以被分解为不同频率不同强度的正弦波叠加, 这种变换(或分解)的过程,称为傅立叶变换(Fourier Transform)。

变换的计算

x*sin(R) : 改变振幅(amplitude)

sin(R + PI) : 改变相位(phase)

sin(R * x) : 改变频率(frequency)

音调(频率),音量(振幅),音色(波形) 是声音的三个主要特征:

  • loudness(响度)通常叫:音量,由 amplitude(振幅)和人离声源的距离决定。单位:dB(分贝)

    Peak amplitude(峰值振幅或最高振幅), TODO: 值是 0 ~ 1. 0 用于控制音量大小,(峰值 * 幅值)???

    Amplitude value(幅度值,幅值)即合成波形的输出值

  • pitch(音调) 声音的高低(高音、低音),由频率(frequency)决定, 频率越高音调越高.

    frequency(频率) 每秒要取多少个幅度值, 单位: Hz(hertz(赫兹)).

    人听觉范围 20~20KHz. 20Hz 以下为次声波, 20KHz为超声波.

    Secret Rabbit Code 用于 sample rate conversion

  • Timbre(音色) 又称音品, 波形(waveform)决定了声音的音色, 音色本身是一种抽象的东西,但波形(waveform)是把这个抽象直观的表现.

    • Sine: 正弦,假设频率为 44100,则每 1 秒内声音从 -1.0 ~ 1.0 之间的值对应于 sin(0度 ~ 360度)

    • Square: 正方形

    • Triangle: 三角

    • Sawtooth: 锯齿

    • Noise: 噪声,即 -1.0 ~ 1.0 之间的随机值,这个最容易创建。

    // Noise
    for(p in 0...2048){
      var n = Math.random() * 2.0 - 1.0;
      event.data.writeFloat(n * 0.25); // 左声道
      event.data.writeFloat(n * 0.25); // 右, 0.25 表示假设峰值为 1.0 ,这里缩放 1/4
    }
    

在音乐入门的书籍里还会讲到音的长短,即音延续的时间

当两个物体碰撞后振动产生声音时,若两者振动频率比为不可化简的复杂比, 如:201:388,那么我们分辨出来会觉得这个声音刺耳; 相反,若两者振动频率比为可化简的简单比,如:3:7, 那么我们分辨出来会觉得很动听。(毕达哥拉斯发现)

numerical synthesis

数值合成,合成的值在 -1.0 ~ 1.0 之间

https://en.wikibooks.org/wiki/Sound_Synthesis_Theory/Oscillators_and_Wavetables

下边各公式的输入和输出值:

Input: Peak amplitude (A), Frequency (f)
Output: Amplitude value (y)

Sine wave

sin 函数返回的值刚好在 -1.0 ~ 1.0 之间,并对应于 0 ~ 360 度。

y = A * sin(phase)

phase = phase + ((2 * pi * f) / samplerate)

if phase > (2 * pi) then
      phase = phase - (2 * pi)

--[[
 f 表示音调对应的频率,可以在网上搜这些值。
音调    低    中    高
 DO   262   523   1046
 RE   294   587   1175
 MI   330   659   1318
 FA   349   698   1397
 SO   392   784   1568
 LA   440   880   1760
 SI   494   988   1967

实际上有一个公式: base * pow(2, n/12),如:
  262 * pow(2, 2/12) => 294.0850566570557
  262 * pow(2, 4/12) => 330.09931507245676
  262 * pow(2, 5/12) => 349.728041792549
-]]

一些波形生成示例: flash-wave/src/Wave.hx

其它

脉冲编码

脉冲编码调制(PCM:pulse code modulation). 计算机处理的是数值, 因此要使声音进入计算机,就必须设计一种能将声音与数字信号相互转换的机制.

PCM文件: 模拟音频信号经模数转换(A/D变换)直接形成的二进制序列,该文件没有附加的文件头和文件结束标志

PCM 是最常用、最简单的波形编码。它是一种直接、简单地把语音经抽样、 A/D变换得到的数字均匀量化后进行编码的方法,是其他编码算法的基础

  • 采样频率, 指每秒钟取得声音样本的次数, 采样频率决定声音可被数字化和储存的最大频率。

    取样频率必须是样本声音最高频率的两倍。这就是「Nyquist频率(Nyquist Frequency)」, 以30年代研究取样程序的工程师Harry Nyquist的名字命名。

    人耳可听到最高20kHz的声音,因此要拦截人能听到的整个声音范围,就需要40kHz的取样频率. 然而, 由于低通滤波器具有频率下滑效应,所以取样频率应该再高出大约百分之十才行。取样频率就达到了44kHz

    目前编程中大多使用: 44.1 kHz(CD音质), 22.05 kHz(FM广播音质), 11.025kHz(电话音质)的取样频率

    • 缓冲区大小(bufferSample): 在 flash 中分别对应为: 44.1 kHz/8192, 22.05 kHz/4096, 11.025kHz/2048
  • 采样位数, 例 16位 或 32 位。目前主流的为 32 位 float, 旧的可能为 16 位 Int.

    对于 float 类型,采样值在 -1.0 ~ 1.0 之间,而 16 位 Int 则在 -32768 ~ 32767 之间。

  • 声道数, 例: 单声道, 双声道,

    声道数 * 采样位数字节大小 * 取样频率 * 秒 = PCM 即 WAV 文件的大小

参考链接

AS3 参考手册 Sound 类里边的外链(中文)

英文: http://www.drpetter.se/article_sound.html

关键字搜索: 声音合成 滤波器声音的合成

其它

windows 上目前使用 XAudio2 用于替代 DirectSound 来做游戏相关的音乐效果