利用音频做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));

滤波前后的谱对比

滤波前:
利用音频做FIR滤波实验_第1张图片

滤波后:
利用音频做FIR滤波实验_第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);

你可能感兴趣的:(数字信号处理,matlab,数字信号处理,音频,octave)