djk3000 / ME

4 stars 2 forks source link

音频动画原理及实现 #116

Open djk3000 opened 1 year ago

djk3000 commented 1 year ago

基本概念

我们平时听到的声音,都是连续的,都是模拟信号,在计算机中我们需要将他变为数字信号。 声音的频率一般会以赫兹表示,记为Hz,指每秒周期性震动的次数。

声音的原理

  1. 频率-声波的频率,即声音的音调,音调越高,频率越大;音调越低,频率越小。
  2. 振幅-声音的高低,即音量(响度)越大,振幅越大;音量越小,振幅越小
  3. 波长-声音的音色,即音调越高,波长越短;音调越低,波长越长。

    数字音频基本概念

  4. 采样-在时间轴上对信号进行数字化。根据奈奎斯特定律(也称作采样定律),按照比声音最高频率的2倍以上进行采样。采样频率一般为44.1kHz,这样可保证声音达到20kHz也能被数字化。44.1kHz就是代表1秒会采样44100次。
  5. 量化-将时间连续信号转换为时间离散信号,并用实数表示。
  6. 编码-采样和量化后的信号还不是数字信号,需要将它转化为数字编码脉冲,这一过程称为编码。模拟音频进采样、量化和编码后形成的二进制序列就是数字音频信号。

    PCM

    • PCM(Pulse Code Modulation),即脉冲编码调制,对声音进行采样、量化过程,未经过任何编码和压缩处理。
    • PCM音频数据是未经压缩的音频采样数据裸流,它是由模拟信号经过采样、量化、编码转换成的标准的数字音频数据。
    • PCM是在录制音频是对连续音频信号抽样,以0和1的数字形式记录,所以PCM不是连续音频。

      PCM数据常用量化指标

    • 采样率(Sample rate): 每秒钟采样多少次,以Hz为单位。
    • 位深度(Bit-depth): 表示用多少个二进制位来描述采样数据,一般为16bit。
    • 字节序: 表示音频PCM数据存储的字节序是大端存储(big-endian)还是小端存储(little-endian),为了数据处理效率的高效,通常为小端存储。
    • 声道数(channel number): 当前PCM文件中包含的声道数,是单声道(mono)、双声道(stereo)?此外还有5.1声道等。
    • 采样数据是否有符号(Sign): 要表达的就是字面上的意思,需要注意的是,使用有符号的采样数据不能用无符号的方式播放。 以FFmpeg中常见的PCM数据格式s16le为例:它描述的是有符号16位小端PCM数据。 s表示有符号,16表示位深,le表示小端存储。

音频动画相关

因为PCM所采集的数据只是时间上的振幅波动,它是二进制的,它是时域的。如果我们需要进行对他进行画图的话,我们需要将这个时域数据转换为频域数据方便后续计算。这时候就需要傅里叶变换。

先介绍两个词 1.时域(录音)二进制 横轴是时间,纵轴是信号强度

2.频域(傅里叶变化后) 横轴是频率,纵轴是该频率信号的幅度 将一个表示波的函数从时域(时间与振幅的关系)转化为频域(频率与振幅的关系)傅里叶变化

image

傅里叶变换

用于信号在时域和频域之间的变换。 具体的傅里叶原理还是看别人的深入浅出解释

音频频谱动画实现

这里可以参考: 一步一步教你实现iOS音频频谱动画(一) 一步一步教你实现iOS音频频谱动画(二) 这里先AVAudioEngine获取音频的数据->然后通过FFT傅里叶变换转换为频域数据->最后将数据做一系列处理后变化为动画。

参考资料