一. 前言
从接触音视频这行开始,就会时不时在资料查找过程中看到许多关于频域分析的文章,奈何自己大学没有好好学习信号与系统及数字信号处理这两门专业课,每次对于这类文章都是一脸懵逼,于是今年年初决定好好把这两门课程重新学习一下并在工程里做一些尝试,这篇文章会对一段有噪声的音频信号进行噪声去除处理以及一个音频均衡器的简单实现,文末会给出iOS平台的Demo
二. 理论
提一下自己觉得比较重要的理论知识,信号小白可以自行去了解
- 冲激函数与阶跃函数
- 卷积
- 连续傅里叶变换
- 采样定理
- 拉普拉斯变换与z变换
- 离散傅里叶变换与快速傅里叶变换
- FIR滤波器与IIR滤波器
1-5是信号与系统里的知识点,6.7是数字信号处理里的,看书看不懂的同学,我个人推荐可以去B站看看西电.浙大的信号与系统课程,或者是华东与北交的数字信号处理课程,或者是我同事的博客,博客链接在最下方
三. 去噪
首先我们对一段音频信号进行加噪声,然后分别听一听原始音频与加噪声后的音频区别,加完噪声的音频有点刺耳,请大家先调低自己电脑的音量,以免对耳朵造成伤害,在下等级不够,无法上传音频,我哭了,只能放在Demo里了
- 未加噪声的音频(工程路径下的origin.wav文件)
- 加了噪声的音频(注意稍微调低电脑音量!!!!重要的事情说NNNNN遍遍遍!!工程路径下的noise.wav文件)
我们来对比一下原始信号与加完噪声信号的时域波形,如图1,左边为原始音频信号,右边为加噪声后的音频信号
图1.png可以看到,区别很大,但是想要去除噪声,有点无处下手,接下来我们将这两段音频分别放到频域来看看,如图2,左边为原始音频信号的频谱图,右边为加噪声音频的频谱图
图2.png
频谱图中很容易看出,加了噪声的音频在x轴正负12000的位置有多余数据,这正是我加的噪声的频率,因此我们做一个频域滤波,设计一个低通滤波器,滤除大于12000赫兹的频率,这里我们使用matlab生成一个通带截止频率在11000赫兹,阻带衰减为60dB,阻带截止频率在12000赫兹的巴特沃斯低通滤波器,接着来看看这个滤波器的频响图,如图3
图3.png可以看到,在x为0.544时,也就是频率为0.544 * 22050 = 11995 约为12000赫兹时,y衰减了60dB,这里为什么乘22050呢,是因为我们的音频文件的采样率为44100,根据采样定理可知,我们能获得的最大频率为44100/2 = 22050,也就是说图3的x轴的1.0就代表了22050赫兹。
接着说说dB这个单位的由来,其公式是dB = 20lg|H(jw)|,假设为-20dB,那么代表了lg|H(jw)|= -1,|H(jw)| = 0.1,也就是说能量衰减为原来的百分之10,假设为-40dB,代表了能量衰减为原来的百分之1
最后我们来看看用滤波器滤除噪声后的音频频谱图,如图4
图4.png右边为经过低通滤波器后的频谱图,可以看到,和原始音频频谱图区别不大,接下来让我们听听滤波之后的音频文件(工程路径下的iir.wav文件)
四. 音频均衡器
原理其实还是跟上面一样,就是对于不同频段的音频,给予滤除或者是增益,比如我的Demo里是一个三分频的均衡器,也就是一个低通滤波器+带通滤波器+高通滤波器的组合,具体的过程和原理,在我同事的博客中有详细描述,后面会给出链接
记录一下自己遇到的问题,matlab生成的滤波器系数,默认只精确到了小数点后4位,不一会就出现了溢出情况,于是修改matlab的滤波器系数,使其尽可能多的表示小数点后的位数,并将小数的表示由float替换位double,结果才正常
五. 参考
我同事的博客,博客中有很多关于信号基础理论的讲解及音频均衡器的实现原理
六. Demo
iOS平台的一个音频去噪与均衡器的Demo,实际上就是实现了一个IIR滤波器,先通过matlab生成滤波器系数,初始化后对pcm进行处理,链接:Demo
网友评论