音视频--DTMF信号发送及检测

news2024/9/27 5:59:27

参考资料

  1. https://zh.wikipedia.org/wiki/%E5%8F%8C%E9%9F%B3%E5%A4%9A%E9%A2%91
  2. https://www.cnblogs.com/lijingcheng/p/4454932.html

1. DTMF是什么

1.1 DTMF定义

双音多频信号(英语:Dual-Tone Multi-Frequency,简称:DTMF),电话系统中电话机与交换机之间的一种信令,最常用于拨号时发送被叫号码。不过双音多频的发明,除了缩短拨号时间,也扩展了拨号之外的功能,例如自动总机、交互式语音应答。

1.2 DTMF对键盘的编码

双音多频的拨号键盘是4*4,有10个数字键和6个字符键,每个数字或字符都是由两个单频信号的组合来进行传输。换句话说每一行代表一个高频,每一列代表一个低频。也就是说每按一个键就发送一个高频和低频的正弦信号组合,比如’1’相当于697和1209赫兹(Hz)。交换机可以解码这些频率组合并确定所对应的按键。 AT&T贝尔实验室提出用DTMF信号作为音频电话的拨号信号,因为这种方式可以提供更高的拨号速率,且容易被自动检测和识别。但反之,DTMF信号的这个优点也很容易变成致命的缺点,因为容易被交换机检测和识别,也就意味着容易被意图为之第三方破解。破解的原理很简单,只要能估计出DTMF信号中两个单频信号的频率值,再根据底下电话机键盘的频率数组表格的对应关系就可以反推出按键值。
在这里插入图片描述

2. DTMF信号的产生和发送

2.1 DTMF信号如何产生

可以基于软件或者硬件(一般是芯片)根据下列函数产生对应的数字信号
在这里插入图片描述
其中fL和fH分别表示按键所在的行和列对应的频率值。DTM信号本身就是两个不同频率正弦波相加组合而成的。
Matlab中对几个键盘值的表示如下:

fs=8000;
t=(0:800)/fs;
fcolumns1 = 697;fcolumns2 = 770;fcolumns3 = 852;fcolumns4 = 941;
frow1 = 1209;frow2 = 1336;frow3 = 1477;
num0 = sin(2*pi*fcolumns4*t)+sin(2*pi*frow2*t); %數字0
num1 = sin(2*pi*fcolumns1*t)+sin(2*pi*frow1*t); %數字1
num2 = sin(2*pi*fcolumns1*t)+sin(2*pi*frow2*t); %數字2
num3 = sin(2*pi*fcolumns1*t)+sin(2*pi*frow3*t); %數字3
num4 = sin(2*pi*fcolumns2*t)+sin(2*pi*frow1*t); %數字4
num5 = sin(2*pi*fcolumns2*t)+sin(2*pi*frow2*t); %數字5
num6 = sin(2*pi*fcolumns2*t)+sin(2*pi*frow3*t); %數字6
num7 = sin(2*pi*fcolumns3*t)+sin(2*pi*frow1*t); %數字7
num8 = sin(2*pi*fcolumns3*t)+sin(2*pi*frow2*t); %數字8
num9 = sin(2*pi*fcolumns3*t)+sin(2*pi*frow3*t); %數字9
numStar = sin(2*pi*fcolumns4*t)+sin(2*pi*frow1*t); %符號*
numJin = sin(2*pi*fcolumns4*t)+sin(2*pi*frow3*t); %符號#
blank = zeros(size(num1)); %間隔
f = [fcolumns1 fcolumns2 fcolumns3 fcolumns4 frow1 frow2 frow3];
f_Low = [fcolumns1 fcolumns2 fcolumns3 fcolumns4];
f_High = [frow1 frow2 frow3];

2.2 DTMF信号的传输方式

DTMF信号传输现有的两种方案如下:
(1) 用SIP信令的INFO方法携带DTMF信号
该方法是用SIP信令的INFO方法来明文定义来代表DTMF信号。目前以Cisco SIPINFO为标准,通过SIPINFO包中的signal字段识别DTMF按键。注意当DTMF为“*”时不同的标准实现对应的signal=*或signal=10。有专家认为其并不适用,主要缺陷是因为SIP控制信令和媒体传输(RTP)是分开传输,很容易造成DTMF信号和媒体包不同步。

简单举个例子,在 Voice Mail应用中,用户根据提示音输入一个DTMF信号,随后开始留言。Server是在接受到该DTMF信号后开始保存用户的留言。然而由于DTMF信号是通过SIP信令来传输的,而媒体流是通过RTP来传输的,有可能用户留言的RTP包先到,而该DTMF信号的INFO消息延迟,导致Server不保存用户的语音留言直至接受到INFO消息。

INFO包举例

INFO sip:7007471000@example.com SIP/2.0
Via: SIP/2.0/UDP alice.uk.example.com:5060
From: <sip:7007471234@alice.uk.example.com>;tag=d3f423d
To: <sip:7007471000@example.com>;tag=8942
Call-ID: 312352@myphone
CSeq: 5 INFO
Content-Length: 24
Content-Type: application/dtmf-relay

Signal=5
Duration=160

上述包中Signal字段的值就表示传输的按键值;

(2) 在RTP媒体传输中携带DTMF信号
该方法是将DTMF信号和媒体流一样,用RTP包来传输,因而没有DTMF信号和媒体流不同步的问题,使用H323信令的VOIP就是采用该种方法,相对来说比较成熟。该方法有分为以下两种方式

1) INBAND:In Band DTMF是指直接将DTMF的音频数字信号不经任何处理直接打成RTP包在IP网中传输。其中可能和用户的语音媒体流混合(mix)在一起传输。程序要获知哪个包有DTMF信号,是什么DTMF信号,必须实时检查每个RTP包里面的媒体流数据,分析它的频域。

DTMF 频谱分析得到按键值 https://blog.csdn.net/cg1510167/article/details/114279633

2) RFC 2833:该方法是将DTMF信号用专门的RTP包进行标识,在RTP包的头域中就可得知该包是DTMF包,并且知道是什么DTMF信号。RFC2833专门对此有定义。

RFC2833 原文: http://rfc2cn.com/rfc2833.html

(1)SIPINFO
该方法为带外检测方式,通过SIP信令通道传输DTMF数据。没有统一的实现标准,目前以Cisco SIPINFO为标准,通过SIPINFO包中的signal字段识别DTMF按键。注意当DTMF为“*”时不同的标准实现对应的signal=*或signal=10。SIPINFO的好处就是不影响RTP数据包的传输,但可能会造成不同步。
简单举个例子,在 Voice Mail应用中,用户根据提示音输入一个DTMF信号,随后开始留言。Server是在接受到该DTMF信号后开始保存用户的留言。然而由于DTMF信号是通过SIP信令来传输的,而媒体流是通过RTP来传输的,有可能用户留言的RTP包先到,而该DTMF信号的INFO消息延迟,导致Server不保存用户的语音留言直至接受到INFO消息。
(2)RFC2833
该方法为带内检测方式,通过RTP传输,由特殊的rtpPayloadType即TeleponeEvent来标示RFC2833数据包。同一个DTMF按键通常会对应多个RTP包,这些RTP数据包的时间戳均相同,此可以作为识别同一个按键的判断依据,最后一包RTP数据包的end标志置1表示DTMF数据结束。另外,很多SIP UA 包括IAD都提供TeleponeEvent的设置功能如3CX Phone,Billion-IAD,ZTE-IAD等默认的TeleponeEvent都为101,但可以人为修改,这时要求在进行RFC2833 DTMF检测之前需事先获取SDP协商的TeleponeEvent参数。
(3)INBAND
该方法为带内检测方式,而且与普通的RTP语音包混在一起传送。在进行INBAND DTMF检测时唯一的办法就是提取RTP数据包进行频谱分析,经过频谱分析得到高频和低频的频率,然后查表得到对应的按键,进行频谱分析的算法一般为Goertzel,这种算法的实现也很简单,网上有很多可以下到,但建议采用定点算法,浮点算法效率很低。
在选择压缩比很高码率很低的codec,比如G.723.1和G.729A等,建议不要使用INBAND模式,因为INBAND DTMF数据在进行复杂编解码后会产生失真,造成DTMF检测发生偏差或失败。
另外,还特别需要注意的一点就是很多SIP UA中INBAND都是伴随着RFC2833和SIPINFO同时发生的,这时需要区别对待,最好选择RFC2833和SIPINFO

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/832703.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

当“国潮”遇见“双语” 以传承之心种下一颗文化的种子

看&#xff0c;活灵活现的纸片人在“跳舞”。光影的辉映下&#xff0c;两个形神兼备的“齐天大圣”究竟孰真孰假&#xff1f;舞台上&#xff0c;京西皮影非遗传承人王熙和5岁的Mona小朋友正在用双语为大家带来一段“真假美猴王”的好戏。生动的皮影造型和精彩的故事演绎看得台下…

【BEV感知】3-BEV开源数据集

3-BEV开源数据集 1 KITTI1.1 KITTI数据怎么采集?1.2 KITTI数据规模有多大?1.3 KITTI标注了哪些目标?1.4 转换矩阵1.5 标签文件 2 nuScenes2.1 nuScenes Vs KITTI2.2 标注文件 1 KITTI KITTI 1.1 KITTI数据怎么采集? 通过车载相机、激光雷达等传感器采集。 只提供了相机正…

bagging集成与boosting集成的区别是什么?

bagging集成与boosting集成的区别 区别一:数据方面 Bagging&#xff1a;对数据进行采样训练; Boosting&#xff1a;根据前一轮学习结果调整数据的重要性。 区别二:投票方面 Bagging&#xff1a;所有学习器平权投票; Boosting&#xff1a;对学习器进行加权投票。 区别三:…

接口相似数据结构复用率高?Apipost这招搞定!

在API设计和开发过程中&#xff0c;存在许多瓶颈&#xff0c;其中一个主要问题是在遇到相似数据结构的API时会产生重复性较多的工作&#xff1a;在每个API中都编写相同的数据&#xff0c;这不仅浪费时间和精力&#xff0c;还容易出错并降低API的可维护性。 为了解决这个问题&a…

排序八卦炉之冒泡、快排

文章目录 1.冒泡排序1.1代码实现1.2复杂度 2.快速排序2.1人物及思想介绍【源于百度】2.2hoare【霍尔】版本1.初识代码2.代码分析3.思其因果 3.相关博客 1.冒泡排序 1.1代码实现 //插入排序 O(N)~O(N^2) //冒泡排序 O(N)~O(N^2) //当数据有序 二者均为O(N) //当数据接近有序或…

linux大神Brendan Gregg 性能之巅 第二版(systems performance)阅读心得(第一章)

笔者从事某副省级市政务云系统运维7年&#xff0c;最近被下面这张图吸引开始阅读Brendan Gregg的《性能之巅 第二版》&#xff0c;下面将结合自己的运维经验一起来看看这本700多页的书。 1、绪论 1.1 系统性能 系统性能的影响因素涉及软件和硬件&#xff0c;CPU、内存、磁盘io…

9.物联网操作系统之软件定时器

一。软件定时器概念及应用 1.软件定时器定义 就是软件实现定时器。 2.FreeRTOS软件定时器介绍 如上图所示&#xff0c;Times的左边为设置定时器时间&#xff0c;设置方式可以为任务设置或者中断设置&#xff1b;Times的右边为定时器的定时相应&#xff0c;使用CalBack相应。 …

QMS质量管理系统是什么?

QMS质量管理系统是一种用于管理和优化企业质量管理的软件系统&#xff0c;在现代企业中&#xff0c;质量管理是非常重要的环节。 1. QMS系统的概念 QMS系统是一种用于管理和优化企业质量管理的软件系统。它可以帮助企业制定和实施质量管理策略、管理和控制质量过程、收集和分析…

RK356x Android11更换默认的Launcher

1、 开发环境 ubuntu版本&#xff1a;18.04 开发平台&#xff1a;RK356x Android版本&#xff1a;android11 2、目的 android11 系统自带了一个启动器Launcher3&#xff0c;在android源码路径下的packages/apps/Launcher3下&#xff0c;现需要将我们自己开发的Launcher放到a…

IOCP简单了解

1.IOCP是什么 IOCP是Input/Output Completion Ports的简称&#xff0c;中文翻译为完成端口&#xff0c;完成是应用程序向系统发起一个IO操作&#xff0c;系统会在操作结束后&#xff0c;将IO操作完成结果通知应用程序&#xff0c;端口指的是机制 2.重叠IO&#xff08;Overlappe…

Compose应用案例(利用docker compose安装lnmp实例)

目录 Compose应用案例 一、前提配置 &#xff08;一&#xff09;安装docker-ce&#xff08;Linux安装Docker&#xff09; &#xff08;二&#xff09;安装docker-compose 二、安装docker compose部署lnmp &#xff08;一&#xff09;目录结构&#xff1a; &#xff08;二…

SpringBoot、SpringCloud 版本查看

1、SpringBoot 官网地址 https://spring.io/projects/spring-boot#learn spring-boot-starter-parent 版本列表可查看&#xff1a; https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-parent 2、SpringCloud 官网地址 https://spring.io/pro…

pycharm安装

去官网下载安装包&#xff1a; 然后运行&#xff1a; &#xff08;左边第二个绿色字备注得有点子不对&#xff0c;这个勾选上的话&#xff0c;就是说在你的桌面上右击pycharm时会显示你的项目&#xff0c;你可以选择后直接打开。还是挺方便的一个功能&#xff0c;看自己需求要不…

Linux C++ 链接数据库并对数据库进行一些简单的操作

一.引言&#xff08;写在之前&#xff09; 在我们进行网络业务代码书写的时候&#xff0c;我们总是避免对产生的数据进行增删改查&#xff0c;为此&#xff0c;本小博主在这里简历分享一下自己在Linux中C语言与数据之间交互的代码的入门介绍。 二.代码书写以及一些变量和函数的…

Redis持久化两种方案以及对比差异

1.1.RDB持久化 RDB全称Redis Database Backup file&#xff08;Redis数据备份文件&#xff09;&#xff0c;也被叫做Redis数据快照。简单来说就是把内存中的所有数据都记录到磁盘中。当Redis实例故障重启后&#xff0c;从磁盘读取快照文件&#xff0c;恢复数据。快照文件称为R…

vmware网络配置

效果&#xff1a; 虚拟机和物理机网络互通&#xff1b; 虚拟机可以上外网 环境&#xff1a; vmware version 17.0.0 Centos 7.9 配置 1&#xff0c;vmware 菜单 - 编辑 - Virtual Network Edit 2&#xff0c; 选择VMnet8 VMnet information:NAT&#xff1b; 勾选2个…

第一百二十一天学习记录:线性代数:矩阵乘法运算(宋浩板书)

在编程和学习数据结构的过程中&#xff0c;发现有些算法会用到矩阵和矩阵的乘法运算&#xff0c;因此先将这一个知识点学习一下。 矩阵和行列式的区别 各种矩阵的概念 矩阵运算 乘法☆ 总结三条不满足

并发 如何创建线程 多线程

进程&#xff1a;一个程序的执行过程 线程&#xff1a;一个方法就是一个线程 并发&#xff1a;多个线程抢夺一个资源 操作同一个对象 创建线程方法1 //创建线程方法1 继承Thread类 重写润方法 调用start开启线程 public class TestThead extends Thread{Overridepublic voi…

Linux常用命令(Linux入门)

Linux常用命令 文章目录 Linux常用命令1、Linux命令初体验2、文件目录操作命令2.1、ls2.2、cd2.3、cat2.4、more2.5、tail2.6、mkdir2.7、rmdir2.8、rm 3、拷贝移动命令3.1、cp3.1、mv 4、打包压缩命令tar命令 5、文本编辑命令vi/vim 6、查找命令6.1、find6.2、grep 1、Linux命…

学习记录——SegNetr、EGE-UNet、R2AU-Net、PHNet、CFNet

SegNetr: Rethinking the local-global interactions and skip connections in U-shaped networks 前导&#xff1a; 集中于设计复杂的自注意力模块&#xff0c;以弥补基于卷积操作捕获长距离上下文依赖的不足&#xff0c;从而增加了网络的参数和计算复杂性&#xff1b;过于简…