首页 > 其他分享 >基于matlab的语音信号去噪的App Designer 设计

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

时间:2024-11-19 10:14:29浏览次数:3  
标签:control Designer app EditField ui matlab UIAxes App

文章目录

前言

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

相关文章

  • 【IMM EKF MATLAB CVCA】IMM滤波器,结合匀速运动 (Constant Velocity, CV) 和匀加速运
    文章目录程序简介运行截图程序代码程序讲解概述主要功能详细讲解1.初始化2.状态转移矩阵和协方差矩阵3.生成真实数据4.IMM算法5.结果后处理与可视化6.卡尔曼滤波函数总结程序简介该函数实现了交互式多模型(IMM)滤波器,结合了匀速运动(ConstantVelocity,......
  • Datasets is not supported in Complete output mode, only in Append output mode
    我们在使用pyspark,使用structureStreaming实时流的时候,创建出来的dataframe是流式的,不同于静态的df,流式的df使用的时候,不能用show()直接打印,而且使用sparkSQL的时候不可以在sql中使用开窗函数,并且还不可以使用join进行表关联举个栗子:执行以下代码会报错,因为在sql中使用了join......
  • 一文带你快速上手 UniApp 组件与 uni-ui
    深入了解UniApp组件与组件框架uni-ui在UniApp的开发中,组件化编程是提升开发效率和应用可维护性的重要手段。通过组件化,开发者可以将应用的不同功能模块进行封装,使得代码更加简洁、可重用,并且可以提升开发体验和效率。本文将重点介绍UniApp的组件及其常用组件框架uni-ui,......
  • Gemini 发布 iOS app,Live 语音聊天免费用;微信公众号上线 AI 音色克隆功能丨 RTE 开发
       开发者朋友们大家好: 这里是「RTE开发者日报」,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享RTE(Real-TimeEngagement)领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「有看点的会议」,但内容仅代表编......
  • [uniapp] 扫码功能
    APP、微信小程序(原生扫码功能)<!--在'manifest.json'中允许打开摄像头权限--><template> <button@click="scanQRcodes">扫码</button></template><scriptsetup>//扫码constscanQRcodes=()=>{ uni.scanCode({ succe......
  • 用通义灵码,从 0 开始打造一个完整APP,无需编程经验就可以完成
    作者:玺哥超carry不要划走,这是一个让普通人增加百倍竞争力的视频!自从2023年AI火爆至今,各种文案生成、图片生成、视频生成的技术火爆全网。其中AI写代码更是今天一个震惊,明天一个颠覆。但实际做出来的东西,却好像回到80年代,一会做一个Flappybird,一会做一个横版小游戏。......
  • 用通义灵码,从 0 开始打造一个完整APP,无需编程经验就可以完成
    作者:玺哥超carry不要划走,这是一个让普通人增加百倍竞争力的视频!自从2023年AI火爆至今,各种文案生成、图片生成、视频生成的技术火爆全网。其中AI写代码更是今天一个震惊,明天一个颠覆。但实际做出来的东西,却好像回到80年代,一会做一个Flappybird,一会做一个横版小游戏。......
  • 用通义灵码,从 0 开始打造一个完整APP,无需编程经验就可以完成
    作者:玺哥超carry不要划走,这是一个让普通人增加百倍竞争力的视频!自从2023年AI火爆至今,各种文案生成、图片生成、视频生成的技术火爆全网。其中AI写代码更是今天一个震惊,明天一个颠覆。但实际做出来的东西,却好像回到80年代,一会做一个Flappybird,一会做一个横版小游戏。......
  • 用通义灵码从0开始打造一款App,无编程经验也可以完成
    不要划走,这是一个让普通人增加百倍竞争力的视频!自从2023年AI火爆至今,各种文案生成、图片生成、视频生成的技术火爆全网。其中AI写代码更是今天一个震惊,明天一个颠覆。但实际做出来的东西,却好像回到80年代,一会做一个Flappybird,一会做一个横版小游戏。就连网上爆火C......
  • expend 和 append
    extend和append的区别在Python中,extend和append都是列表(list)的方法,用于向列表中添加元素,但它们的行为有明显的区别。1.extend方法作用将另一个可迭代对象中的所有元素逐个添加到原列表中。语法list.extend(iterable)参数:iterable:任何可迭代对象(如列表......