当前位置: 首页 > article >正文

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

文章目录

  • 前言
  • 1.外观设计
    • 1.1 组件布局
    • 1.2 修改组件标签
  • 2.代码部分设计
    • 2.1成员变量
      • 2.1.1组件成员变量
      • 2.1.2自定义成员变量
    • 2.2 回调函数
      • 2.2.1 导入音频
      • 2.2.2 加噪处理
      • 2.2.3 播放音频
    • 2.3滤波器设计
    • 2.4信噪比
  • 3.完整版功能展示
  • 结语

前言

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

此处展示:加入的是高斯高频噪声,,选用切比雪夫低通滤波器,对比信噪比,起到一定的降噪效果
在这里插入图片描述
上述代码只是部分代码展示,完整版代码可以私信我免费获取

结语

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


http://www.kler.cn/a/406016.html

相关文章:

  • 【如何用更少的数据作出更好的决策】-gpt生成
  • 【11.22更新】Win11 24H2正式版:26100.2454镜像一键获取!
  • Javascript进阶——面试常见
  • Swift从0开始学习 协议和扩展 day5
  • Java LinkedList 详解
  • 游戏行业趋势:“AI、出海、IP”大热下,如何提升竞争力?
  • Django数据迁移出错,解决raise NodeNotFoundError问题
  • Spring Boot 深度解析:快速构建高效、现代化的 Web 应用程序
  • 独立资源池与共享资源池在云计算中各自的优势
  • 数据分析指标与术语
  • sysbench压测DM的高可用切换测试
  • 如何使用大模型进行智能质检?
  • Typora-PicGo-OSS对象存储
  • 4-7-1.C# 数据容器 - LinkedList(LinkedList 的定义、LinkedList 结点的遍历、LinkedList 的常用方法)
  • 智能安全配电装置在高校实验室中的应用
  • AI 大模型如何重塑软件开发流程?——技术革新与未来展望
  • springboot基于Android的华蓥山旅游导航系统
  • 66 mysql 的 表自增长锁
  • .NET6 WebApi第1讲:VSCode开发.NET项目、区别.NET5框架【两个框架启动流程详解】
  • 【AI系统】GPU 架构回顾(从2018年-2024年)
  • django+boostrap实现发布博客权限控制
  • 计算机网络:应用层知识点概述及习题
  • PyPI 攻击:ChatGPT、Claude 模仿者通过 Python 库传播 JarkaStealer
  • 线性表:概念、顺序表实现与应用
  • 跨境出海安全:如何防止PayPal账户被风控?
  • 刷题-1122