在b站看五五开受到其他杂音干扰之滤波抗干扰

这个想法源于小虎在B站看到五五开打牌时在“得得得”,然后受到隔壁电钻声音干扰,想要恢复保持五五开的声音。为了易于处理,我选了五五开的声音和一个男高音的声音,这样他们两个声音的频率明显地不同。这里用到MATLAB进行处理。

滤波方法

基本的滤波方法有四种:低通、高通、带通、带阻。这里用到的是低通的思想(其实也可以设带通)。见下图。 A ( f ) A(f) A(f)较低的部分信号会受到极大地衰减、较高的部分可以几乎不受衰减通过。
在这里插入图片描述

音频滤波前后结果

在这里插入图片描述

  • 通过傅里叶变换得到音频文件的频谱,可以看到频率较明显的分为两个频率,这两个频率处于两个不同的频段。要提取的五五开音频处在较低的音频区域
  • 即使是滤波后仍然有一些杂音,因为这个男高音演唱的时候有乐器伴奏,一些伴奏的声音音频跟五五开的声音频率差不多。
  • 部分五五开声音被滤波,声音略微有些浑浊。

在这里插入图片描述

滤波后的频谱图

代码分析

读取音频

[data, FsIn] = audioread('wuwukai.mp3');

设置参数

Fs=FsIn;
dt=1.0/Fs;
T=1; N=T/dt;
len=length(data);
t=[1:len]/len;

滤波处理

这里用到了finite impluse response有限脉冲响应这个函数。还有很多其他的滤波器和方法,MATLAB中也有不少集成的函数,如fir1,fir2,ifir等等。

x=data(1:len,1)';

b=fir1(48,0.2);
x2=filter(b,1,x);

听音识趣

这里可以轮流听一下原始音频和滤波后的音频。

% original sound
sound(data(1:len,1), FsIn);

% filtered sound
sound(x2, FsIn);

完整代码(不含画图)

[data, FsIn] = audioread('wuwukai.mp3');

% Parameters
Fs=FsIn;
dt=1.0/Fs;
T=1; N=T/dt;
len=length(data);
% len=length(data(1:20000));
t=[1:len]/len;

x=data(1:len,1)';

b=fir1(48,0.2);
x2=filter(b,1,x);

% original sound
% sound(data(1:len,1), FsIn);
% filtered sound
sound(x2, FsIn);

测试音频和完整代码(含画图)

anthonyweidai/Signal-Processing-in-MATLAB

posted @ 2020-05-07 10:48  狂小虎  阅读(94)  评论(0编辑  收藏  举报