音频数字信号处理 Audio DSP (Digital Signal Processing) 是一个简单又业余的话题,本文介绍的是如何从音频中实时剖析和辨认出特定频率信号的一种办法,对应的代码为可运行在浏览器中的html5网页版(可移植);可用于辨认环境中特定频率的声音、或噪声、乐器弹奏的音调。
在线测试:FFT频域剖析ECharts频谱曲线图
900Hz频率的摩尔斯电码声音频谱曲线,为本文的次要剖析对象,请见文末生成LOVE对应的电码音频文件,而后把文件拖入下面的这个在线测试页面,即可失去此图:
吉他6根空弦音频谱曲线:
一、网页中的音频数据源
H5网页中获取音频数据的办法至多有三种:
- 通过网络申请下载失去音频文件二进制内容(
xhr
、fetch
) - 通过
input[type=file]
抉择文件,在用FileReader
读取取得二进制内容 - 通过浏览器的
getUserMedia
接口拜访设施的麦克风,录制失去音频二进制内容
不同音频格式有不同的压缩编码方法,为了失去文件内的音频数据,咱们须要解码音频文件,失去音频的采样数据(PCM
)才好进行下一步解决;.wav
格局的文件解码简略,它是个别是由wav头+pcm数据组合而成的,间接去掉wav头即实现解码,其余文件可通过AudioContext
的decodeAudioData
办法间接解码成32位pcm再转成16位pcm。
得益于古代浏览器的WebRTC
性能加持,网页也能实现丰盛的音视频交互,能够实现网页录音,实时采集环境中的声音失去pcm数据,GitHub Recorder是一个功能丰富的H5网页录音开源库,能够不便的进行实时处理录音数据。
二、FFT:时域转频域
咱们失去音频的采样数据(PCM
)后,能够将此数据按值的大小间接绘制进去,即可失去一个声音的波形,此波形为音频的时域波形:横坐标是工夫,纵坐标是采样值的大小,比方在Audition
中显示如下图所示(生成此音频文件请见文末)。
在时域波形上,咱们能直观的晓得在某个工夫点是否有声音,和声音的大小,但不晓得这个声音是否是咱们须要的信号,还是其余杂音;数字信号剖析的重头戏出场了:FFT,疾速傅里叶变换。
通过FFT能够将单个时域波形分解成N个不同频率的波形,即时域信号变换成频域信号,N取决于fftSize的大小,比方fftSize=1024
,将失去512
个频率重量;在Audition
中能够十分直观的感触到频域信号的强度散布,如下图所示,900Hz的信号十分亮(生成此音频文件请见文末)。
H5 js版的FFT的实现有很多开源代码能够参考,或者间接应用浏览器提供的AudioContext
的createAnalyser
接口来进行频域数据变换;Recorder库中的提供了2个FFT实现能够应用:extensions/lib.fft.js
、dsp.lib.fft_exact.js
,到上文中的在线测试中能够看到这两文件。
js版的FFT变换操作也比较简单,Audition
中用到的这个音频文件,在网页中通过变换后失去的频域数据,叠加绘制到一起即失去了文章结尾的第一张摩尔斯电码声音频谱曲线图,信号非常明显。
三、信号的特征分析
以文章结尾的“900Hz频率的摩尔斯电码声音频谱曲线图”为例,咱们通过频谱剖析,能够直观的看到信号最强的频率波峰,能量十分集中,频率值扩散在900Hz左近,也就是说这段音频中信号的次要频率为900Hz左右,和理论生成此摩尔斯电码所应用的900Hz频率统一。
剖析失去了次要频率,咱们只关注这个次要频率的波形曲线,也能直观的看出和摩尔斯电码法则统一的特色:持续时间短的是滴(.),持续时间长的是嗒(-),嗒的长度是滴的3倍,滴嗒之间距离1个滴的长度,字符之间距离3个滴的长度(单词之间距离7个滴以上的长度)。
四、信号的辨认提取
剖析出信号的特色后,就有方法通过编写代码来进行信号的辨认和提取,仍旧是以上图为例,咱们来提取出外面蕴含的摩尔斯电码。
(1)过滤掉其余能量低的值,中只保留能量集中的几个频率
(2)程序代码中对这几个频率进行综合分析判断,每个波峰取和后面频率相差不大的频率当做无效波峰(这样可无效排除掉杂波烦扰),失去一条曲线
(3)依据曲线中的值的大小,较小的值全副当做0,高的保留,最终转换失去断断续续的矩形波,有波峰的中央即为有信号,失去每个波峰的持续时间,即可辨认出滴(.)嗒(-),即为摩尔斯电码
Q: 为啥不必PCM的音量大小来直接判断信号?
A: 最初的矩形波看起来和时域的波形包络没有多大区别,这是因为录制的样本中没有比拟大的背景杂音烦扰;在没有杂音烦扰的状况下,间接用PCM的采样值(或音量)来提取信号也是可行的;但在有比拟大的烦扰的状况下(开端那段杂音),时域就很难辨别出是否是正确的信号,频域中分离出来的波形更能反映出本来的信号。
如果是要依据声音的频率来判断是什么信号,那就必须转到频域来辨认解决,比方乐器的音调,时域是齐全无奈辨认出是哪个调的。
附录
- Recorder用于html5录音:https://github.com/xiangyuecn/Recorder,网页中实时录制取得音频数据。
- 趣味摩尔斯电码:小程序,微信版和字节抖音版,将文本
LOVE
转换成摩斯码并播放,录制失去上文中应用的摩尔斯电码音频;内置电码翻译性能,能够实时录制音频并解析出电码,本文所总结的内容即为其音频辨认成电码所应用的原理。
【完】