5、day05音频 | How does audio works ?

    技术2025-04-16  11

    谈到音频,得先说一下麦克风和录音机工作原理

    1、麦克风

    当对着麦克风唱歌时,产生的声波使膜片振动,与膜片相连的线圈也跟着一起振动,线圈在磁场中切割磁感线,能产生随着声音变化而变化的电流,经过放大后,通过扬声器还原成声音.因此麦克风的工作原理是电磁感应.

    2、录音机

    OK

    声音首先要经过采样,也就是类似于数学中的割圆法 求 圆形的面积。其中涉及到采样频率和采样位数。 采样频率是1 s 内采集“声音”信号的次数,一般用赫兹(hz)作单位,500hz = 0.002s ,表示1秒内采集500次。 采样位数是用来表示每次采样信号的 “振幅”,就相当于把这些信号量级化了,有了各自的等级。16bits 可以表示2^8 个量级,尺子精度够人耳听了。

    别人把采样和量化的过程比作,单位时间测量的次数越频繁,拿的“尺子”越准确,就越接近原声音。

    我们知道,声波是有频率的,声波频率是1s内这个声波的周期性振动次数,比如,同样是正弦波的下图: 可见,波1的频率小一些,波2的频率大一些。 采样频率与声波频率之间有一定的关系,根据奈奎斯特理论,只有采样频率高于声音信号最高频率的两倍时,才能把数字信号表示的声音还原成为原来的声音。 于是我们可以制造256hz的正弦波,采样频率是4000 即,1s内采样的个数,除以,1s内正弦波完成周期振动次数 就等于256hz正弦波在每次周期振动中的采样数 4000/256 就是 每次周期的采样数 wave Period

    DirectSound是在Windows的窗口上进行工作的,所以本次在创建窗口后添加DirectSound初始化,Win32InitSound(); 主要步骤如下:

    Win32InitDSound(){ //1-加载dll //创建DirectSound对象,DS是面向对象的 //创建主缓冲区,这个是会输出到声卡的 //创建副缓冲区,我们写给主缓冲区的 //开始播放音频 }

    首先,制造正弦波数据需要用到高中三角函数知识: 产生正弦波的函数:

    for (int SampleIndex = 0; SampleIndex < SoundBuffer->SampleCount; ++SampleIndex) { real32 SineValue = sinf(tSine); int16 SampleValue = (int16)(SineValue * ToneVolume); *SampleOut++ = SampleValue; *SampleOut++ = SampleValue; tSine += 2.0f* Pi32 *1.0f / (real32)WavePeriod; }

    可以看到,用sinf(2π/ 周期采样数),括号内计算的是一个2π周期内的单位采样间隔,就可以利用采样频率计算出对应的sin函数的值,再进行放大输出。

    Processed: 0.013, SQL: 9