音频数字信号处理AudioDSP(DigitalSignalProcessing)是一个复杂而专业的课题。一种实时分析识别特定频率信号的方法,对应代码为html5网页版(便携版),可在浏览器中运行;它可用于识别环境中特定频率的声音、噪音和乐器演奏音调。在线测试:FFT频域分析ECharts频谱曲线900Hz频率摩尔斯电码声音频谱曲线,为本文主要分析对象,请参考文末生成LOVE对应的编码音频文件,然后拖入把文件放到上面的在线测试页面,可以得到这张图:Guitar6开弦音频频谱曲线:1.网页中的音频数据源H5网页中至少有三种获取音频数据的方式:下载音频文件二进制内容(xhr,fetch)通过网络请求input[type=file]选择一个文件,用FileReader读取得到二进制内容,通过浏览器的getUserMedia接口访问设备的麦克风,记录音频二进制内容不同的音频格式有不同的压缩编码方式,为了得到文件中的音频数据,我们需要对音频文件进行解码,得到音频采样数据(PCM),进行下一步;.wav格式文件的解码很简单,一般是由wav头+pcm数据组成,直接去掉wav头解码后,其他文件可以直接解码成32位的pcm,然后通过转换成16位的pcmAudioContext的decodeAudioData方法。得益于现代浏览器的WebRTC功能,网页也可以实现丰富的音视频交互,可以实现网页录制,实时采集环境中的声音获取pcm数据,GitHubRecorder是一个功能丰富的开源库H5网页录音,可以方便的实时处理录音数据。2.FFT:时域转频域我们得到音频采样数据(PCM)后,直接根据数值的大小绘制数据,就可以得到一个声音的波形,就是声音的时域波形audio:Horizo??ntal坐标为时间,纵坐标为采样值的大小,例如在Audition中显示如下图(生成此音频文件见文末)。在时域波形上,我们可以直观地知道某个时间点是否有声音,以及声音的大小,但不知道这个声音是我们需要的信号还是其他噪声;数字信号分析的亮点在这里:FFT,快速傅里叶变换。通过FFT可以将单个时域波形分解成N个不同频率的波形,将时域信号转化为频域信号。N取决于fftSize的大小。例如fftSize=1024,将得到512个频率分量;在Audition中,可以很直观的感受到频域信号的强度分布,如下图,900Hz的信号很亮(生成这个音频文件见文末)。H5js版本中FFT的实现有很多开源代码,也可以直接使用浏览器提供的AudioContext的createAnalyser接口进行频域数据变换;Recorder库提供了两个可以使用的FFT实现:extensions/lib.fft.js、dsp.lib.fft_exact.js,在上面的在线测试中可以看到这两个文件。js版的FFT变换操作也比较简单。Audition中使用的音频文件,将网页中变换后得到的频域数据叠加绘制在一起,得到文章开头的第一条摩尔斯电码声谱曲线,信号非常清晰。3、信号特性分析以文章开头的“900Hz频率摩尔斯电码声谱曲线”为例。通过频谱分析,我们可以直观的看到信号最强的频率峰值,能量非常集中,频率值分散在900Hz附近,也就是说信号的主要频率在这个音频约为900Hz,这与实际生成此摩尔斯电码所用的900Hz频率一致。分析得到了主频。我们只关注这个主频的波形曲线,也可以直观地看到符合摩尔斯电码规律的特征:持续时间短的是一个下降(.),持续时间长的是一个咔嗒(-),点击的长度是tick的3倍,tick之间的间隔是1tick的长度,字符之间的间隔是3tick的长度(单词之间的间隔长度大于7tick).4.信号识别和提取在分析了信号的特征后,就有了一种通过编写代码来识别和提取信号的方法。还是以上图为例,我们提取其中包含的摩尔斯电码。(1)过滤掉其他低能量值,只保留能量集中的少数频率(2)在程序代码中对这些频率进行综合分析判断,对每个峰值取与前一个频率相差不大的频率作为validPeak(这样可以有效消除杂波干扰)得到一条曲线(3)根据曲线中值的大小,较小的值全部视为0,较高的值保留,和最后转换成断续的矩形波,有波峰的地方就是有信号,可以识别每个波峰的持续时间,可以识别tick(.)tick(-),这就是摩尔斯电码。Q:为什么不用PCM的音量直接判断信号?A:最终的矩形波在时域上看起来与波形包络没有太大区别,因为记录的样本中没有比较大的背景噪声干扰;在没有噪声干扰的情况下,直接使用PCM采样值(或者提取信号也是可行的;但是在干扰比较大的情况下(最后的噪声),很难区分是不是正确的信号在时域,在频域分离出的波形更能反映原始信号,如果要根据声音的频率来判断是什么信号,就必须转向频域来识别和处理。比如乐器的音高在时域上根本无法识别,附件Recorder用于html5录音:https://github.com/xiangyuecn/Recorder,在网页实时录音获取音频数据。趣味摩斯电码:小程序、微信版和字节抖音版,将文字LOVE转换成摩斯电码播放,录制上面使用的摩斯电码音频;内置对码翻译功能,可以实时录制音频并解析出代码,本文总结的内容是将其音频识别的原理转化为代码。【超过】
