matlab如何减去噪音,如何使用matlab中的allpassfilter消除声音中的噪音?

我下载了干净而嘈杂的音频文件。

首先让我们分析一小部分音频。

n=1024*8; % a small portion of data

w1=1e5;

w2=w1+n-1;

sig_noisy=data_n(w1:w2,1); % noisy audio

sig_clean=data_c(w1:w2,1); % clean audio

figure; hold all

plot(sig_noisy,'b')

plot(sig_clean,'r','LineWidth',2)

ylim([-1.5 1.5])

legend('Noisy','Clean')

6oqXf.png

正如在这里看到的那样,嘈杂的音频在某种程度上已经饱和了

截断版本的干净信号。截断信号会引起谐波

在更大的频率。让我们来看看功率谱

密度信号。

n=1024*1; % a smaller portion of data

w1=1e5;

w2=w1+n-1;

sig_noisy=data_n(w1:w2,1); % noisy

sig_clean=data_c(w1:w2,1); % clean

[psd_noisy, f] = pwelch(sig_noisy);

[psd_clean, ~] = pwelch(sig_clean);

figure; hold all

plot(f/pi,db(psd_noisy),'b')

plot(f/pi,db(psd_clean),'r')

xlabel('Normalized Freq.')

legend('Noisy','Clean')

8VI1f.png

您会看到嘈杂的音频在高频时具有谐波和噪音。那么,现在如果你假设噪声的特性没有在音频结束时发生变化,那么你可以设计一个过滤器来查看音频的这一小部分。既然你已经有了嘈杂和干净的信号,为什么不使用去卷积方法。

例如,如果用干扰信号去卷积干净信号,那么

您获得系统的反向响应(h_inv),它也是可用于过滤噪声信号的滤波器系数

(sig_noisy = sig_clean * h)。

这里我使用Wiener反卷积方法。另请注意,此功能不仅适用于图像,您也可以使用Matlab中的解卷积方法和1D信号。

h_inv=deconvwnr(sig_clean,sig_noisy);

figure,plot(h_inv)

legend('h^-^1')

DYK4X.png

正如我所说,这是你需要的滤波器系数。例如,如果我用h_inv过滤噪声信号:

sig_filtered=conv(sig_noisy,h_inv,'same');

[psd_filtered, ~] = pwelch(sig_filtered);

figure; hold all

plot(f/pi,db(psd_noisy),'b')

plot(f/pi,db(psd_clean),'r')

plot(f/pi,db(psd_filtered),'k')

xlabel('Normalized Freq.')

legend('Noisy','Clean','Filtered')

Y8AgR.png

滤波后的信号频谱非常接近干净的信号频谱。现在你有了滤波器系数,只需用h_inv过滤整个有噪声的音频并听取结果。

filtered_all=conv(data_n(:,1),h_inv,'same');

sound(filtered_all,48000)

您可以尝试其他反卷积方法并查看结果。您还可以将傅立叶域中不需要的频谱归零,并采用反傅立叶来获得干净的信号。但是,由于信号太长,您必须在滑动窗口中进行。或者,您可以设计级联陷波滤波器以分别过滤每个谐波。

我看到有四个强度谐波。因此,为每个滤波器设计四个陷波滤波器,并设置低通滤波器以滤除高频噪声。

% First notch

fc1=0.0001; bw1=0.05; N=4;

f = fdesign.notch('N,F0,BW',N,fc1,bw1); h = design(f);

% Second notch

fc2=0.21; bw2=0.2;

f = fdesign.notch('N,F0,BW',N,fc2,bw2); h2 = design(f);

% Third notch

fc3=0.41; bw3=0.2;

f = fdesign.notch('N,F0,BW',N,fc3,bw3); h3 = design(f);

% Fourth notch

fc4=0.58; bw4=0.2;

f = fdesign.notch('N,F0,BW',N,fc4,bw4); h4 = design(f);

% A Final lowpass filter

f = fdesign.lowpass('Fp,Fst,Ap,Ast',0.6,0.65,1,30); h5 = design(f);

% Cascade the filters

hd = dfilt.cascade(h, h2, h3, h4, h5);

% See the filter characterisctic

ff=fvtool(hd,'Color','white');

% Now we can filter our

sig_filtered2 = filter(hd,sig_noisy);

[psd_filtered2,f] = pwelch(sig_filtered2);

figure; hold all

plot(f/pi,db(psd_noisy),'b');

plot(f/pi,db(psd_clean),'r');

plot(f/pi,db(psd_filtered2),'k');

xlabel('Normalized Freq.')

legend('Noisy','Clean','Filtered')

iIPoL.png

tCNzm.png

现在您可以过滤整个音频

filtered_all2 = filter(hd,data_n(:,1));

sound(filtered_all2,48000)

希望我帮助过。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值