% 读取音频文件
[y, Fs] = audioread('y1.wav');
% 定义小波函数
wname = 'db3';
% 小波去噪的阈值
thr = 0.2;
% 小波去噪的模式
tmode = 'soft';
% 小波分解级数
level = 4;
% 进行小波分解
[C, L] = wavedec(y, level, wname);%C表示存放近似系数的向量
% 逐层去噪
for i = 1:level
% 计算当前层的索引范围
firstIdx = L(i)+1 ;
lastIdx = L(i+1);
% 计算阈值
sigma = median(abs(C(firstIdx:lastIdx))) / 0.6745;
thr = thselect(C(firstIdx:lastIdx), tmode) * sigma;
% 进行小波去噪
C(firstIdx:lastIdx) = wthresh(C(firstIdx:lastIdx), tmode, thr);
end
% 重构信号
y_denoised = waverec(C, L, wname);
% 播放去噪后的音频
sound(y_denoised, Fs);
% 绘制去噪前后的波形图
subplot(2,1,1);
plot(y);
title('Original Signal');
subplot(2,1,2);
plot(y_denoised);
title('Denoised Signal');
在matlab中运行这段代码后报错
设计系列】012:基于小波的音频信号去噪Matlab实现-2、语音去噪效果图的代码片段是:
% 小波去噪
[x, fs] = audioread('audio_noise.wav'); % 读取文件
level = 5; % 分解层数
wname = 'sym8'; % 小波基
[C, L] = wavedec(x, level, wname); % 分解
thr = wthrmngr('sqtwolog', C); % 计算默认阈值
sorh = 'h'; % 阈值类型:硬阈值‘h’,软阈值‘s’
keepapp = 0; % 是否保留近似系数:否‘0’
xd = wdencmp('gbl', C, L, wname, level, thr, sorh, keepapp); % 去噪
audiowrite('audio_denoised.wav', xd, fs); % 存储文件
这段代码实现了从音频文件中读取数据,使用小波分解将音频信号分解为多个尺度的小波系数,然后计算默认阈值并应用硬阈值或软阈值去噪,最后进行小波重构并将去噪后的音频数据存储为新的音频文件。
其中,audioread()
函数用于读取音频文件,返回采样率和音频数据。wavedec()
函数对音频数据进行多层小波分解,返回多个尺度的小波系数和长度向量。wthrmngr()
函数用于计算默认阈值,wdencmp()
函数则对小波系数进行阈值处理,获得去噪后的系数,并使用waverec()
函数进行小波重构,最后使用audiowrite()
函数将去噪后的音频数据存储为新的文件。