小波分析去除音乐中的噪声


% 读取音频文件
 [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中运行这段代码后报错

img

设计系列】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()函数将去噪后的音频数据存储为新的文件。