HTML5实现DTMF(电话拨号按键信号)解码、编码,代码简单易于移植
DTMF(Dual Tone Multi Frequency) 双音多频,由高频群和低频群组成,高低频群各包含4个频率;两个频率波形合成按键信号(0-9 * # A B C D)。
SIP中检测DTMF信号的方法:SIPINFO、RFC2833、INBAND;至于这些是什么我这个外行纯属热闹;拿两个手机互打电话,中途按下的按键嘟嘟的声音就是直接通过话音来传输DTMF信号,属于INBAND(带内检测)吧。
拿Adobe Audition打开手机上的电话录音文件,可以直观的肉眼看到整齐的DTMF信号,分析一下就能很快GET到此信号的解码、编码原理。
在线测试地址:在线测试
【图1】简单粗暴合成的PCM信号杂波较多,但和华为手机打出来的录音信号差不多(他们杂波少点)
一、前言
1.1 HTML5实现DTMF的一些动机
我的GitHub开源库 Recorder 功能日渐丰富,最近又有项目可能会用到DTMF的解码功能,所以就用js实现了一下,本着易于移植的目的,相关代码都是简单的纯js代码,移植到别的语言非常方便。
涉及到三个源码,个个小巧:
- FFT:lib.fft.js 111行(代码+空行+注释)
- DTMF解码:dtmf.decode.js 192行(代码+空行+注释)
- DTMF编码:dtmf.encode.js 191行(代码+空行+注释)
自评:高性能、准确度高、误识别率低;欢迎到 在线测试,下载别的一个软件 dtmf2num(命令行) 来对比伤害一下。
1.2 一些有效场景
(1) 10086
查话费请按1,嘟(你按了一个1),您的话费余额为9亿9千万……不能否认,这些能力的实现是建立在DTMF信号的编解码之上。
(2) 软电话
透过某些渠道,比如在你服务器上的程序拥有了自动拨打电话的能力,你希望通过用户按下某些按键后实现一些功能,比如输入密码,这样你的服务器端程序就需要带上DTMF解码功能。
(3) 小玩具
写一些小玩具把玩。嘿哈
HTML5实现DTMF(电话拨号按键信号)解码、编码,代码简单易于移植的更多相关文章
- NEC遥控信号解码(包含完整代码)
一.遥控器解码说明 1.遥控器的编码格式常见有两种,一种是NEC 格式,一种是RC5 格式.遥控器发出的信号,通过一个红外的接收头之后,信号被送到MCU 的一个中断引脚.通过MCU 来识别不同的时序, ...
- Mono for Android—初体验之“电话拨号器”
1.Main.axml文件: <?xml version="1.0" encoding="utf-8"?><LinearLayout xmln ...
- [Android]电话拨号器开发
继续今天的Android,经过昨天大体了解了Android开发的一些基本文件结构,今天来做一个电话拨号器! 预期达到的效果 实现过程 首先还是按照昨天第一篇教程,新建一个项目叫PhoneCall的An ...
- android案例一 电话拨号器
效果图: 电话拨号器的核心原理: 意图 MainActivity代码: private EditTest et_number; //加载一个布局 setContentView(R.l ...
- 无废话Android之常见adb指令、电话拨号器、点击事件的4种写法、短信发送器、Android 中各种布局(1)
1.Android是什么 手机设备的软件栈,包括一个完整的操作系统.中间件.关键的应用程序,底层是linux内核,安全管理.内存管理.进程管理.电源管理.硬件驱动 2.Dalvik VM 和 JVM ...
- android之电话拨号器
在android入门的案例中,除了HelloWorld这个经典案例,还有一个电话拨号器需要掌握,现在我就来个电话拨号器的示范,毕竟大牛也是从菜鸟进化而来的. 首先你应该知道自己要设置怎样的UI,然后创 ...
- Android入门——电话拨号器和四种点击事件
相对于HelloWorld来说,电话拨号器也是Android的一个入门demo,从这个样例我们要理清楚做安卓项目的思路. 大体分为三步: 1.理解需求,理清思路 2.设计UI 3.代码实现 电话拨号器 ...
- android 电话拨号器
电话拨号器(重点) 1.产品经理: 需求分析文档,设计原型图 2.UI工程师: 设计UI界面 3.架构师: 写架构,接口文档 4.码农: 服务端,客户端 ...
- Android学习3—电话拨号器
本测试主要实现了一个Android的拨打电话的功能 一:界面预览 由图中可以看出,这个Activity需要3个控件:TextView.EditText.Button 其实实现一个功能要经过几个步骤: ...
随机推荐
- Golang基础教程——map使用篇
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是golang专题的第7篇文章,我们来聊聊golang当中map的用法. map这个数据结构我们经常使用,存储的是key-value的键 ...
- jchdl - RTL Event
https://mp.weixin.qq.com/s/P9uoJwIYdM-mbiR9WCtJCg hardware modeling基于事件驱动模型,RTL中定义了多种事件. jchdl 参考了 ...
- js运算符和if语句,switch语句
逻辑运算符 类型 运算符 算数运算符 + - * / % ++ -- 赋值运算符 = 比较运算符 > < >= <= == != ...
- java方法句柄-----2.方法句柄的获取、变换、特殊方法句柄
目录 1.获取方法句柄 1.1查找构造方法.一般方法和静态方法的方法句柄 1.2 查找类中的特殊方法(类中的私有方法) 1.3 查找类中静态域和一般域 1.4 通过反射API得到的Constructo ...
- Java实现 蓝桥杯 算法训练 最大的算式
算法训练 最大的算式 时间限制:1.0s 内存限制:256.0MB 问题描述 题目很简单,给出N个数字,不改变它们的相对位置,在中间加入K个乘号和N-K-1个加号,(括号随便加)使最终结果尽量大.因为 ...
- Java实现 LeetCode 200 岛屿数量
200. 岛屿数量 给定一个由 '1'(陆地)和 '0'(水)组成的的二维网格,计算岛屿的数量.一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的.你可以假设网格的四个边均被水包围. ...
- Java实现 LeetCode 172 阶乘后的零
172. 阶乘后的零 给定一个整数 n,返回 n! 结果尾数中零的数量. 示例 1: 输入: 3 输出: 0 解释: 3! = 6, 尾数中没有零. 示例 2: 输入: 5 输出: 1 解释: 5! ...
- 第四届蓝桥杯JavaC组国(决)赛真题
解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.好好学习 汤姆跟爷爷来中国旅游.一天,他帮助中国的小朋友贴标语.他负责贴的标语是分别写在四块红纸上的四个大字:"好.好.学. ...
- linux安装QT-Designer两种方法
1.安装Qt-Creator, Qt-Creator自带了qt-designer 2.安装qt5-default,qttools5-dev-tools
- Mybatis详解(二) sqlsession的创建过程
我们处于的位置 我们要清楚现在的情况. 现在我们已经调用了SqlSessionFactoryBuilder的build方法生成了SqlSessionFactory 对象. 但是如标题所说,要想生成sq ...