在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