基于matlab的语音信号去噪

文章目录

前言

在实际应用中,语音信号往往会受到各种噪声的干扰,这会影响语音的质量和可懂度。因此,语音信号去噪是一个重要的研究领域。本文将通过获取音频,加噪处理,选用滤波器进行滤波处理得到处理过的音频这一完整过程带你了解语音去噪的完整过程。

1.获取音频

1.1读取原始音频

将原始音频加载进来,一般使用audioread()函数

格式如下:

[y,Fs] = audioread(filename)

从名为 filename 的文件中读取数据,并返回样本数据 y 以及该数据的采样率 Fs。

文件格式为注意要为(.wav)(.flac),可以使用一些文件格式转化的web进行在线转换。

1.2读取代码展示

matlab 复制代码
[y,Fs]=audioread('test.wav');

此处的test.wav文件放置在根目录下,当然你也可以放在其他地方,使用绝对路径或者相对路径能够找到该文件即可

运行结果得到的y,Fs如下

1.3截取音频

原始音频可能时间过长,因此我们可以使用audiowrite()函数对原音频进行截取保存

audiowrite(filename,y,Fs) 以采样率 Fs 将音频数据矩阵 y 写入名为 filename 的文件。filename 输入还指定了输出文件格式。输出数据类型取决于音频数据 y 的输出文件格式和数据类型

采样率即每秒采样的次数,因此如果想截取40s-50s的音频,可以使用如下代码

matlab 复制代码
audiowrite('share.wav', y(40*Fs:50*Fs), Fs);

此处将截取的音频保存在根目录下share.wav,同理也可以保存在其他位置

1.4 可视化处理

此处通过绘制原始语音信号时域及频谱图来进行可视化处理

1.4.1 原始信号时域图

代码部分:

matlab 复制代码
% y代表原序列
[y,Fs]=audioread('share.wav');
y=y(:,1); % 如果是双通道,可以使用该行代码,只考虑单通道
% 此处为了方便,将坐标的横轴显示成单位为s
T=1/Fs;
t=(1:length(y))*T;

plot(t,y)

运行结果:

1.4.2 原始信号频谱图

直接使用fft()对原序列即可

代码部分:

matlab 复制代码
Y=fft(y);
plot((1:length(Y))*2/length(Y),abs(Y));

运行结果:

2.加噪处理

对原始语音信号叠加噪声,常见噪声包括高斯白噪声、高频噪声、低频噪声等,此处使用高斯白噪声,并通过滤波器将其转换成高频噪声(为了后续方便选择低通滤波器),当然你也可以直接叠加高斯白噪声,后续去噪选择合适的滤波器即可。

2.1高斯白噪声

高斯白噪声是一种随机信号,它具有平均值为0和方差为常数的特点,并且在频谱上是均匀分布的。

MALTAB中,高斯白噪声可由wgn函数或者rand函数产生。

matlab 复制代码
% 高斯白噪声
noise=1*rand(size(y));

2.2高通滤波器

2.2.1 filterDesigner

可以通过命令行filterDesigner,进行设计,选择合适的参数即可生成代码

matlab 复制代码
function Hd = untitled
%UNTITLED 返回离散时间滤波器对象。

% MATLAB Code
% Generated by MATLAB(R) 24.1 and DSP System Toolbox 24.1.
% Generated on: 15-Nov-2024 21:22:38

% Equiripple Highpass filter designed using the FIRPM function.

% All frequency values are in Hz.
Fs = 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]/(Fs/2), [0 1], [Dstop, Dpass]);

% Calculate the coefficients using the FIRPM function.
b  = firpm(N, Fo, Ao, W, {dens});
Hd = dfilt.dffir(b);

% [EOF]

结果展示:

matlab 复制代码
% 滤波处理
hpf=filter(Hd,noise);

2.2.2信号分析器

界面展示:这里就不做阐述了

2.3噪音叠加处理

时域序列直接相加即可进行叠加,可以使用sound()函数播放叠加高斯白噪声后的序列

具体代码:

matlab 复制代码
y1=y+hpf;
%sound(y1,Fs)

2.4可视化处理

2.4.1 加噪时域图

matlab 复制代码
plot(t,y1)

结果显示:

2.4.2 加噪频域图

直接对噪音序列fft()即可

代码部分:

matlab 复制代码
Y1=fft(y1);
plot((1:length(Y1))*2/length(Y1),abs(Y1))

3.滤波降噪

根据频域图显然,使用低通滤波器比较合适,此处就选用巴特沃斯低通滤波器

3.1技术指标

通过对比加噪前和加噪后的频域图即可选择合适的技术指标

matlab 复制代码
% 巴特沃斯低通滤波器
%通带截止频率
Wp=0.50;
% 阻带截止频率
Ws=0.60;
Rp=3;Rs=50;

3.2设计巴特沃斯低通滤波器滤波

根据技术指标计算巴特沃斯滤波器的阶次N和截止频率Wc,选用低通滤波器,设计系统函数,对加噪序列进行滤波

y = filter(b,a,x) 使用由分子和分母系数 b 和 a 定义的有理传递函数 对输入数据 x 进行滤波。

代码部分:

matlab 复制代码
[N,Wc]=buttord(Wp,Ws,Rp,Rs);
[b,a]=butter(N,Wc,"low");
y2 = filter(b,a,y1);

3.3滤波结果可视化

3.3.1 降噪时域图

直接plot()即可

matlab 复制代码
plot(t,y2);
% ylim([-0.6 0.6]);
xlabel("时间/s");
ylabel("幅度");
title("巴特沃斯去噪音语音信号时域图");

3.3.2 降噪频域图

直接fft()即可

matlab 复制代码
Y2 = fft(y2);
% 去噪音语音信号频域图
plot((1:length(Y2))*2/length(Y2),abs(Y2));
ylim([0 600]);
xlabel("频率");
ylabel("幅度");
title("巴特沃斯去噪音语音信号频域图");

4.备注

完整过程运行结果图:

上述代码只是该过程的主要关键代码,完整版代码可以私信我免费获取

结语

上述过程即完成了获取音频,加噪,去噪的完整过程,相信你一定对语音去噪有了进一步的了解,上述代码可能有不足之处,欢迎批评指正!!!

相关推荐
马上到我碗里来1 天前
Simulink对仿真数据进行FFT频谱分析
matlab·simulink·fft
十七算法实验室1 天前
Matlab实现麻雀优化算法优化随机森林算法模型 (SSA-RF)(附源码)
算法·决策树·随机森林·机器学习·支持向量机·matlab·启发式算法
记录无知岁月1 天前
【MATLAB】目标检测初探
开发语言·yolo·目标检测·matlab·yolov3·yolov2
远望清一色1 天前
基于MATLAB身份证号码识别
开发语言·图像处理·算法·matlab
大福是小强1 天前
035_Progress_Dialog_in_Matlab中的进度条对话框
ui·matlab·进度条·界面开发·ux·用户界面
慕容复之巅1 天前
基于MATLAB的条形码的识别图像处理报告
开发语言·图像处理·matlab
小喵要摸鱼1 天前
MATLAB 使用教程 —— 矩阵和数组
matlab·矩阵
金星娃儿1 天前
MATLAB基础知识笔记——(矩阵的运算)
笔记·matlab·矩阵
哈听星2 天前
解非线性方程组
数学建模·matlab