ITPub博客

首页 > > > 11284 怎样从二进制数据分辨单声道与双声道音频

11284 怎样从二进制数据分辨单声道与双声道音频

作者:格伯纳 时间:2019-03-20 14:17:46 0 删除 编辑

  本文是下面这篇文章的延伸:

王赟 Maigo:10676 怎样暴力读取二进制数据文件​zhuanlan.zhihu.com图标

零、引言

  在上周的工作中,我遇到了这样一个需求:我从一个程序运行的中间过程中截获了一段二进制数据。我知道数据的内容是一段音频波形,但并不知道其具体格式。我该如何打开它呢?

  音频波形的格式,主要包括以下三个参数:

  ● 声道数:是单声道还是双声道;
  ● 采样率:每个声道每秒钟有多少个采样点;
  ● 采样点格式:常见的格式包括 8 位有符号整型、16 位有符号整型、32 位浮点型,还有 μ-law、A-law 两种压缩格式。

比如,用 Cool Edit Pro 打开一个没有文件头的 wav 文件时,它就会询问你上面三个参数。

  用之前那篇文章的方法,可以辨别三种非压缩的采样点格式(两种压缩格式暂不考虑)。采样率也比较容易试探出来:常见的采样率有两个系列,一个是 11025 Hz、21050 Hz、44100 Hz;另一个是 8000 Hz、16000 Hz。如果用错误的采样率来播放音频,那么音频的音高和速度都会明显不对。如下面的视频所示,原始音频 (1a) 是 11025 Hz 采样的刘欢《好汉歌》的第一句。如果播放时的采样率过高(1b, 16000 Hz),放出来的声音就会尖利、迅速,刘欢的歌声就会变成李娜;如果播放时的采样率过低(1c, 8000 Hz),放出来的声音则会低沉、缓慢,刘欢的歌声就变成了崔健。

播放音频时采样率错误的效果https://www.zhihu.com/video/1091687684166266880

  比起采样点格式和采样率,声道数猜测起来则比较困难。比如,一段音频应该是单声道、16 kHz 采样,还是双声道、8 kHz 采样的呢?这篇文章,就来讲解如何利用信号处理的知识,结合人类的听觉与视觉,分辨一段二进制数据是单声道还是双声道音频。如果你刚刚学过数字信号处理课程,本文的内容将是一个非常好的练习。

  本文的主体部分将解答下面两个问题:

  ● 如果把一段单声道、16 kHz 采样的音频当成双声道、8 kHz 采样打开,会发生什么?
  ● 如果把一段双声道、8 kHz 采样的音频当成单声道、16 kHz 采样打开,会发生什么?

当然,上面的 8 kHz、16 kHz 采样率也可以换成 11025 Hz、21050 Hz,或者 21050 Hz、44100 Hz。在这两个问题的答案的基础上,我会总结出辨别单声道与双声道音频的通用流程。

  本文中的视频都是用 Matlab R2017b 版本制作的,代码及使用的音频片断可以在这里下载。

一、把单声道音频当成双声道打开,会怎样?

  假设我们有一段单声道、16 kHz 采样的音频,它的各个采样点为 x_0, x_1, x_2, x_3, x_4, x_5, \ldots 。如果把它当成双声道、8 kHz 采样打开,则会得到两个声道,其中左声道为 x_0, x_2, x_4, \ldots ,右声道为 x_1, x_3, x_5, \ldots 。

  不难看出,两个声道的内容都可以看成是把原信号直接降采样得到的结果。数字信号处理的理论告诉我们,在对一个信号降采样之前,需要先进行低通滤波,否则信号的频谱会发生混叠(aliasing)。这种低通滤波也称为「抗混叠滤波」(anti-aliasing filtering)。例如,一段 16 kHz 采样的信号,其频谱范围为 0 ~ 8 kHz(负频率部分省略,下同)。如果直接把它降采样至 8 kHz,那么 4 ~ 8 kHz 这部分频谱就会被翻折到 0 ~ 4 kHz 的频段去,与原有的频谱混叠;翻折下来的频谱,听起来就会表现为杂音。若要消除这种杂音,就需要在降采样之前,先用一个截止频率为 4 kHz 的滤波器对信号进行滤波。

  下面的视频中,(2a) 是单声道、16 kHz 采样的《好汉歌》,(2b) 是把它当成双声道、8 kHz 采样打开后的效果。从语谱图上可以隐约看到 1 秒及 4 秒处产生了混叠现象:高频处有一些谐波产生了交叉。语音的各次谐波本应具有相同的走向,要么一起上升,要么一起下降;这种交叉,就是 4 kHz 以上的频谱被翻折下来的结果。不过,由于语音、音乐等常见声音信号里低频段的能量往往显著高于高频段的能量,把单声道音频当成双声道打开造成的混叠现象往往不明显。本例中的混叠,必须要靠观察语谱图才能看出来,仅靠听觉是完全注意不到的。

  作为参考,视频中的 (2c) 是把 16 kHz 采样的《好汉歌》按照正确方式(即先进行抗混叠滤波)降采样至 8 kHz 的效果。它的频谱比 (2b) 要「干净」一些,这正是因为没有发生混叠现象。

把单声道音频按双声道打开的效果https://www.zhihu.com/video/1091687762570448896

二、把双声道音频当成单声道打开,会怎样?

  假设我们有一段双声道、8 kHz 采样的音频,它的左声道为 L = l_0, l_1, l_2, \ldots ,右声道为 R = r_0, r_1, r_2, \ldots 。把它当成单声道、16 kHz 采样打开,则会得到这样一段信号: l_0, r_0, l_1, r_1, l_2, r_2, \ldots 。这段信号应该怎么分析呢?

  我们当然可以把它当成 l_0, 0, l_1, 0, l_2, 0, \ldots 与 0, r_0, 0, r_1, 0, r_2, \ldots 两段信号的叠加。不过,双声道音频的两个声道往往大同小异,这两个信号在叠加时,会发生类似于「干涉」的现象,不太好分析。为了避免「干涉」效果的影响,我们把原信号的左、右两个声道都分解成「同」的部分与「异」的部分的组合: l_i = c_i + d_i , r_i = c_i - d_i 。这里,信号 C = c_0, c_1, c_2, \ldots 与 D = d_0, d_1, d_2, \ldots 的相关性就比原先的两个声道弱多了。信号 C 和 D 分别称为「中置声道」和「侧边声道」;下面的视频就展示了双声道、8 kHz 采样的《好汉歌》(3a) 的中置声道 (3b) 与侧边声道 (3c) 的内容。可以注意到,人声成分几乎完全包含在中置声道里,侧边声道中只含有一点儿混响 —— 这正是「两声道相减消除人声」背后的原理。

中置声道与侧边声道https://www.zhihu.com/video/1091687799992029184

  经过了上述分解,以单声道、16 kHz 采样格式打开时得到的信号,就可以看成是如下两段信号的叠加了:

\begin{array}{rrrrrrrrr} & & l_0, & r_0, & l_1, & r_1, & l_2, & r_2, & \ldots \\ & = & c_0, & c_0, & c_1, & c_1, & c_2, & c_2, & \ldots \\ & + & d_0, & -d_0, & d_1, & -d_1, & d_2, & -d_2, & \ldots \end{array} \\

  其中第一部分 c_0, c_0, c_1, c_1, c_2, c_2, \ldots ,可以看成是 8 kHz 采样的中置声道 C = c_0, c_1, c_2, \ldots 升采样至 16 kHz(得到 c_0, 0, c_1, 0, c_2, 0, \ldots )后,再与信号 1,1 卷积的结果。下面的视频展示了这一变化过程。视频中 (4a) 是原始的、8 kHz 采样的中置声道 C ,其频谱范围为 0 ~ 4 kHz。升采样操作得到 (4b),它将频谱范围扩展到 0 ~ 8 kHz,其中 4 ~ 8 kHz 部分的频谱,就是把 0 ~ 4 kHz 的频谱翻折上去得到的。翻折上来的频谱在听觉上会表现为高频杂音;由于原始信号 C 中往往最低频处能量最高,这个杂音也往往集中在最高频处。之后与信号 1,1 卷积得到 (4c),这一步卷积相当于低通滤波,它会加强低频段处原有的频谱,而削弱高频段处翻折上去的频谱。上一步产生的高频杂音,此时就被大大地削弱了。

中置声道的变化过程https://

  而第二部分 d_0, -d_0, d_1, -d_1, d_2, -d_2, \ldots ,则可以看成是 8 kHz 采样的侧边声道 D = d_0, d_1, d_2, \ldots 升采样至 16 kHz 后,再与信号 1, -1 卷积的结果。这一变化过程由下面的视频演示。与中置声道不同的是,信号 1, -1 是一个高通滤波器,它会削弱低频段处原有的频谱,而增强高频段处翻折上去的频谱,所以升采样产生的高频杂音愈发明显。

侧边声道的变化过程https://

  把中置声道和侧边声道的变化结果叠加起来,得到的信号如下面视频中 (6c) 所示。这就是把双声道音频当成单声道打开的总效果。从听觉上讲,信号 (6c) 中有一个贯穿始终的高频杂音,它主要来自原始信号的侧边声道。从视觉上讲,信号 (6c) 的语谱图乍一看是上下对称的,但仔细看能发现很多不对称之处,比如 1 秒处低频段人声的谐波很明显,但高频段处则没有与之对称的谐波。这是因为,低频段处的信号主要来自中置声道,而高频段处的杂音主要来自侧边声道。

中置声道与侧边声道变化的叠加https://

三、总结

  总结一下本文两部分的结论:

  ● 把单声道音频当成双声道打开,会发生混叠现象,但这种混叠往往很微弱,仅靠听觉注意不到,必须用眼睛观察语谱图才能发现;

  ● 把双声道音频当成单声道打开,会产生明显的异常:用耳朵听会发现有持续的高频杂音,用眼睛观察会看到语谱图近似呈上下对称状。

  据此,在不知道一段音频是单声道还是双声道时,可以先按单声道格式打开。如果听起来有高频杂音、语谱图近似呈上下对称状,则说明音频实际上应该是双声道格式;否则音频就是单声道无误了。

原文作者:;如有侵权,请联系管理员删除。

上一篇: true or false?
请登录后发表评论 登录
全部评论
管理员

注册时间:2018-03-30

  • 博文量
    2383
  • 访问量
    984149