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

完整过程运行结果图:

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

结语

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

相关推荐
ghie90907 小时前
基于MATLAB的TLBO算法优化实现与改进
开发语言·算法·matlab
wuk9987 小时前
VSC优化算法MATLAB实现
开发语言·算法·matlab
2401_863318639 小时前
机动车防撞击系统设计
matlab
jllllyuz13 小时前
MATLAB实现蜻蜓优化算法
开发语言·算法·matlab
yyy(十一月限定版)14 小时前
初始matlab
开发语言·matlab
listhi52014 小时前
基于MATLAB的支持向量机(SVM)医学图像分割方法
开发语言·matlab
崇山峻岭之间16 小时前
Matlab学习记录30
开发语言·学习·matlab
民乐团扒谱机16 小时前
【微实验】MATLAB 仿真实战:多普勒效应 —— 洒水车音乐的音调变化仿真
开发语言·matlab·多普勒效应·多普勒频移
Evand J17 小时前
【课题推荐】基于超分辨率技术的低功耗定位系统|低功耗物联网|信号处理。附MATLAB运行结果
物联网·matlab·信号处理
f***241119 小时前
MATLAB高效算法优化实战指南
开发语言·算法·matlab