基于matlab的语音信号去噪的App Designer 设计

文章目录

前言

在实际应用中,语音信号往往会受到各种噪声的干扰,这会影响语音的质量和可懂度。因此,语音信号去噪是一个重要的研究领域。本篇博客主要介绍了基于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组件成员变量

这部分是根据组件选择,自动导入的,不需要自行定义

matlab 复制代码
    % 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自定义成员变量

为了方便起见,此处自定义了以下成员变量

matlab 复制代码
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 导入音频

音频加载,此处选用单选按钮组件中设计回调函数,如图所示

此处回调代码部分:

matlab 复制代码
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 加噪处理

此处提供了两种噪声,高斯全频噪声高斯高频噪声,选用单选按钮组件中设计回调函数

matlab 复制代码
% 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 播放音频

此处设计了三个状态按钮,分别用来播放原声、加噪后的声音、降噪后的声音

回调函数:

matlab 复制代码
% 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滤波器设计

此处我们在下拉框中设计的回调函数,提供了四种滤波器,滤波器具体实现代码可以自行设计,也可以选择其他滤波器,这里只提供框架

matlab 复制代码
        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)来表示

具体代码实现方式:

matlab 复制代码
        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()函数

具体代码:

matlab 复制代码
function p=P(y)
p=sum(abs(y).^2)/length(y);
end

也可以使用snr()函数直接实现,注意区分信号功率噪声信号功率

3.完整版功能展示

此处展示:加入的是高斯高频噪声,,选用切比雪夫低通滤波器,对比信噪比,起到一定的降噪效果

上述代码只是部分代码展示,完整版代码可以私信我免费获取

结语

通过本次语音信号去噪系统的设计,一定会加深你对滤波过程的理解。如有不足,欢迎交流!!!

相关推荐
Dev7z15 小时前
基于 MATLAB 的铣削切削力建模与仿真
开发语言·matlab
fengfuyao98518 小时前
基于MATLAB的表面织构油润滑轴承故障频率提取(改进VMD算法)
人工智能·算法·matlab
机器学习之心18 小时前
基于随机森林模型的轴承剩余寿命预测MATLAB实现!
算法·随机森林·matlab
rit843249920 小时前
基于MATLAB的环境障碍模型构建与蚁群算法路径规划实现
开发语言·算法·matlab
hoiii18720 小时前
MATLAB SGM(半全局匹配)算法实现
前端·算法·matlab
yong999021 小时前
MATLAB面波频散曲线反演程序
开发语言·算法·matlab
yugi9878381 天前
基于MATLAB的一键式EMD、EEMD、CEEMD和SSA信号去噪实现
开发语言·matlab·信号去噪
youcans_1 天前
【STM32-MBD】(15)Simulink 模型开发之三相互补 PWM
stm32·单片机·嵌入式硬件·matlab·foc
机器学习之心1 天前
基于CNN-GRU(卷积神经网络-门控循环单元)的多变量负荷预测模型MATLAB代码
matlab·cnn·gru
3GPP仿真实验室1 天前
【Matlab源码】6G候选波形:OFDM-IM 索引调制仿真平台
开发语言·matlab