自学内容网 自学内容网

基于matlab的语音信号去噪

前言

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

1.获取音频

1.1读取原始音频

将原始音频加载进来,一般使用audioread()函数
格式如下:

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

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

1.2读取代码展示

[y,Fs]=audioread('test.wav');

此处的test.wav文件放置在根目录下,当然你也可以放在其他地方,使用绝对路径或者相对路径能够找到该文件即可
运行结果得到的y,Fs如下
在这里插入图片描述

1.3截取音频

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

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

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

audiowrite('share.wav', y(40*Fs:50*Fs), Fs);

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

1.4 可视化处理

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

1.4.1 原始信号时域图

代码部分:

% 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()对原序列即可
代码部分:

Y=fft(y);
plot((1:length(Y))*2/length(Y),abs(Y));

运行结果:
在这里插入图片描述

2.加噪处理

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

2.1高斯白噪声

高斯白噪声是一种随机信号,它具有平均值为0和方差为常数的特点,并且在频谱上是均匀分布的。
MALTAB中,高斯白噪声可由wgn函数或者rand函数产生。

% 高斯白噪声
noise=1*rand(size(y));

2.2高通滤波器

2.2.1 filterDesigner

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

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]

结果展示:
在这里插入图片描述

% 滤波处理
hpf=filter(Hd,noise);

2.2.2信号分析器

界面展示:这里就不做阐述了
在这里插入图片描述

2.3噪音叠加处理

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

y1=y+hpf;
%sound(y1,Fs)

2.4可视化处理

2.4.1 加噪时域图

plot(t,y1)

结果显示:
在这里插入图片描述

2.4.2 加噪频域图

直接对噪音序列fft()即可
代码部分:

Y1=fft(y1);
plot((1:length(Y1))*2/length(Y1),abs(Y1))

在这里插入图片描述

3.滤波降噪

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

3.1技术指标

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

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

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

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

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

代码部分:

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

3.3滤波结果可视化

3.3.1 降噪时域图

直接plot()即可

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

3.3.2 降噪频域图

直接fft()即可

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

4.备注

完整过程运行结果图:
在这里插入图片描述
上述代码只是该过程的主要关键代码,完整版代码可以私信我免费获取

结语

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


原文地址:https://blog.csdn.net/2401_85464956/article/details/143808428

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!