基于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.完整版功能展示

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

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

结语

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

相关推荐
孤亭远见19 分钟前
COMSOL with Matlab
matlab
图南楠3 小时前
simulink离散传递函数得到差分方程并用C语言实现
matlab
信号处理学渣3 小时前
matlab画图,选择性显示legend标签
开发语言·matlab
机器学习之心14 小时前
Bayes-GRU-Attention的数据多特征分类预测Matlab实现
matlab·分类·gru
叶庭云14 小时前
Matlab 和 R 语言的数组索引都是从 1 开始,并且是左闭右闭的
matlab·编程语言·r·数组索引·从 1 开始
γ..17 小时前
基于MATLAB的图像增强
开发语言·深度学习·神经网络·学习·机器学习·matlab·音视频
IT猿手20 小时前
基于PWLCM混沌映射的麋鹿群优化算法(Elk herd optimizer,EHO)的多无人机协同路径规划,MATLAB代码
算法·elk·机器学习·matlab·无人机·聚类·强化学习
超级大咸鱼1 天前
CW信号的正交解调
matlab·verilog·fpga·数字信号·解调·正交解调·cw
乌恩大侠1 天前
画图,matlab,
开发语言·matlab
吐泡泡科技2 天前
无人机视频传输系统的通信能耗优化
matlab·通信能耗·无人机通信