soapgu/PlayPen

音频可视化(一)——理论基础及基本概念

soapgu opened this issue · 0 comments

  • 什么是音频可视化?

首先音频可视化不是一个“新兴概念”
回想我大学时代的时候,Winamp播放器播放mp3音乐大行其道
图片
这块区域其实就是音频可视化,随着音乐的播放,绿色的柱子也会随之一起跳动
当然同时代的WMP(windows media player)要做得再好一点,效果再酷炫一些
图片

好了,什么是音频可视化,度娘百科有解释

音乐可视化,是指一种以视觉为核心,以音乐为载体,以大众为诉求对象,借助多种新媒体技术等传播媒介,通过画面、影像来诠释音乐内容的、视听结合的大众化传播方式。 [1] 它能为理解、分析和比较音乐艺术作品形态的表现力和内外部结构提供的一种直观视觉呈现的技术

接下来说人话:就是用图像动画视觉化的表现来表达声音

那从声音变成视觉化的图形,这个转换逻辑是什么那?这究竟是一个什么样子的过程那?
这就是本篇Blog的目标,同时本篇Blog先尽量回避代码实现领域,以理论原理为主
当然在研究的过程中发现其实是一个大坑

  • 声音是什么?

好了,众所周知的知识我就略略讲一下。
声音是振动,同时是通过声波形势来传播的,声波是纵波。
然后你的耳朵就能听到声音了
image

  • 好了那么电脑设备怎么听声音那?

声波是机械波,电脑肯定不能直接听得到。还需要借助麦克风(拾音器)。
麦克风的原理是用到了电磁感应原理
图片
其实一个麦克风就是一个微型发电器,产生了声音感应电流

麦克风将声波信号转化成模拟电信号已经完成了他的使命,但是这里仍然是模拟信号,怎么转换成数字信号那?

  • PCM编码

PCM编码是电脑另外一个外设——声卡帮我们完成的。
PCM编码的过程就是从模拟数据到数字化的过程
首先了解几个概念

  • Sample
    采样,信号处理中,采样就是将连续时间的信号减少成离散时间的信号

  • Sample Rate
    采样率就是每秒中对音频采样的次数
    采样率表示音频信号每秒的数字快照数。该速率决定了音频文件的频率范围。采样率越高,数字波形的形状越接近原始模拟波形。低采样率会限制可录制的频率范围,这可导致录音表现原始声音的效果不佳。
    图片

采样率越高,声音越保真,但是也是代价越高,造成录音的容量和编码运算能力也越高,这里肯定是取一个平衡的策略
常规的采样频率有 8K、16K、32K、44.1K、48K

  • Audio bit depth
    也叫采样大小,一个采样用多少bit存放,一般是16bit

  • Channel
    声道数:单声道、双声道、多声道

  • Bit Rate
    比特率是指每秒传送的比特(bit)数。单位为 bps(Bit Per Second),比特率越高,传送数据速度越快。声音中的比特率是指将模拟声音信号转换成数字声音信号后,单位时间内的二进制数据量,是间接衡量音频质量的一个指标。
    比特率(bps) = 采样频率 × 采样位数 × 声道数

  • WAV文件以及格式
    PCM本身是纯的音频数据,没有任何的格式。
    WAV是一种多媒体文件格式, 既可以存储原始数据 也可以存储压缩数据,就是在PCM原始数据上加了一个header,方便识别处理
    图片
    这里暂时不深入展开了

PCM是有损编码,通过采样率来提高精确度
图片

那么PCM的数据是什么样子的那?
他就是一个根据时间来记录一段变化曲线
图片
就像这样!

这难道就是音频可视化吗?弄了半天你让我看这个?
图片

但 pcm 表示各采样时间点上音频信号强度,看起来杂乱无章,难以体现听觉感知到的声音变化。pcm 数据仅可用来绘制体现音频信号平均强度变化的可视化动效。

  • 全混在一起怎么摘出来?

事实上一段PCM数据只记录了时间线上振动的变化,这里你无法分辨出来,这是汽车喇叭的声音、说话的声音、咳嗽的声音等等。但是我们的大脑可以。这个魔术是怎么实现的那?

  • 傅里叶登场

是的到这里实在绷不住了,必须要大神出来镇场面了。
傅里叶函数、傅里叶变换绝对是大学的几大劝退梦魇之一的存在!

  1. 先接受一下魔幻的设定,任何波形都可以通过一定数量的正弦波的合成实现,不管怎么觉得别扭,反正他可以做到

图片

image

这样造成的直接后果就是复杂度的拆解,我们知道正弦波是简单波形。这样我们研究的对象就从一个复杂的波变成了N个正弦波

  1. 时域变频域
    这是一个坐标系的改变
    图片
    可以想像某个时刻时间静止,这个瞬间的频域数据展现

  2. 频域的表达形式

正弦波三要素:频律(波长)、振幅、相位
频律(波长)就是Hz,人可以听到20~20KHz的声音,超出部分是超声波,这可以看出声音是高音还是低音
振幅相对“单纯”,就是强弱,表现形式就是轻和响。
相位相对来说玄一点,但是也不能算难

开启尘封的记忆,让我们回到高中的——复数!
图片
从数形角度来看,实数是一根线,而复数是整个平面,生生提高了一个维度!

我们知道正弦波可以用三角函数来表达,相位其实就是正弦波的相对位置,波的位置肯定讲究,在振幅0的位置和最高处肯定效果不一样的!
这样复数可以完美表达,上一张图体会下
图片

  • 为啥要学这么复杂?

那是因为我第一次见到有虚数的API😭😡,反向倒逼!

图片

  • 从理想模型到真实数据

  1. 真实的自然声音是连续非周期
    不可能是理想模型下的“稳定”的正弦波组合。可以理解为每一个瞬间都是有一组正弦波组合,但是下一个时序正弦波组合会发生变化
  2. 真实的自然声音不存在“纯”的高音、中音、低音,区别在于配比而已
  • 总结梳理

接下来进行一个小结,怎么从声音到可视化的过程

  1. 声音产生振动,振动产生声波进行传输
  2. 麦克风通过电磁感应把声波转换成感应电流
  3. 感应电流通过声卡进行采样和编码变成PCM数据
  4. PCM数据进行傅里叶变换转换成频域数据
  5. 通过复数表达可以获得频率、振幅、相位三要素
  6. 进行可视化绘制

其实频域分析还是有点抽象,下面有个实验场景可以类比傅里叶变换
图片
稜镜实验,这里自然光是电磁波,类比原始脉冲波
折射出来的光谱就是傅里叶变换
只可意会不可言传!

  • 参考文献

太多了,我慢慢补……