利用音频做FIR滤波实验

以下命令基于 Octave,理论上可用于 MATLAB,但实际是否能正常工作未验证。Octave 是 MATLAB 的开源替代。

加载音频

使用 audioread 函数读取音频文件,Alarm01.wav 是 Windows 10 系统目录 C:\Windows\Media 下的一个音频文件。

[a, fs] = audioread('Alarm01.wav');

所读取到文件包含左声道数据和右声道数据,提取右声道数据:

r = a(:,2);

绘制波形:

t=[0:length(r)-1]*(1.0/fs);
subplot(2,2,1);
plot(t,r);

分析音频谱

对右声道音频做傅里叶变换:

x = fft(r);

绘制谱:

f=[0:length(x)-1]*(fs/length(x));
subplot(2,2,2);
plot(f(1:length(x)/2),abs(x)(1:length(x)/2));

生成滤波系数

假设要将1000Hz以上的音频过滤掉,使用 fir1 函数生成滤波系数:

b = fir1(30, 1000/fs/2);
figure 2;
freqz(b);
figure 3;
stem(b);

滤波

调用 filter 函数执行滤波:

r1 = filter(b, 1, r);
figure 1;
subplot(2,2,3);
plot(t,r);

分析滤波后的音频

再次做傅里叶变换:

x1=fft(r1);
subplot(2,2,4);
plot(f(1:length(x1)/2),abs(x1)(1:length(x1)/2));

滤波前后的谱对比

滤波前:
在这里插入图片描述

滤波后:
在这里插入图片描述
可以看到 1000Hz 以上的信号被过滤掉了。

播放音频

调用 play 播放音频,用耳朵感觉一下滤波前后的声音:

p = audioplayer(r, fs);
play(p);
p1=audioplayer(r1,fs);
play(p1);

完整的 m 文件

% 加载音频
% 使用 audioread 函数读取音频文件,Alarm01.wav 是 Windows 10 系统目录 C:\Windows\Media 下的一个音频文件。
[a, fs] = audioread('Alarm01.wav');

% 所读取到文件包含左声道数据和右声道数据,提取右声道数据:
r = a(:,2);

% 绘制波形:
t=[0:length(r)-1]*(1.0/fs);
subplot(2,2,1);
plot(t,r);

% 分析音频谱
% 对右声道音频做傅里叶变换:
x = fft(r);

% 绘制谱:
f=[0:length(x)-1]*(fs/length(x));
subplot(2,2,2);
plot(f(1:length(x)/2),abs(x)(1:length(x)/2));

% 获得滤波系数
% 假设要将1000Hz以上的音频过滤掉,使用 fir1 函数获取滤波系数:
b = fir1(30, 1000/fs/2);
figure 2;
freqz(b);
figure 3;
stem(b);

% 滤波
% 调用 filter 函数执行滤波:
r1 = filter(b, 1, r);
figure 1;
subplot(2,2,3);
plot(t,r);

% 分析滤波后的音频
% 再次做傅里叶变换:
x1=fft(r1);
subplot(2,2,4);
plot(f(1:length(x1)/2),abs(x1)(1:length(x1)/2));

% 播放音频
% 调用 play 播放音频,用耳朵感觉一下滤波前后的声音:
p = audioplayer(r, fs);
play(p);
p1=audioplayer(r1,fs);
play(p1);
  • 3
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值