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

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

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.kler.cn/news/354152.html

相关文章:

  • 鸿蒙开发 四十五 鸿蒙状态管理(嵌套对象界面更新)
  • 【论文#性能对比】Video coding with H.264/AVC: Tools, Performance, and Complexity
  • 《太吾绘卷》风灵月影游戏辅助好不好用?《太吾绘卷》风灵月影游戏辅助功能 全解析
  • stm32 单片机使用 rt-thread 的syswatch 系统守护软件包
  • 27.第二阶段x86游戏实战2-遍历周围NPC跳出递归循环
  • Unity3D Shader预热生成详解
  • Vue 之 插件与组件的区别
  • appium启动hbuild打包的apk异常解决
  • Raid盘类型及其特点
  • Flask框架@app.route中的路径及其视图函数
  • 如何有效参与机器人顶会?——周易教授PRE-IROS 2024分享
  • 【数据分析】影响系数 =(今日量-昨日量)/(今日总量-昨日总量)
  • git 操作暂存区命令用法大全
  • ChatGPT 现已登陆 Windows 平台
  • html和css实现页面
  • 文件加密技术解析:守护敏感信息的第一道防线
  • 技术分享:A-23OH型树脂在汽车涂装废溶剂回收中的应用
  • YOLOv11改进策略【卷积层】| SPD-Conv 针对小目标和低分辨率图像的检测任务
  • Django一分钟:DRF中序列化器字段source参数的作用
  • H5对接海康硬盘录像机视频简单说明