利用音频做FIR滤波实验

news/2024/6/17 10:15:36 标签: matlab, 数字信号处理, 音频, octave

以下命令基于 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);

http://www.niftyadmin.cn/n/1106975.html

相关文章

webpack(3.8.1版本)

他是一个前端资源加载或打包工具。例如:css,js,json,img等 本质上,webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler)。当 webpack 处理应用程序时,它会递归地构建一个依赖关系图(dependency graph),其中包…

十个正确使用 Redis 的技巧

Redis 在当前的技术社区里是非常热门的。从来自 Antirez 一个小小的个人项目到成为内存数据存储行业的标准,Redis已经走过了很长的一段路。随之而来的一系列最佳实践,使得大多数人可以正确地使用 Redis。下面我们将探索正确使用 Redis 的10个技巧。 1、停…

IPS主动式防护 多层深层保护企业网络(转)

IPS主动式防护 多层深层保护企业网络(转)[more]  随着核心应用业务逐渐网络化,网络安全成为企业网络管理人员最急需解决的问题,“系统入侵”目前是威胁企业网络信息安全的首要元凶,系统漏洞屡被攻击,病毒在网络泛滥,…

关于Pre-bound JDBC Connection found! HibernateTransactionManager does not 异常小结

昨天帮女朋友配置ssh框架的多数据源, 本以为对此已经很熟悉,配置完其他的错倒是还能接受,调了一下就好了。 唯独 Pre-bound JDBC Connection found! HibernateTransactionManager does not 这个异常着实浪费了我些时间。 也百度看到网上说是…

RSS, Transmission flexget in linux

安装transmission,我用的是transmission-daemon webUI 参考https://wiki.archlinux.org/index.php/Transmission_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87) 和https://github.com/transmission/transmission/wiki设置transmission,以transmission-daemon…

update加索引还是很慢_搜索引擎的极致优化——思想以及相关的数据结构

LSM思想LSM (Log Structured Merge Tree),最早是谷歌的 “BigTable” 提出来的,目标是保证写入性能,同时又能支持较高效率的检索,在很多 NoSQL 中都有使用,Lucene 也是使用 LSM 思想来写入。普通的B树增加记录可能需要…

PostgreSQL修炼之道:从小工到专家. 2.5 小结

2.5 小结 本章讲解了PostgreSQL在不同平台下的二进制安装方法,以及从源代码进行安装的方法。从前面的叙述中可以看出,在多数Linux发行版本中都自带了PostgreSQL的二进制安装包,可以直接使用Linux发行版本中的包管理器进行安装。不过这些自带…

全线出击 多方防御网络病毒的入侵(转)

全线出击 多方防御网络病毒的入侵(转)[more]  越来越多的病毒利用互联网的各个通道传播,新的恶性病毒也不再设计为加强传播而预留的潜伏期了,中招后就会立即发作。一个新病毒出现后,可以在数小时至数天内遍布全球。 ActiveX控件和Java代码 …