首页 > > > 11284 怎样从二进制数据分辨单声道与双声道音频
本文是下面这篇文章的延伸:
王赟 Maigo:10676 怎样暴力读取二进制数据文件
在上周的工作中,我遇到了这样一个需求:我从一个程序运行的中间过程中截获了一段二进制数据。我知道数据的内容是一段音频波形,但并不知道其具体格式。我该如何打开它呢?
音频波形的格式,主要包括以下三个参数:
● 声道数:是单声道还是双声道;
● 采样率:每个声道每秒钟有多少个采样点;
● 采样点格式:常见的格式包括 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 采样的音频,它的各个采样点为
。如果把它当成双声道、8 kHz 采样打开,则会得到两个声道,其中左声道为
,右声道为
。
不难看出,两个声道的内容都可以看成是把原信号直接降采样得到的结果。数字信号处理的理论告诉我们,在对一个信号降采样之前,需要先进行低通滤波,否则信号的频谱会发生混叠(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 采样的音频,它的左声道为
,右声道为
。把它当成单声道、16 kHz 采样打开,则会得到这样一段信号:
。这段信号应该怎么分析呢?
我们当然可以把它当成
与
两段信号的叠加。不过,双声道音频的两个声道往往大同小异,这两个信号在叠加时,会发生类似于「干涉」的现象,不太好分析。为了避免「干涉」效果的影响,我们把原信号的左、右两个声道都分解成「同」的部分与「异」的部分的组合:
,
。这里,信号
与
的相关性就比原先的两个声道弱多了。信号
和
分别称为「中置声道」和「侧边声道」;下面的视频就展示了双声道、8 kHz 采样的《好汉歌》(3a) 的中置声道 (3b) 与侧边声道 (3c) 的内容。可以注意到,人声成分几乎完全包含在中置声道里,侧边声道中只含有一点儿混响 —— 这正是「两声道相减消除人声」背后的原理。
中置声道与侧边声道https://www.zhihu.com/video/1091687799992029184经过了上述分解,以单声道、16 kHz 采样格式打开时得到的信号,就可以看成是如下两段信号的叠加了:

其中第一部分
,可以看成是 8 kHz 采样的中置声道
升采样至 16 kHz(得到
)后,再与信号
卷积的结果。下面的视频展示了这一变化过程。视频中 (4a) 是原始的、8 kHz 采样的中置声道
,其频谱范围为 0 ~ 4 kHz。升采样操作得到 (4b),它将频谱范围扩展到 0 ~ 8 kHz,其中 4 ~ 8 kHz 部分的频谱,就是把 0 ~ 4 kHz 的频谱翻折上去得到的。翻折上来的频谱在听觉上会表现为高频杂音;由于原始信号
中往往最低频处能量最高,这个杂音也往往集中在最高频处。之后与信号
卷积得到 (4c),这一步卷积相当于低通滤波,它会加强低频段处原有的频谱,而削弱高频段处翻折上去的频谱。上一步产生的高频杂音,此时就被大大地削弱了。
中置声道的变化过程https:// 而第二部分
,则可以看成是 8 kHz 采样的侧边声道
升采样至 16 kHz 后,再与信号
卷积的结果。这一变化过程由下面的视频演示。与中置声道不同的是,信号
是一个高通滤波器,它会削弱低频段处原有的频谱,而增强高频段处翻折上去的频谱,所以升采样产生的高频杂音愈发明显。
侧边声道的变化过程https://把中置声道和侧边声道的变化结果叠加起来,得到的信号如下面视频中 (6c) 所示。这就是把双声道音频当成单声道打开的总效果。从听觉上讲,信号 (6c) 中有一个贯穿始终的高频杂音,它主要来自原始信号的侧边声道。从视觉上讲,信号 (6c) 的语谱图乍一看是上下对称的,但仔细看能发现很多不对称之处,比如 1 秒处低频段人声的谐波很明显,但高频段处则没有与之对称的谐波。这是因为,低频段处的信号主要来自中置声道,而高频段处的杂音主要来自侧边声道。
中置声道与侧边声道变化的叠加https://总结一下本文两部分的结论:
● 把单声道音频当成双声道打开,会发生混叠现象,但这种混叠往往很微弱,仅靠听觉注意不到,必须用眼睛观察语谱图才能发现;
● 把双声道音频当成单声道打开,会产生明显的异常:用耳朵听会发现有持续的高频杂音,用眼睛观察会看到语谱图近似呈上下对称状。
据此,在不知道一段音频是单声道还是双声道时,可以先按单声道格式打开。如果听起来有高频杂音、语谱图近似呈上下对称状,则说明音频实际上应该是双声道格式;否则音频就是单声道无误了。
原文作者:;如有侵权,请联系管理员删除。