语音信号去噪 Matlab语音信号去噪,GUI界面。分别添加了正弦噪声和高斯噪声,分别用了巴特沃斯低通滤波器和小波分解去噪。每步处理都可以播放出信号声音。

news2024/10/18 7:26:44

Matlab语音信号去噪,GUI界面。分别添加了正弦噪声和高斯噪声,分别用了巴特沃斯低通滤波器和小波分解去噪。每步处理都可以播放出信号声音。


具体工作如下:
1、加载语音信号,显示时域频域图;
2、添加正弦噪声;
3、分别使用巴特沃斯低通和小波变换去噪;
4、添加高斯白噪声;
5、再次使用巴特沃斯低通和小波变换去噪。

注:程序可直接运行,建议Matlab 2022b版本,低版本估计2018以上也行~

语音信号去噪
类别:信号处理、音频处理
用途:该项目旨在通过一个图形用户界面(GUI)来处理和去噪语音信号。用户可以加载语音信号,添加正弦噪声和高斯白噪声,并使用巴特沃斯低通滤波器和小波分解技术进行去噪。每一步处理后都可以播放处理后的信号声音。

项目特点
  1. 多级去噪:结合巴特沃斯低通滤波器和小波分解技术,逐级去除不同类型的噪声。
  2. 可视化:显示时域和频域图,直观展示去噪效果。
  3. 交互性:通过GUI界面,用户可以轻松加载信号、添加噪声、选择去噪方法,并播放处理后的信号。
  4. 兼容性:程序可在MATLAB 2022b版本上直接运行,建议使用2018以上版本。
项目结构
speech_denoising/
├── speech_signal.wav  # 语音信号数据文件
├── speech_denoising.m  # 主程序
├── README.md  # 项目说明文档
  • speech_signal.wav:存放语音信号数据。
  • speech_denoising.m:主程序,包含GUI界面和信号处理逻辑。
  • README.md:项目说明文档,包含项目介绍、运行步骤和注意事项。
GUI界面设计

GUI界面将包含以下组件:

  • 加载按钮:加载语音信号。
  • 显示区域:显示时域和频域图。
  • 添加正弦噪声按钮:向信号中添加正弦噪声。
  • 添加高斯白噪声按钮:向信号中添加高斯白噪声。
  • 巴特沃斯低通滤波按钮:使用巴特沃斯低通滤波器去噪。
  • 小波变换去噪按钮:使用小波变换去噪。
  • 播放按钮:播放当前信号的声音。
详细步骤
1. 加载语音信号,显示时域频域
function loadSignal(hObject, eventdata, handles)
    [signal, fs] = audioread('speech_signal.wav');
    signal = signal(:, 1);  % 如果是立体声信号,只取一个声道
    t = (0:length(signal)-1) / fs;

    % 显示时域图
    axes(handles.axesTime);
    plot(t, signal);
    title('原始语音信号 - 时域');
    xlabel('时间 (s)');
    ylabel('幅度');

    % 计算频谱
    nfft = length(signal);
    f = (0:nfft-1) * (fs / nfft);
    y = fft(signal, nfft);
    P2 = abs(y / nfft);
    P1 = P2(1:nfft/2+1);
    P1(2:end-1) = 2 * P1(2:end-1);

    % 显示频域图
    axes(handles.axesFreq);
    plot(f, P1);
    title('原始语音信号 - 频域');
    xlabel('频率 (Hz)');
    ylabel('幅度');

    % 保存信号到handles
    setappdata(handles.figure1, 'signal', signal);
    setappdata(handles.figure1, 'fs', fs);
end
2. 添加正弦噪声
function addSineNoise(hObject, eventdata, handles)
    signal = getappdata(handles.figure1, 'signal');
    fs = getappdata(handles.figure1, 'fs');

    % 生成正弦噪声
    freq_noise = 100;  % 正弦噪声的频率
    amplitude_noise = 0.5;  % 正弦噪声的幅度
    t = (0:length(signal)-1) / fs;
    noise = amplitude_noise * sin(2 * pi * freq_noise * t);

    % 添加噪声
    noisy_signal = signal + noise;

    % 显示时域图
    axes(handles.axesTime);
    plot(t, noisy_signal);
    title('添加正弦噪声后的语音信号 - 时域');
    xlabel('时间 (s)');
    ylabel('幅度');

    % 计算频谱
    nfft = length(noisy_signal);
    f = (0:nfft-1) * (fs / nfft);
    y = fft(noisy_signal, nfft);
    P2 = abs(y / nfft);
    P1 = P2(1:nfft/2+1);
    P1(2:end-1) = 2 * P1(2:end-1);

    % 显示频域图
    axes(handles.axesFreq);
    plot(f, P1);
    title('添加正弦噪声后的语音信号 - 频域');
    xlabel('频率 (Hz)');
    ylabel('幅度');

    % 保存噪声信号到handles
    setappdata(handles.figure1, 'noisy_signal', noisy_signal);
end
3. 使用巴特沃斯低通滤波器去
function denoiseButterworth(hObject, eventdata, handles)
    noisy_signal = getappdata(handles.figure1, 'noisy_signal');
    fs = getappdata(handles.figure1, 'fs');

    % 设计巴特沃斯低通滤波器
    fc = 3000;  % 截止频率
    [b, a] = butter(6, fc / (fs / 2), 'low');  % 6阶Butterworth滤波器

    % 应用滤波器
    filtered_signal = filtfilt(b, a, noisy_signal);

    % 显示时域图
    t = (0:length(filtered_signal)-1) / fs;
    axes(handles.axesTime);
    plot(t, filtered_signal);
    title('巴特沃斯低通滤波后的语音信号 - 时域');
    xlabel('时间 (s)');
    ylabel('幅度');

    % 计算频谱
    nfft = length(filtered_signal);
    f = (0:nfft-1) * (fs / nfft);
    y = fft(filtered_signal, nfft);
    P2 = abs(y / nfft);
    P1 = P2(1:nfft/2+1);
    P1(2:end-1) = 2 * P1(2:end-1);

    % 显示频域图
    axes(handles.axesFreq);
    plot(f, P1);
    title('巴特沃斯低通滤波后的语音信号 - 频域');
    xlabel('频率 (Hz)');
    ylabel('幅度');

    % 保存去噪信号到handles
    setappdata(handles.figure1, 'filtered_signal', filtered_signal);
end
4. 使用小波变换去噪
function denoiseWavelet(hObject, eventdata, handles)
    noisy_signal = getappdata(handles.figure1, 'noisy_signal');
    fs = getappdata(handles.figure1, 'fs');

    % 小波分解
    wavelet = 'db4';  % Daubechies 4小波
    level = 5;  % 分解层数
    [C, L] = wavedec(noisy_signal, level, wavelet);

    % 阈值去噪
    threshold = wthrmngr('clean', 'one', C, L, 1, 'heursure');  % Heuristic threshold
    C_den = wthresh(C, 's', threshold);

    % 重构信号
    denoised_signal = waverec(C_den, L, wavelet);

    % 显示时域图
    t = (0:length(denoised_signal)-1) / fs;
    axes(handles.axesTime);
    plot(t, denoised_signal);
    title('小波去噪后的语音信号 - 时域');
    xlabel('时间 (s)');
    ylabel('幅度');

    % 计算频谱
    nfft = length(denoised_signal);
    f = (0:nfft-1) * (fs / nfft);
    y = fft(denoised_signal, nfft);
    P2 = abs(y / nfft);
    P1 = P2(1:nfft/2+1);
    P1(2:end-1) = 2 * P1(2:end-1);

    % 显示频域图
    axes(handles.axesFreq);
    plot(f, P1);
    title('小波去噪后的语音信号 - 频域');
    xlabel('频率 (Hz)');
    ylabel('幅度');

    % 保存去噪信号到handles
    setappdata(handles.figure1, 'denoised_signal', denoised_signal);
end
5. 添加高斯白噪声
function addGaussianNoise(hObject, eventdata, handles)
    signal = getappdata(handles.figure1, 'signal');
    fs = getappdata(handles.figure1, 'fs');

    % 生成高斯白噪声
    noise = 0.1 * randn(size(signal));

    % 添加噪声
    noisy_signal = signal + noise;

    % 显示时域图
    t = (0:length(noisy_signal)-1) / fs;
    axes(handles.axesTime);
    plot(t, noisy_signal);
    title('添加高斯白噪声后的语音信号 - 时域');
    xlabel('时间 (s)');
    ylabel('幅度');

    % 计算频谱
    nfft = length(noisy_signal);
    f = (0:nfft-1) * (fs / nfft);
    y = fft(noisy_signal, nfft);
    P2 = abs(y / nfft);
    P1 = P2(1:nfft/2+1);
    P1(2:end-1) = 2 * P1(2:end-1);

    % 显示频域图
    axes(handles.axesFreq);
    plot(f, P1);
    title('添加高斯白噪声后的语音信号 - 频域');
    xlabel('频率 (Hz)');
    ylabel('幅度');

    % 保存噪声信号到handles
    setappdata(handles.figure1, 'noisy_signal', noisy_signal);
end
6. 播放信号声音
function playSignal(hObject, eventdata, handles)
    current_signal = getappdata(handles.figure1, 'current_signal');
    fs = getappdata(handles.figure1, 'fs');
    sound(current_signal, fs);
end
GUI界面创建
function varargout = speech_denoising(varargin)
    gui_Singleton = 1;
    gui_State = struct('gui_Name',       mfilename, ...
                       'gui_Singleton',  gui_Singleton, ...
                       'gui_OpeningFcn', @speech_denoising_OpeningFcn, ...
                       'gui_OutputFcn',  @speech_denoising_OutputFcn, ...
                       'gui_LayoutFcn',  [] , ...
                       'gui_Callback',   []);
    if nargin && ischar(varargin{1})
        gui_State.gui_Callback = str2func(varargin{1});
    end

    if nargout
        [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
    else
        gui_mainfcn(gui_State, varargin{:});
    end
end

% --- Executes just before speech_denoising is made visible.
function speech_denoising_OpeningFcn(hObject, eventdata, handles, varargin)
    handles.output = hObject;
    guidata(hObject, handles);
end

% --- Outputs from this function are returned to the command line.
function varargout = speech_denoising_OutputFcn(hObject, eventdata, handles) 
    varargout{1} = handles.output;
end

% --- 创建GUI界面
function createGUI(handles)
    % 创建图形窗口
    figure('Name', '语音信号去噪', 'NumberTitle', 'off', 'Position', [100, 100, 800, 600]);
    
    % 创建按钮
    uicontrol('Style', 'pushbutton', 'String', '加载信号', 'Position', [20, 20, 100, 30], 'Callback', @loadSignal);
    uicontrol('Style', 'pushbutton', 'String', '添加正弦噪声', 'Position', [20, 60, 100, 30], 'Callback', @addSineNoise);
    uicontrol('Style', 'pushbutton', 'String', '巴特沃斯低通滤波', 'Position', [20, 100, 100, 30], 'Callback', @denoiseButterworth);
    uicontrol('Style', 'pushbutton', 'String', '小波变换去噪', 'Position', [20, 140, 100, 30], 'Callback', @denoiseWavelet);
    uicontrol('Style', 'pushbutton', 'String', '添加高斯白噪声', 'Position', [20, 180, 100, 30], 'Callback', @addGaussianNoise);
    uicontrol('Style', 'pushbutton', 'String', '播放信号', 'Position', [20, 220, 100, 30], 'Callback', @playSignal);

    % 创建绘图区域
    axes('Position', [0.2, 0.1, 0.6, 0.35], 'Tag', 'axesTime');
    axes('Position', [0.2, 0.5, 0.6, 0.35], 'Tag', 'axesFreq');

    % 保存handles
    handles.figure1 = gcf;
    handles.axesTime = findobj(gcf, 'Tag', 'axesTime');
    handles.axesFreq = findobj(gcf, 'Tag', 'axesFreq');
    guidata(gcf, handles);
end

% --- 启动GUI
createGUI(guidata(gcf));
运行项目
  1. 安装MATLAB:确保您已经安装了MATLAB,并且版本支持所需的小波工具箱。
  2. 准备数据:将您的语音信号数据保存为speech_signal.wav,并将该文件放置在项目目录下。
  3. 运行程序
    % 在MATLAB命令窗口中运行以下命令
    cd path_to_project_directory  % 切换到项目目录
    speech_denoising  % 运行主程序
注意事项
  • 信号参数调整:根据实际语音信号的情况,可能需要调整滤波器的参数(如截止频率、滤波器阶数)和小波分解的参数(如小波类型、分解层数)。
  • 数据格式:确保speech_signal.wav文件中的信号数据是单声道或双声道。
  • 远程支持:如果在运行过程中遇到问题,可以通过远程调试的方式帮助解决。

项目总结

这个项目提供了一个完整的语音信号去噪解决方案,通过一个图形用户界面(GUI)实现信号的加载、噪声添加、去噪处理以及信号播放。项目代码简洁明了,注释丰富,适合学习和研究。希望这个项目能帮助您在语音信号处理领域取得更好的研究成果!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2217616.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构代码题备考

文章目录 快速排序2011真题2013真题2018真题2016真题 快速排序的划分思想2016快速排序的最优解二路归并排序2011真题 链表备考思路基本功练习 图图的数据定义-邻接矩阵图的数据定义-邻接表2021-邻接矩阵2023-邻接矩阵2021-邻接表2023-邻接表 二叉树常用思路基本功练习前中后序遍…

思想实验思维浅谈

思想实验思维浅谈 思想实验(Thought Experiment)是一种在思想中进行的假想实验,思想实验激发人的想象力和思辨能力,是科学家思考问题的重要工具,通过想象、推理和分析来探索某种理论、假设或概念的可能性和内在逻辑&am…

项目管理软件真的能让敏捷开发变得更简单吗?

敏捷开发是一种以快速交付和适应变化为核心特点的软件开发方法。其特点包括尽早并持续交付、能够驾驭需求变化、版本周期内尽量不加任务、业务与开发协同工作、以人为核心、团队配置敏捷等。 例如,尽早并持续交付可使用的软件,使客户能够更早地体验产品…

涉密网和非涉密网之间企业如何进行安全跨网文件交换?

在数字化时代,企业面临着跨网文件交换的挑战,尤其是涉密网和非涉密网之间的数据传输。这种交换不仅要求高效,更要求安全,以防止数据泄露和网络攻击。以下是一些关键点,帮助企业实现安全跨网文件交换。 应用场景和重要性…

Linux 命令—— ping、telnet、curl、wget(网络连接相关命令)

文章目录 网络连接相关命令pingtelnetcurlwget 网络连接相关命令 ping ping 命令是用于测试网络连接和诊断网络问题的工具。它通过向目标主机发送 ICMP(Internet Control Message Protocol)回显请求,并等待回复,以确定目标主机是…

植物大战僵尸杂交版即将新增内容介绍

新BOSS僵尸:埃德加二世 特点:埃德加博士的克隆体,驾驶小型机甲。体型:小于原版僵王的头。血量:120000,是原版僵王复仇的2倍。免疫效果:减速、冰冻、黄油效果,能阻挡子弹。行为模式&…

【顺序表的模拟实现Java】

【顺序表的模拟实现Java】 顺序表的介绍Java代码实现检验代码功能 顺序表的介绍 由于之前在c语言板块写过详细的顺序表介绍,所以这一篇文章主要为Java代码的实现 下面为顺序表介绍的链接,如有需要点击下方链接跳转 c语言顺序表讲解 Java代码实现 pub…

Halcon基础-二维码识别

Halcon基础-二维码识别 1、二维码分类2、代码实现3、运行效果 1、二维码分类 二维码(Quick Response Code,简称 QR Code)是一种矩阵式二维码,能够在水平和垂直方向上存储信息。它们最初由日本的丰田子公司Denso Wave在1994年发明…

单细胞分析Seurat使用相关的10个问题答疑精选!

作为一个刚刚开始进行单细胞转录组分析的菜鸟,R语言底子没有,有时候除了会copy外,如果你让我写个for循环,我只能cross my fingers。。。。 于是我看见了https://satijalab.org/seurat/,Seurat是一个R软件包&#xff0…

基于SpringBoot的课程辅助教学系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…

java_跳转控制语句break

案例 1-100 以内的数求和,求出 当和 第一次大于 20 的当前数 【for break】 public class BreakExercise { //编写一个 main 方法 public static void main(String[] args) { //1-100 以内的数求和,求出 当和 第一次大于 20 的当前数 【for break】 …

基于 C# .NET Framework 开发实现 WebService服务实例详解——一文学懂WebService服务开发技术及应用

目录 1. Web Service 概念介绍 1.1 什么是 Web Service 1.2 SOAP(简单对象访问协议) 1.3 WSDL(Web 服务描述语言) 1.4 应用场景 2. 创建 Web Service 项目 3. 编写 Web Service 代码 3.1 打开 WebService1.asmx.cs 3.2 编…

鸿蒙网络编程系列3-TCP客户端通讯示例

1. TCP简介 TCP协议是传输层最重要的协议,提供了可靠、有序的数据传输,是多个广泛使用的表示层协议的运行基础,相对于UDP来说,TCP需要经过三次握手后才能建立连接,建立连接后才能进行数据传输,所以效率差了…

太速科技-426-基于XC7Z100+TMS320C6678的图像处理板卡

基于XC7Z100TMS320C6678的图像处理板卡 一、板卡概述 板卡基于独立的结构,实现ZYNQ XC7Z100DSP TMS320C6678的多路图像输入输出接口的综合图像处理,包含1路Camera link输入输出、1路HD-SDI输入输出、1路复合视频输入输出、2路光纤等视频接口,…

一文了解微服务与多租户

在当今快速发展的数字化时代,软件架构的选择对于企业的成功至关重要。微服务和多租户作为两种较为热门的架构模式,正逐渐成为企业构建高效、灵活和可扩展软件系统的热门选择。 一、微服务架构 (一)微服务的定义与概念 微服务是一…

HarmonyOS开发(状态管理,页面路由,动画)

官网 https://developer.huawei.com/consumer/cn/ 一、状态管理 在声明式UI中,是以状态驱动视图更新 1.State 状态(State):指驱动视图更新的数据,被装饰器标记的变量 视图(View):基于UI描述渲染得到用户界面 说明 State装饰…

《七度荒域:混沌之树》风灵月影二十二项游戏辅助:上帝模式/无限HP和EP/金币不减

《七度荒域:混沌之树》是款国产Roguelike银河恶魔城横版动作游戏,融合刷宝玩法。玩家将扮演修补世界的命运之子,探寻碎裂世界的秘密,在战斗轮回中成长,挑战未知与隐秘力量。风灵月影版修改器提供更多自定义和游戏体验调整选项&…

项目错误合集-自用

day1 验证码错误前后端交互错误 今天在写修改密码时,前端传递给后端验证码时,第一次犯错,redis中空指针异常,检查后发现 redis中没有账号的键,调试发现,我将user的account的键写成了getYzm 写对之后,发现出现了验证码不正确的错误,但是我是将redis中的数据直接复制过…

STM32——关于I2C的讲解与应用

1、什么是I2C? I2C(Inter-Integrated Circuit)是一种通用的总线协议。它是由Philips(飞利浦)公司,现NXP(恩智浦)半导体开发的一种简单的双向两线制总线协议标准。是一种半双工的同步通信协议。 2、I2C协议标准 I2C协议使用两根总线线路&am…

Bilidown v1.2.4 B站在线视频下载解析工具中文单文件版

Bilidown是一款专为B站视频下载而设计的工具,一款简洁好用的B站视频下载工具,支持由UP主上传的单集,多集以及相关封面,弹幕,字幕,音乐,刮削等等,支持任意粒度批量组合,登…