语音信号处理中的小波分解法降噪方法MATLAB例程
语音信号处理--降噪方法之小波分解法 MATLAB例程语音降噪这事儿日常太刚需了——打电话时的背景杂音、录音里的环境噪音都得想办法干掉。小波分解法算是语音降噪里的老牌选手了比起傅里叶只能看全局频率小波能同时抓时域和频域的局部信息对语音这种时变信号特别友好。咱直接拿MATLAB撸一遍流程边写边唠。首先得搞点实验素材加载一段语音文件MATLAB里audioread直接搞定% 加载原始语音替换成你的音频路径 [y, Fs] audioread(your_audio.wav); % 播放原音 sound(y, Fs);这里y是一维数组存的是每个采样点的音频数据Fs是采样率比如常见的44100Hz、16000Hz。要是没自己的音频也能直接生成个正弦波模拟语音y sin(2pi440*(0:1/Fs:1-1/Fs));就440Hz的标准A音。然后给干净语音加点“料”模拟环境杂音比如加高斯白噪音% 加高斯白噪音信噪比10dB数值越小噪音越大 y_noisy awgn(y, 10, measured); sound(y_noisy, Fs); % 听听噪音版是不是内味儿就来了awgn函数里的measured是先测量原语音能量再加噪保证信噪比准确。这时候播放的话应该是清晰的语音里混着滋滋的白噪音跟户外打电话那感觉一模一样。接下来核心操作——小波分解。咱选db4小波Daubechies4工程里常用的紧支撑正交小波计算快还稳分解3层试试% 用db4小波对含噪语音做3层分解 [C, L] wavedec(y_noisy, 3, db4);这里得唠唠返回值C是所有小波系数的拼接数组L是个长度为分解层数2的数组前3个是各层细节系数的长度最后一个是近似系数的长度。分解后最低层的近似系数是语音的主体低频成分人声基频就在这而d1、d2、d3这三层细节系数里大部分都是噪音的高频成分——毕竟人声的高频细节没那么多噪音却在高频区瞎晃。语音信号处理--降噪方法之小波分解法 MATLAB例程然后就得把混在细节系数里的噪音干掉靠的是阈值处理。先把各层细节系数抠出来% 提取各层细节系数d1是最细的高频层噪音最密集 d1 detcoef(C, L, 1); d2 detcoef(C, L, 2); d3 detcoef(C, L, 3);接下来算阈值MATLAB里有自动计算阈值的工具比如基于统计的sqtwolog方法对付高斯噪音特别好用% 按系数长度自动计算阈值 thr1 wthrmngr(sqtwolog, length(d1)); thr2 wthrmngr(sqtwolog, length(d2)); thr3 wthrmngr(sqtwolog, length(d3));然后用软阈值处理细节系数软阈值比硬阈值处理后更平滑听感更好% s代表软阈值硬阈值用h d1_denoised wthresh(d1, s, thr1); d2_denoised wthresh(d2, s, thr2); d3_denoised wthresh(d3, s, thr3);这里必须唠唠软阈值和硬阈值的区别硬阈值是系数绝对值小于阈值直接置0大于的话原样保留软阈值是小于置0大于的话还要减去阈值。硬阈值处理后可能有“毛刺感”听着像电流声软阈值虽然会损失一丢丢细节但整体更顺滑语音降噪里一般优先选软阈值。处理完细节系数就得把系数拼回去重构语音了。先把近似系数抠出来再替换处理后的细节系数% 提取第3层近似系数语音核心成分 a3 appcoef(C, L, db4); % 拼接新的小波系数近似系数 处理后的各层细节系数顺序是d3, d2, d1 C_new [a3, d3_denoised, d2_denoised, d1_denoised]; % 重构降噪后的语音 y_denoised waverec(C_new, L, db4);这里要注意系数顺序wavedec返回的C里是近似系数在前然后是d3、d2、d1所以拼C_new的时候得按这个顺序来不然重构出来的语音直接变调跟外星人说话似的。最后听听效果再画个图对比下% 播放降噪后语音 sound(y_denoised, Fs); % 画图对比原音、噪音、降噪后 figure; subplot(3,1,1); plot(y); title(原始语音); xlabel(采样点); ylabel(幅值); subplot(3,1,2); plot(y_noisy); title(含噪语音); xlabel(采样点); ylabel(幅值); subplot(3,1,3); plot(y_denoised); title(小波分解降噪后语音); xlabel(采样点); ylabel(幅值);看时域图的话含噪语音是抖得厉害的“波浪线”降噪后曲线明显平滑了和原音的趋势几乎重合听感上滋滋的白噪音基本消失人声清晰度拉满。最后扯点实用小技巧小波基选择db系列db2-db8是通用款计算快sym系列对称性更好处理后相位失真小要是想保留更多唇齿音细节试试coiflet小波。分解层数不用贪多一般3-5层足够。层数太多的话高频细节里会混入语音的谐波成分阈值处理会把有用信号也干掉反而得不偿失。阈值方法除了sqtwolog还有rigrsure自适应阈值根据系数能量调整、minimaxi极值阈值适合小样本可以都试试毕竟语音降噪最终还是得耳朵说了算。亲测下来这套流程对付日常的环境白噪音效果拉满要是遇到非平稳噪音比如汽车喇叭、脚步声可能得结合小波包分解把每个频带都拆开处理但那就是进阶玩法了咱先把基础的小波分解降噪玩明白再说~
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2445365.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!