文章目录
前言
在实际应用中,语音信号往往会受到各种噪声的干扰,这会影响语音的质量和可懂度。因此,语音信号去噪是一个重要的研究领域。本篇博客主要介绍了基于matlab开发的语音去噪系统的设计,包含了巴特沃斯滤波器、切比雪夫II型滤波器、卡尔曼滤波器、维纳滤波器四种滤波器对加噪信号的处理,通过对比信噪比和频谱图来衡量去噪效果。
1.外观设计
本篇博客基于App Designer 开发的语音信号去噪系统。
App Designer 是 MATLAB 中用于创建图形用户界面(GUI)应用程序的一个集成开发环境(IDE),它提供了一种直观且高效的方式来设计、开发和部署具有交互功能的 MATLAB 应用程序。
1.1 组件布局
直接从组件库将需要的组件拖拽到设计视图即可,调整一下大小即可
1.2 修改组件标签
直接在坐标去修改标签即可,也可在设计视图直接修改,当然也可以在回调中修改,为了更好的初始化app,所以不建议在回调中改标签
2.代码部分设计
因为matlab支持面向对象编程思想,同时本身App Designer是一个类,回调函数就是类中的方法(函数),所以此处通过成员变量(属性)
和回调函数
两部分介绍。
2.1成员变量
2.1.1组件成员变量
这部分是根据组件选择,自动导入的,不需要自行定义
% Properties that correspond to app components
properties (Access = public)
UIFigure matlab.ui.Figure
Button_5 matlab.ui.control.Button
Button_4 matlab.ui.control.Button
Button_3 matlab.ui.control.Button
ButtonGroup_2 matlab.ui.container.ButtonGroup
Button_2 matlab.ui.control.RadioButton
Button matlab.ui.control.RadioButton
SNREditField_2 matlab.ui.control.NumericEditField
SNREditField_2Label matlab.ui.control.Label
SNREditField matlab.ui.control.NumericEditField
SNREditFieldLabel matlab.ui.control.Label
ButtonGroup matlab.ui.container.ButtonGroup
sharewavButton matlab.ui.control.RadioButton
testwavButton matlab.ui.control.RadioButton
EditField_4 matlab.ui.control.NumericEditField
EditField_4Label matlab.ui.control.Label
EditField_3 matlab.ui.control.NumericEditField
EditField_3Label matlab.ui.control.Label
EditField_2 matlab.ui.control.NumericEditField
EditField_2Label matlab.ui.control.Label
EditField matlab.ui.control.NumericEditField
Label_2 matlab.ui.control.Label
DropDown matlab.ui.control.DropDown
Label matlab.ui.control.Label
Image matlab.ui.control.Image
UIAxes matlab.ui.control.UIAxes
UIAxes_8 matlab.ui.control.UIAxes
UIAxes_7 matlab.ui.control.UIAxes
UIAxes_6 matlab.ui.control.UIAxes
UIAxes_5 matlab.ui.control.UIAxes
UIAxes_4 matlab.ui.control.UIAxes
end
% Public properties that correspond to the Simulink model
properties (Access = public, Transient)
Simulation simulink.Simulation
end
2.1.2自定义成员变量
为了方便起见,此处自定义了以下成员变量
properties (Access = private)
% 原始信号时域序列
y_origin
% 原始信号频域序列
Y_origin
% 抽样频率
Fs
% 加噪后的时域序列
y_with_noise
% 加噪后的频域序列
Y_with_noise
% 降噪后的时域序列
y_noise_redude
% 降噪后的频域序列
Y_noise_redude
% 将横坐标转换成单位秒
t
% 抽样周期
T
end
关于成员变量是私有还是公共,都可以,个人建议私有属性
2.2 回调函数
回调函数设计很具个性化,可以根据自己的需要在各种组件的回调中设计,本篇博客提供一种设计方案,并不是最好的或者最佳的。
2.2.1 导入音频
音频加载,此处选用单选按钮组件
中设计回调函数,如图所示
此处回调代码部分:
function ButtonGroupSelectionChanged(app, event)
selectedButton = app.ButtonGroup.SelectedObject;
% selectedButton.Text
app.init(selectedButton.Text);
plot(app.UIAxes,app.t,app.y_origin)
app.UIAxes.YLim=[-1 1];
plot(app.UIAxes_4,(1:length(app.Y_origin))*2/length(app.Y_origin),abs(app.Y_origin))
app.UIAxes_4.YLim=[0 800];
app.ButtonGroup_2SelectionChanged();
end
注:在此处我们定义了额外的app.init(selectedButton.Text);
,用来在坐标区显示相应的频域与时域图,可以自行完善
2.2.2 加噪处理
此处提供了两种噪声,高斯全频噪声
,高斯高频噪声
,选用单选按钮组件
中设计回调函数
% Selection changed function: ButtonGroup_2
function ButtonGroup_2SelectionChanged(app, event)
selectedButton = app.ButtonGroup_2.SelectedObject;
switch selectedButton.Text
case '高斯全频'
% 加入高斯白噪声,即加噪后的序列y1
app.y_with_noise=app.y_origin+0.2*rand(size(app.y_origin))-0.1;
app.Y_with_noise=fft(app.y_with_noise);
case '高斯高频'
% 高斯白噪声
noise=0.2*rand(size(app.y_origin));
% 设计高通滤波器
Fs2 = 44100; % Sampling Frequency
Fstop = 9600; % Stopband Frequency
Fpass = 12000; % Passband Frequency
Dstop = 0.0001; % Stopband Attenuation
Dpass = 0.057501127785; % Passband Ripple
dens = 20; % Density Factor
% Calculate the order from the parameters using FIRPMORD.
[N, Fo, Ao, W] = firpmord([Fstop, Fpass]/(Fs2/2), [0 1], [Dstop, Dpass]);
% Calculate the coefficients using the FIRPM function.
b = firpm(N, Fo, Ao, W, {dens});
Hd = dfilt.dffir(b);
hpf=filter(Hd,noise);
app.y_with_noise=app.y_origin+hpf;
app.Y_with_noise=fft(app.y_with_noise);
end
plot(app.UIAxes_5,app.t,app.y_with_noise)
app.UIAxes_5.YLim=[-1 1];
plot(app.UIAxes_7,(1:length(app.Y_with_noise))*2/length(app.Y_with_noise),abs(app.Y_with_noise))
app.UIAxes_7.YLim=[0 800];
end
也可以相应在坐标区显示对应的的频域与时域图,可自行完善
2.2.3 播放音频
此处设计了三个状态按钮,分别用来播放原声、加噪后的声音、降噪后的声音
回调函数:
% Button pushed function: Button_3
function Button_3Pushed(app, event)
sound(app.y_origin,app.Fs)
end
% Button pushed function: Button_4
function Button_4Pushed(app, event)
sound(app.y_with_noise,app.Fs)
end
% Button pushed function: Button_5
function Button_5Pushed(app, event)
sound(app.y_noise_redude,app.Fs)
end
2.3滤波器设计
此处我们在下拉框中设计的回调函数,提供了四种滤波器,滤波器具体实现代码可以自行设计,也可以选择其他滤波器,这里只提供框架
function DropDownValueChanged(app, event)
value = app.DropDown.Value;
switch value
case "巴特沃斯低通"
app.EditField.Visible="on";
app.EditField_2.Visible="on";
app.EditField_3.Visible="on";
app.EditField_4.Visible="on";
% 具体代码实现方式
app.calculate_snr();
case "切比雪夫低通"
app.EditField.Visible="on";
app.EditField_2.Visible="on";
app.EditField_3.Visible="on";
app.EditField_4.Visible="on";
% 具体代码实现方式
app.calculate_snr();
case "维纳滤波"
app.EditField.Visible="off";
app.EditField_2.Visible="off";
app.EditField_3.Visible="off";
app.EditField_4.Visible="off";
% 具体代码实现方式
app.calculate_snr();
case '卡尔曼滤波'
app.EditField.Visible="off";
app.EditField_2.Visible="off";
app.EditField_3.Visible="off";
app.EditField_4.Visible="off";
% 具体代码实现方式
app.calculate_snr();
end
end
此处我们还定义了四个编辑字段(数字)
组件,用来输入相关滤波器的技术指标
2.4信噪比
信噪比
的基本定义是信号功率与噪声功率的比值,通常用分贝(dB)来表示
具体代码实现方式:
function calculate_snr(app)
% 计算滤波前的信噪比
% 原始信号功率
psignal=P(app.y_origin);
% 噪声功率
pnoise=P(app.y_with_noise-app.y_origin);
% 信噪比
SNR_Original=10*log10(psignal/pnoise);
% disp(SNR_Original)
app.SNREditField.Value=SNR_Original;
% 计算滤波后的信噪比
% 降噪后的功率
psignal_after=P(app.y_origin);
% 噪声功率
pnoise=P(app.y_noise_redude-app.y_origin);
SNR_After=10*log10(psignal_after/pnoise);
% disp(SNR_After)
app.SNREditField_2.Value=SNR_After;
end
这自定义了P()
函数
具体代码:
function p=P(y)
p=sum(abs(y).^2)/length(y);
end
也可以使用snr()
函数直接实现,注意区分信号功率
,噪声信号功率
3.完整版功能展示
此处展示:加入的是高斯高频噪声,,选用切比雪夫低通滤波器,对比信噪比,起到一定的降噪效果
上述代码只是部分代码展示,完整版代码可以私信我免费获取
结语
通过本次语音信号去噪系统的设计,一定会加深你对滤波过程的理解。如有不足,欢迎交流!!!
标签:control,Designer,app,EditField,ui,matlab,UIAxes,App From: https://blog.csdn.net/2401_85464956/article/details/143871544