安卓dtmf识别_使用Goertzel算法识别DTMF信号

安卓dtmf识别_使用Goertzel算法识别DTMF信号Goertzel算法Goertzel算法由GeraldGoertzel在1958年提出,用于数字信号处理,是属于离散傅里叶变换的范畴,目的是从给定的采样中求出某一特定频率信号的能量,用于有效性的评价。这个算法有几个关键的参数:采样率R,指的是需要分析的数据每秒钟有多少个采样目标频率f,指的是需要检测并评价的这个频率的值检测区段采样值数量N,也就是每N个采样这个算法会对频率f给出评价检测区段包含目…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

Goertzel算法

Goertzel算法由Gerald Goertzel在1958年提出,用于数字信号处理,是属于离散傅里叶变换的范畴,目的是从给定的采样中求出某一特定频率信号的能量,用于有效性的评价。

这个算法有几个关键的参数:

采样率R,指的是需要分析的数据每秒钟有多少个采样

目标频率f,指的是需要检测并评价的这个频率的值

检测区段采样值数量N,也就是每N个采样这个算法会对频率f给出评价

检测区段包含目标频率的完整周期个数K

很显然,上述参数应该有这样的关系:

K = Nf / R

这个K值应该是一个整数,而且要大小合适。如果太大,不利于检测的时效,如果太小,则检测可能不准确。例如十几甚至二十几左右应该相对合理。例如R为8000,需要检测800hz的频率,N取值100,那么K为10,很不错。但是,需要检测的频率有时候并不那么整,例如697,那么N应该取值多少呢?N在1000以内,无法得到一个整数K,我们只能退而求其次,找一个四舍五入误差最小的。例如N取115,K的计算结果为10.019375,四舍五入为10,而且有较小的误差。

有了上述的参数,然后我们来计算每个采样在一个目标频率一个周期中所占的弧度ω。既然N个采样表达了K个周期(2π),那么ω应该这样计算:

ω = 2πK / N

这里需要注意的是,因为K值可能经过了四舍五入,所以上述两个公式必须先后计算,一定不能合在一起化简把K约掉!

然后,我们可以得到后期计算会频繁遇到的系数C:

C = 2cos(ω) = 2cos(2πK / N)

以上参数,我们都可以事先计算好,不必在每个采样分析中再次计算。之后,就开始针对N个采样进行分析计算

首先初始化:

Q1 = 0

Q2 = 0

然后按照顺序针对N个采样每一个值S(我认为这个S一般是一个16位的有符号整数,取值范围在-32768到32767之间,如果你得到的是已经进行过编码的媒体流,例如G.711编码,那么需要首先解码。当然也许采样值就是-128到127之间的单字节整数,那么这样对计算结果中的P值会影响巨大,DTMF识别的时候一些判断参数可能要调整),做如下计算:

Q0 = CQ1 – Q2 + S

Q2 = Q1

Q1 = Q0

上述计算完成之后,我们就可以得到在这N个采样中所体现的频率f的能量值P:

P = Q12 + Q22 – CQ1Q2

DTMF识别

以上是goertzel算法的全部思想。如果我们要将其用于DTMF识别,还需要做一些工作。DTMF识别,我们需要根据给定的一段时间的采样,能够最大限度地排除噪音的干扰,将有效的DTMF信号识别出来

我们知道DTMF有8个频率:697, 770, 852, 941, 1209, 1336, 1477, 1633,通过前4个频率和后4个频率的两两组合,确定16个符号。那么我们在对给定一段时间的采样进行处理的时候,就需要先将其分为每段为N个采样的多个采样区段,然后对每一区段针对8个频率分别运用goertzel算法进行计算得到每个频率的能量P

为了完成这些能量的计算,我们需要在开始针对8个不同的频率分别计算系数C,而参数N的选择非常关键,因为8个频率的K值都不同,我们要尽可能使得8个频率的K值四舍五入之后都误差尽可能小,经过检验,在采样率为8000的时候,N=205应该是一个最佳值,你可以做一个测试:

N=

针对N个采样值,对8个频率分别计算出了能量P之后,我们就可以开始评估这些能量值是否足以表明这N个采样中含有某个DTMF符号

DTMF符号和频率的对应关系如下:

f1209133614771633

679123A

770456B

852789C

941*0#D

我们从1209, 1336, 1477和1633四个频率对应的能量P中取最大值,记作Px,从679,770,852和941四个频率对应的能量P中取出最大值Py。那么Px和Py对应的频率组合极有可能代表识别出一个DTMF符号。但是,我们还需要做一系列的判断,来进一步评估:

Px和Py是否足够强大?我们可以设定一个门限,如果么Px和Py这两个任何一个低于这个门限,那么N个采样被评估为没有识别出DTMF符号。参考资料[2]中建议这个门限值为4*105。但是如果采样值的取值范围是-32768到32767的话,实际上计算出来的P值会非常大,这个门限设为4*109都可以。

Px和Py的差别是否太大?正常的DTMF信号,这两个能量应该接近,那么如果差别较大,我们视为无效。参考资料[2]中建议的方法为:如果Py < Px * 0.398,那么认为无效。如果Px < Py * 0.158也认为无效。但是实际上,我们将0.158改为0.5,识别效果更佳。

其它频率的能量P有没有很多接近Px和Py的?参考资料[2]中建议的方法为:首先取近Px和Py中较大的那个,设为Pm,如果其他频率的P值有2个以上达到了Pm的15.8%,那么认为是噪音导致,视为无效。

如果上述三个检验关卡都通过了,那么我们可以将这N个采样评估为包含一个DTMF符号,即Px和Py对应的频率组合对应的某个符号。

参考资料:

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/234697.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • C++编程工具(java常用工具)

    给c++程序员的一份礼物-常用工具集■…开发环境  —->Turboc  DOS时代c语言开发的经典工具,目前适合两类人使用:c语言beginner(尤其是学生一族),具有怀旧情节的专业人士:)  —->VisualC++6.0/7.0  稳定而强大的IDE开发环境,具有丰富的调试功能,定制宏的功能也是其一大特色。Microsoft的经典之作,功能强大自不必言说

    2022年4月13日
    46
  • PS制作CSS精灵图

    PS制作CSS精灵图精灵图简介1.精灵图(雪碧图)(1)问题:精灵图就是将很多的小图标合并到一张较大的图片中,那精灵是啥意思呢?(为此笑了一下午的我)。(2)精灵图也称雪碧图,由于大型网页首次加载需要时间,如果再加之加载小图标的时间,则会严重影响到用户体验。所以,考虑到在同一时间内,服务器拥堵的情况,使用精灵图来解决这一问题。那么怎么制作精灵图呢2.使用ps制作精灵图的详细步骤示例:将如下图图片中的四个图…

    2022年6月7日
    184
  • 到底该不该用RTOS——rtos的优点

    到底该不该用RTOS——rtos的优点我现在要不要学习RTOS? 学习RTOS有什么好处? 我的项目要不要跑RTOS?······等等一些关于RTOS的问题,

    2022年8月5日
    5
  • PDF文件预览_pdf文档下载网站

    PDF文件预览_pdf文档下载网站背景:项目中实现pdf文件的预览以及下载环境:jdk1.8、SpringBoot2.0、MavenPDF.js下载地址:http://mozilla.github.io/pdf.js/getti

    2022年8月6日
    7
  • 微博RPC框架Motan

    微博RPC框架Motan原文来自 http blog csdn net autfish article details 从 14 年开始就陆续看到新浪微博 RPC 框架 Motan 的介绍 时隔两年后 微博团队终于宣布开源轻量级 RPC 框架 Motan 项目地址 https github com weibocom motan 项目文档介绍比较详细 搭建开发环境非常简单 如果只是使用

    2025年6月24日
    3
  • 怎么算图中有多少个三角形_贪心算法经典例题

    怎么算图中有多少个三角形_贪心算法经典例题题目:请说出下面图形中包含多少个三角形?请用一个程序完成计算。C++版本解题思路:(1)给每个交点做标记,如下:(2)总共有36条线段,如果三条线段两两之间存在交点,但一条线上(已经包含了三条

    2022年8月1日
    6

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号