[Voice communications] 声音的滤波
本系列文章主要是介绍 Web Audio API 的相关知识,以及 web语音通信 中会遇到的一些问题,阐述可能存在错误,还请多多斧正!
通过设备获取音频流会不可避免的渗入一些杂音,这些杂音可能来自你周边的环境,也有可能来自录音设备本身,一些低频的声音还好,人耳难以分辨出来,但是那些高频的白噪声对音质的影响是特别大的,如我们听收音机没有调到正确的频率上,会听到吱吱兹兹的刺耳的杂音。这些杂音不仅增大了音频流信号本身的体积,而且我们的耳朵也不喜欢,所以在传输之前必须对音频做相应的滤波处理。
本文地址:http://www.cnblogs.com/hustskyking/p/webAudio-filter.html,转载请注明源地址。
P.S:请在较新版的 chrome 火狐 Firefox 中测试。
一、滤波节点
1. 接口介绍
频率,是单位时间内完成振动的次数,是描述振动物体往复运动频繁程度的量。一段音频流中包含了各种频率,温和的音乐频率在一个范围之内,超过这个范围的声音一般就是噪声,人和人之间的语音交流,声音也是在一定的频段之中。
在 AudioContext 中用于滤波的节点叫做 BiquadFilterNode,Biquad 是双二阶的意思,这里涉及到了很多通信中专业词汇,我们暂时可以不用在意。BiquadFilterType 包含了各种滤波类型:
enum BiquadFilterType {
"lowpass",
"highpass",
"bandpass",
"lowshelf",
"highshelf",
"peaking",
"notch",
"allpass"
};
用的比较多的就是 lowpass(低通滤波),highpass(高通滤波),bandpass(带通滤波)。低通滤波就是过滤某个临界点的高频信号,只让低频信号通过,高通滤波反之。带通滤波就是允许某个频段的信号通过。这个节点的参数比较多:
attribute BiquadFilterType type;
readonly attribute AudioParam frequency; // in Hertz
readonly attribute AudioParam detune; // in Cents
readonly attribute AudioParam Q; // Quality factor
readonly attribute AudioParam gain; // in Decibels void getFrequencyResponse(Float32Array frequencyHz,
Float32Array magResponse,
Float32Array phaseResponse); };
其中几个参数的取值范围是:
Q 默认是 1, 取值从 0.0001 到 1000.
gain 默认是 0, 取值从 -40 到 40.
2. 初始化接口
我们可以在初始化的时候将 BiquadFilterType 送进去:
// 初始化为低通滤波
var filter = context.createBiquadFilter("lowpass");
当然,我们也可以通过设置他的 AudioParam 来控制参数:
var filter = context.createBiquadFilter();
// 设置为低通滤波
filter.type = filter.LOWPASS;
// 只允许频率小于 800Hz 的音频信号通过
filter.frequency.value = 800;
两只方式都是一样的,都好控制。
3. DEMO 测试
简单点的话,中间只用一个 filter 节点就可以了,使用低通滤波,将频率设置为 800Hz,可以听到声音很闷,声音不是变小了,而是变闷了~节点之间的连接方式是:
Source -> Filter -> Destination
代码:
var AudioContext = AudioContext || webkitAudioContext;
var context = new AudioContext;
//创建节点
var audio = new Audio("http://qianduannotes.duapp.com/file/SuperMario.mp3");
audio.loop = true;
var media = context.createMediaElementSource(audio);
var filter = context.createBiquadFilter();
filter.type=filter.LOWPASS;
filter.frequency.value=800;
//连接:media → filter → destination
media.connect(filter);
filter.connect(context.destination);
audio.play();
为了方面查看改变频率之后波形的变化,我做了一些处理:
Source -> Filter -> Analyser -> Destination
|
+-----> 波形绘制到 Canvas
<canvas id="canvas" width="400" height="300"></canvas><br />
<input type="range" min="0" max="100" id="volume" />
<input type="button" onclick="audio.play()" value="播放" />
<input type="button" onclick="audio.pause()" value="暂停" />
<script type="text/javascript">
var AudioContext=AudioContext||webkitAudioContext;
var context=new AudioContext;
//创建节点
var audio = new Audio("http://qianduannotes.duapp.com/file/SuperMario.mp3");
audio.loop = true;
var media=context.createMediaElementSource(audio);
var filter=context.createBiquadFilter();
var analyser=context.createAnalyser();
//只允许小于800的频率通过
filter.type=filter.LOWPASS;
filter.frequency.value=800;
//Canvas初始化
var width=canvas.width,height=canvas.height;
var g=canvas.getContext("2d");
g.translate(0.5,height/2+0.5);
//连接:media → filter → analyser → destination
media.connect(filter);
filter.connect(analyser);
analyser.connect(context.destination);
//以fftSize为长度创建一个字节数组作为数据缓冲区
var output=new Uint8Array(analyser.fftSize);
//播放帧
(function callee(e){
analyser.getByteTimeDomainData(output);
//将缓冲区的数据绘制到Canvas上
g.clearRect(-0.5,-height/2-0.5,width,height);
g.beginPath();
for(var i=0;i<width;i++)
g.lineTo(i,height*(output[output.length*i/width|0]/256-0.5));
g.stroke();
//请求下一帧
requestAnimationFrame(callee);
})();
//播放
audio.play();
load = volume.onchange = function(){
filter.frequency.value = volume.value * volume.value;
}
</script>
DEMO Code
这里频率的变化是:
filter.frequency.value = volume.value * volume.value;
线性变化可能不太明显,所以改成了平方变化。
二、小结
滤波在通信中一个重要的意义是减少数据传输量,节约频带,提高传送效率,在硬件设备还未跟上语音通信的 web环境中,这个操作是十分有意义的!
本节重点是介绍 BiquadFilterNode 在 AudioContext 环境中的使用,比较简单。
三、参考资料
- http://www.w3.org/TR/webaudio/ W3C Group
- http://www.web-tinker.com/ 次碳酸钴
[Voice communications] 声音的滤波的更多相关文章
- [Voice communications] 音量的控制
改变音频的音量是音频处理中最基础的部分,我们可以利用 GainNode 来构建 Mixers 的结构块.GainNode 的接口是很简单的: interface GainNode : AudioNod ...
- [Voice communications] 看得到的音频流
上文介绍了 Web Audio API 的相关知识,以及如何在你的 web 程序中引入 音频流,内容都是介绍性的,所以没有写太多 DEMO.本文重点讲解如何利用 Web Audio API 中的中间节 ...
- [Voice communications] 声道的转换
本系列文章主要是介绍 Web Audio API 的相关知识,以及 web语音通信 中会遇到的一些问题,阐述可能存在错误,还请多多斧正! 很多粤语剧都提供了两个声道,一个左声道为粤语,一个右声道有国语 ...
- [Voice communications] 让音乐响起来
本系列文章主要是介绍 Web Audio API 的相关知识,由于该技术还处在 web 草案阶段(很多标准被提出来,至于取舍需要等待稳定版文档来确定,草案阶段的文档很多都会被再次编辑甚至重写.全部删除 ...
- GRE红宝书5-6
page5 adopt: adoration: adore: --ore讲话, oration演讲 adorn: orn表示装饰, ornate adulation: adulate ...
- (Step by Step)How to setup IP Phone Server(VoIP Server) for free.
You must have heard about IP Phone and SIP (Software IP Phone).Nowadays standard PSTN phone are bein ...
- 100度享乐电商网 html
<!DOCTYPE html><html> <head> <meta charset="utf-8" /> <title> ...
- 每日英语:5 Things to Know About Missing Malaysia Airlines Flight and Air Safety
Malaysia Airlines Flight MH370, with 239 people aboard, lost contact early Saturday with the airline ...
- 转载:P2P技术原理及应用(1)
转帖allen303allen的空间 作 者:金海 廖小飞 摘要:对等网络(P2P)有3种主要的组织结构:分布式哈希表(DHT)结构.树形结构.网状结构.P2P技术已 经延伸到几乎所有的网络应用领域, ...
随机推荐
- 怎样用conda安装opencv
首先用Anaconda是因为方便(管理方便,包安装真心不方便).下面是我的安装过程: 首先使用如下命令安装opencv conda install -c https://conda.binstar.o ...
- Addthis
WordPress外贸主题模版可以非常方便地整合国外流行的分享收藏社会化网络功能,比如Addthis是国外一个网络书签按钮聚合网站,是稳步提升网站流量和搜索引擎排名的WEB2.0工具!通过AddThi ...
- activemq 控制面板里的 Number Of Pending Messages、 Messages Enqueued、Messages Dequeued含义
Number Of Consumers 消费者 这个是消费者端的消费者数量 Number Of Pending Messages 等待消费的消息 这个是当前未出队列的数量.可以理解为总接收数-总出队 ...
- animation_Frame动画图片轮播
我们刚接触的时候想弄一个轮播图片的一个小案例,但一开始我们以为和以前写java一样,要写一下方法,逻辑:但今天你学了这个Frame动画就可以轻松搞定!下面我们来看看这个Frame是怎么实现的. 第一步 ...
- Python学习日志(一)
Python的安装 访问http://www.python.org 点击downloads,选择Windows 我在这里选择了Latest Python 3 Release - Python 3.5. ...
- jQuery Validate验证框架详解
转自:http://www.cnblogs.com/linjiqin/p/3431835.html jQuery校验官网地址:http://bassistance.de/jquery-plugins/ ...
- 写给Git初学者的7个建议
[原文] - http://blog.jobbole.com/50603/ 当我刚刚开始使用Git的版本控制时,我根本不确定我付出那么多时间是不是会得到回报.Branch.Stage.Stash,这些 ...
- BZOJ1565 [NOI2009]植物大战僵尸(拓扑排序 + 最大权闭合子图)
题目 Source http://www.lydsy.com/JudgeOnline/problem.php?id=1565 Description Input Output 仅包含一个整数,表示可以 ...
- 【CQgame】[幸运方块 v1.1.2] [Lucky_Block v1.1.2]
搬家首发!!! 其实从初一我就写过一些小型战斗的游戏,但是画面都太粗糙,代码也比较乱,也就是和两三个同学瞎玩,但自从观摩了PoPoQQQ大神的游戏,顿时产生了重新写一部游戏的冲动,于是各种上网查找各种 ...
- 第三章 一个简单的机器学习例子让你了解DeepLab的语言风格
MINST是由Yann LeCun等人建立并维护的手写数字识别数据库.该数据库总共包含60000个训练样本和10000个测试样本.其中每个样本的大小是一张28*28的手写数字图片.数字包括从0~9总共 ...