[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

  DEMO Code 运行代码

这里频率的变化是:

filter.frequency.value = volume.value * volume.value;

线性变化可能不太明显,所以改成了平方变化。

二、小结

滤波在通信中一个重要的意义是减少数据传输量,节约频带,提高传送效率,在硬件设备还未跟上语音通信的 web环境中,这个操作是十分有意义的!

本节重点是介绍 BiquadFilterNode 在 AudioContext 环境中的使用,比较简单。

三、参考资料






本文转自Barret Lee博客园博客,原文链接:http://www.cnblogs.com/hustskyking/p/webAudio-filter.html,如需转载请自行联系原作者
目录
相关文章
|
26天前
|
机器学习/深度学习 人工智能 算法框架/工具
基于人体姿势估计的舞蹈检测(AI Dance based on Human Pose Estimation)
基于人体姿势估计的舞蹈检测(AI Dance based on Human Pose Estimation)
49 0
|
机器学习/深度学习 存储 自然语言处理
多媒体信息处理学习笔记-Chap 5. Audio Retrieval(下篇)
多媒体信息处理学习笔记-Chap 5. Audio Retrieval(下篇)
125 0
多媒体信息处理学习笔记-Chap 5. Audio Retrieval(下篇)
|
机器学习/深度学习 存储 传感器
多媒体信息处理学习笔记-Chap 5. Audio Retrieval(中篇)
多媒体信息处理学习笔记-Chap 5. Audio Retrieval(中篇)
95 0
|
并行计算 算法 PyTorch
Stereo-Detection:适合新手的双目测距开源项目
Stereo-Detection:适合新手的双目测距开源项目
1090 0
|
传感器 机器学习/深度学习 存储
Simple-BEV: 多传感器BEV感知真正重要的是什么?(斯坦福大学最新)
不依赖高密度激光雷达的无人驾驶车辆,构建3D感知系统是一个很关键的问题,因为与camera和其他传感器相比,激光雷达系统的成本较高。最近的工作开发了多种仅camera的方法,其中特征可从多camera图像“提升”到2D ground plane,从而生成3D空间的“鸟瞰图”(BEV)特征表示。这一系列工作产生了多种新颖的“提升”方法,但训练设置中的其他细节同时也发生了变化,这使得大家不清楚什么是最佳方法。
Simple-BEV: 多传感器BEV感知真正重要的是什么?(斯坦福大学最新)
|
人工智能 算法 测试技术
Unity & FACEGOOD Audio2Face 通过音频驱动面部BlendShape
Unity & FACEGOOD Audio2Face 通过音频驱动面部BlendShape
2076 0
Unity & FACEGOOD Audio2Face 通过音频驱动面部BlendShape
|
机器学习/深度学习 Ubuntu 开发工具
相机和livox激光雷达外参标定:ROS功能包---livox_camera_lidar_calibration 介绍
**什么是相机与激光雷达外参标定?** 就是相机坐标系和激光雷达坐标系的TF变化。位置x,y,z 欧拉角 roll,pitch,yaw,6个变量构成一个4*4的旋转变换矩阵 标定的就是这个4维的旋转矩阵。 标定的方法有: - 基于特征 - 基于运动观测 - 基于最大化互信息 - 基于深度学习 基于特征 的方法是根据对应特征点求解PnP问题,需要标定板来获取特征 基于运动观测可以看作手眼标定问题,精度决定于相机和雷达的运动估计 基于最大化互信息认为图像灰度于反射强度具有相关性 基于深度学习需要长时间的训练并且泛化能力不高
相机和livox激光雷达外参标定:ROS功能包---livox_camera_lidar_calibration 介绍
相机与激光雷达标定:gazebo仿真livox_camera_lidar_calibration---R3live算法验证
ROS功能包:livox_camera_lidar_calibration提供了一个手动校准Livox雷达和相机之间外参的方法,已经在Mid-40,Horizon和Tele-15上进行了验证。其中包含了计算相机内参,获得标定数据,优化计算外参和雷达相机融合应用相关的代码。本方案中使用了标定板角点作为标定目标物,由于Livox雷达非重复性扫描的特点,点云的密度较大,比较易于找到雷达点云中角点的准确位置。相机雷达的标定和融合也可以得到不错的结果。 在前几篇中介绍了livox_camera_lidar_calibration功能包.以及在gazebo中搭建了标定场景.并进行外参标定,进行了简单的验
相机与激光雷达标定:gazebo仿真livox_camera_lidar_calibration---R3live算法验证
|
数据采集 传感器
相机与激光雷达标定:gazebo仿真livox_camera_lidar_calibration---标定数据采集与处理
ROS功能包:**livox_camera_lidar_calibration**提供了一个手动校准Livox雷达和相机之间外参的方法,已经在Mid-40,Horizon和Tele-15上进行了验证。其中包含了计算相机内参,获得标定数据,优化计算外参和雷达相机融合应用相关的代码。本方案中使用了标定板角点作为标定目标物,由于Livox雷达非重复性扫描的特点,点云的密度较大,比较易于找到雷达点云中角点的准确位置。相机雷达的标定和融合也可以得到不错的结果。
相机与激光雷达标定:gazebo仿真livox_camera_lidar_calibration---标定数据采集与处理
|
C++ 计算机视觉
相机与激光雷达标定:gazebo仿真livox_camera_lidar_calibration---相机内参标定
ROS功能包:**livox_camera_lidar_calibration**提供了一个手动校准Livox雷达和相机之间外参的方法,已经在Mid-40,Horizon和Tele-15上进行了验证。其中包含了计算相机内参,获得标定数据,优化计算外参和雷达相机融合应用相关的代码。本方案中使用了标定板角点作为标定目标物,由于Livox雷达非重复性扫描的特点,点云的密度较大,比较易于找到雷达点云中角点的准确位置。相机雷达的标定和融合也可以得到不错的结果。
相机与激光雷达标定:gazebo仿真livox_camera_lidar_calibration---相机内参标定