【语音去噪】基于matlab谱减法+维纳滤波+卡尔曼滤波语音去噪【含Matlab源码 1881期】

网友投稿 1427 2022-11-26

【语音去噪】基于matlab谱减法+维纳滤波+卡尔曼滤波语音去噪【含Matlab源码 1881期】

【语音去噪】基于matlab谱减法+维纳滤波+卡尔曼滤波语音去噪【含Matlab源码 1881期】

一、谱减法+维纳滤波+卡尔曼滤波语音去噪简介

2 基本谱减法 S.Boll假设噪声信号是平稳的或变化缓慢的加性噪声,且在语音信号和噪声信号不相关的前提下提出谱减法,假定噪声是平稳的,人耳对相位信息不敏感,将含噪语音的相位作为处理后语音的相位,根据处理后的幅度和相位进行IFFT变换,得到增强后的时域信号。

3 基于卡尔曼滤波的语音增强 现实中的噪声大都是非平稳的,因而研究非平稳噪声状态下的语音增强具有重要意义。

卡尔曼滤波在语音去噪已有许多研究应用,其结合语音生成模型,用信号的线性预测系数作为状态转移矩阵,增强后语音中残留的音乐噪声减少,语音自然度提高,其模型参数估计的准确与否直接影响增强语音的质量。卡尔曼滤波算法在语音信号去噪方面的应用研究较多,主要归功于其处理数据和计算算法实现等较为方便。

卡尔曼滤波器的主要过程有两个,分别是预估和校正。预估就是根据时间更新方程建立对当前状态的先验估计,方便构造下一状态的先验估计值;校正即是反馈过程,根据更新方程预估的先验估计值和当前测量值对现状态分析,改进后验估计值。

二、部分源代码

%%三种语音增强方法的测试脚本%******************************************************% 在audioread函数中可以设置读入的语音信号% 改变SNR的值即可改变加入的噪声%[Input, Fs] = audioread('sp01.wav');Time = (0:1/Fs:(length(Input)-1)/Fs)';%取单声道Input = Input(:,1);%SNR为加入噪声与纯净信号的信噪比(dB)SNR=10;[NoisyInput,Noise] = add_noise(Input,SNR);%NoisyInput为加噪信号,Noise是噪声%% 三种语音增强方法的实现[spectruesub_enspeech] = spectruesub(NoisyInput); [wiener_enspeech] = wienerfilter(NoisyInput); [Klaman_Output] = kalman(NoisyInput,Fs,Noise); %% spectruesub绘制%将信号长度对齐sig_len=length(spectruesub_enspeech);NoisyInput=NoisyInput(1:sig_len);Input=Input(1:sig_len);wiener_enspeech=wiener_enspeech(1:sig_len);Klaman_Output=Klaman_Output(1:sig_len);Time = (0:1/Fs:(sig_len-1)/Fs)';% Time= ((0:1/Fs:(sig_len)-1)/Fs)';figure(1)MAX_Am(1)=max(Input);MAX_Am(2)=max(NoisyInput);MAX_Am(3)=max(spectruesub_enspeech);subplot(3,1,1);plot(Time, Input)ylim([-max(MAX_Am),max(MAX_Am)]);xlabel('Time')ylabel('Amlitude')title('原始信号')subplot(3,1,2);plot(Time, NoisyInput)ylim([-max(MAX_Am),max(MAX_Am)]);xlabel('Time')ylabel('Amlitude')title('加噪信号')subplot(3,1,3);plot(Time, spectruesub_enspeech)ylim([-max(MAX_Am),max(MAX_Am)]);xlabel('Time')ylabel('Amlitude')title('谱减法')%% spectruesub绘制% Time_wiener = (0:1/Fs:(length(wiener_enspeech)-1)/Fs)';figure(2)MAX_Am(1)=max(Input);MAX_Am(2)=max(NoisyInput);MAX_Am(3)=max(wiener_enspeech);subplot(3,1,1);plot(Time, Input)ylim([-max(MAX_Am),max(MAX_Am)]);xlabel('Time')ylabel('Amlitude')title('原始信号')subplot(3,1,2);plot(Time, NoisyInput)ylim([-max(MAX_Am),max(MAX_Am)]);xlabel('Time')ylabel('Amlitude')title('加噪信号')subplot(3,1,3);plot(Time, wiener_enspeech)ylim([-max(MAX_Am),max(MAX_Am)]);xlabel('Time')ylabel('Amlitude')title('维纳滤波法')%% Kalman绘制figure(3)MAX_Am(1)=max(Input);MAX_Am(2)=max(NoisyInput);MAX_Am(3)=max(Klaman_Output);subplot(3,1,1);plot(Time, Input)ylim([-max(MAX_Am),max(MAX_Am)]);xlabel('Time')ylabel('Amlitude')title('原始信号')subplot(3,1,2);plot(Time, NoisyInput)ylim([-max(MAX_Am),max(MAX_Am)]);xlabel('Time')ylabel('Amlitude')title('加噪信号')subplot(3,1,3);plot(Time, Klaman_Output)ylim([-max(MAX_Am),max(MAX_Am)]);xlabel('Time')ylabel('Amlitude')title('Kalman滤波')%% 求语音降噪后的信噪比SNR(1)=snr(Input,Input-spectruesub_enspeech);SNR(2)=snr(Input,Input-wiener_enspeech);SNR(3)=snr(Input,Input-Klaman_Output);

三、运行结果

四、matlab版本及参考文献

1 matlab版本 2014a

2 参考文献 [1]韩纪庆,张磊,郑铁然.语音信号处理(第3版)[M].清华大学出版社,2019. [2]郑展恒,曾庆宁.语音增强算法的研究与改进[J].现代电子技术. 2020,43(21) [3]靳立燕,陈莉,樊泰亭,高晶.基于奇异谱分析和维纳滤波的语音去噪算法[J].计算机应用. 2015,35(08)

3 备注 简介此部分摘自互联网,仅供参考,若侵权,联系删除

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Android 6.0 删除无用功能
下一篇:d使用d1的重载操作符
相关文章

 发表评论

暂时没有评论,来抢沙发吧~