语音信号去噪 Matlab语音信号去噪,GUI界面。分别添加了正弦噪声和高斯噪声,分别用了巴特沃斯低通滤波器和小波分解去噪。每步处理都可以播放出信号声音。
Matlab语音信号去噪,GUI界面。分别添加了正弦噪声和高斯噪声,分别用了巴特沃斯低通滤波器和小波分解去噪。每步处理都可以播放出信号声音。
具体工作如下:
1、加载语音信号,显示时域频域图;
2、添加正弦噪声;
3、分别使用巴特沃斯低通和小波变换去噪;
4、添加高斯白噪声;
5、再次使用巴特沃斯低通和小波变换去噪。
注:程序可直接运行,建议Matlab 2022b版本,低版本估计2018以上也行~
语音信号去噪
类别:信号处理、音频处理
用途:该项目旨在通过一个图形用户界面(GUI)来处理和去噪语音信号。用户可以加载语音信号,添加正弦噪声和高斯白噪声,并使用巴特沃斯低通滤波器和小波分解技术进行去噪。每一步处理后都可以播放处理后的信号声音。
项目特点
- 多级去噪:结合巴特沃斯低通滤波器和小波分解技术,逐级去除不同类型的噪声。
- 可视化:显示时域和频域图,直观展示去噪效果。
- 交互性:通过GUI界面,用户可以轻松加载信号、添加噪声、选择去噪方法,并播放处理后的信号。
- 兼容性:程序可在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));
运行项目
- 安装MATLAB:确保您已经安装了MATLAB,并且版本支持所需的小波工具箱。
- 准备数据:将您的语音信号数据保存为
speech_signal.wav
,并将该文件放置在项目目录下。 - 运行程序:
% 在MATLAB命令窗口中运行以下命令 cd path_to_project_directory % 切换到项目目录 speech_denoising % 运行主程序
注意事项
- 信号参数调整:根据实际语音信号的情况,可能需要调整滤波器的参数(如截止频率、滤波器阶数)和小波分解的参数(如小波类型、分解层数)。
- 数据格式:确保
speech_signal.wav
文件中的信号数据是单声道或双声道。 - 远程支持:如果在运行过程中遇到问题,可以通过远程调试的方式帮助解决。
项目总结
这个项目提供了一个完整的语音信号去噪解决方案,通过一个图形用户界面(GUI)实现信号的加载、噪声添加、去噪处理以及信号播放。项目代码简洁明了,注释丰富,适合学习和研究。希望这个项目能帮助您在语音信号处理领域取得更好的研究成果!