基于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.备注

完整过程运行结果图:

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

结语

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

相关推荐
fengfuyao98514 小时前
基于MATLAB的HHT变换完整实现(含EMD分解与三维时频谱生成)
开发语言·算法·matlab
Deep-w14 小时前
【MATLAB】基于 MATLAB 的直流电动机双闭环调速系统建模与仿真
开发语言·算法·matlab
T.i.s1 天前
论文复现8
matlab·fmcw
海神之光2 天前
【语音识别】基于matlab语音MFCC特征提取CNN深度学习语音识别【含Matlab源码 14470期】
matlab
Evand J2 天前
【自适应滤波】基于新息协方差匹配的自适应CKF目标跟踪 MATLAB 实战——在目标跟踪、雷达定位、组合导航和传感器融合等问题
人工智能·matlab·目标跟踪
三行数学2 天前
Matlab之父克利夫·莫勒尔逝世
开发语言·matlab
AI Dog3 天前
MathHub数学建模交流社区
数学建模·matlab
机器学习之心3 天前
基于投影寻踪动态聚类的多指标综合评价方法(PPDC),实验文档+MATLAB代码
matlab·数据挖掘·聚类
ji198594433 天前
局部线性嵌入(LLE)算法 MATLAB 实现
算法·机器学习·matlab
Evand J3 天前
【代码介绍】自适应R的AEKF(自适应扩展卡尔曼滤波)和经典EKF比较,MATLAB例程|三维非线性系统
开发语言·matlab·ekf·自适应·自适应滤波