【数字信号】基于matlab DTMF电话拨号音识别【含Matlab源码 218期】

本文介绍了DTMF信号的基本原理和在电话系统中的应用,详细阐述了Goertzel算法在音频信号处理中的作用,特别是用于检测双音多频信号。通过MATLAB仿真,展示了音频数据的预处理、滤波、分帧、能量计算以及频率检测的过程。此外,提供了部分源代码供读者参考,并提到了MATLAB在智能优化算法、机器学习、图像处理、路径规划等领域的一系列应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

💥💥💥💥💥💥💞💞💞💞💞💞💞💞欢迎来到海神之光博客之家💞💞💞💞💞💞💞💞💥💥💥💥💥💥
在这里插入图片描述
✅博主简介:热爱科研的Matlab仿真开发者,修心和技术同步精进;
🍎个人主页:海神之光
🏆代码获取方式:
海神之光Matlab王者学习之路—代码获取方式

⛳️座右铭:行百里者,半于九十。
更多Matlab信号处理仿真内容点击👇
Matlab信号处理 (进阶版)
付费专栏Matlab信号处理(初级版)

⛳️关注优快云海神之光,更多资源等你来!!

⛄一、DTMF简介

1 含义
双音多频 DTMF(Dual Tone Multi Frequency),双音多频,由高频群和低频群组成,高低频群各包含4个频率。一个高频信号和一个低频信号叠加组成一个组合信号,代表一个数字。DTMF信令有16个编码。利用DTMF信令可选择呼叫相应的对讲机。
双音多频信号(DTMF),电话系统中电话机与交换机之间的一种用户信令,通常用于发送被叫号码。

在使用双音多频信号之前,电话系统中使用一连串的断续脉冲来传送被叫号码,称为脉冲拨号。脉冲拨号需要电信局中的操作员手工完成长途接续。
双音多频信号是贝尔实验室发明的,其目的是为了自动完成长途呼叫。
双音多频的拨号键盘是4×4的矩阵,每一行代表一个低频,每一列代表一个高频。每按一个键就发送一个高频和低频的正弦信号组合,比如’1’相当于697和1209赫兹(Hz)。交换机可以解码这些频率组合并确定所对应的按键。

DTMF编解码器在编码时将击键或数字信息转换成双音信号并发送,解码时在收到的DTMF信号中检测击键或数字信息的存在性。一个DTMF信号由两个频率 的音频信号叠加构成。这两个音频信号的频率来自两组预分配的频率组:行频组或列频组。每一对这样的音频信号唯一表示一个数字或符号。电话机中通常有16个 按键,其中有10个数字键0~9和6个功能键*、#、A、B、C、D。由于按照组合原理,一般应有8种不同的单音频信号。因此可采用的频率也有8种,故称 之为多频,又因它采用从8种频率中任意抽出2种进行组合来进行编码,所以又称之为“8中取2”的编码技术。根据CCITT的建议,国际上采用的多种频率为 687Hz、770Hz、852Hz、941Hz、1209Hz、1336Hz、1477Hz和1633Hz等8种。用这8种频率可形成16种不同的组 合,从而代表16种不同的数字或功能键,具体组合见表1。

在很多应用中都要求进行音调检测,例如:双音多频信号 (DTMF)解码,呼叫过程(拨号音、忙音等)解码,频率响应测试(发送一个音调,同时将结果读回)。在频率响应测试中,如果在一定频率范围内进行测量, 那么得到的频响曲线中可能会包含丰富的信息,例如从电话线的频响曲线可以知道线上是否有负载线圈(电感)。
尽管针对以上应用均有专用IC,但采用软件来实现这些芯片的功能时所需成本比采用专用芯片低很多。然而,很多嵌入式系统都不具备进行连续实时FFT处理的能力,这时就适合采用Goertzel算法。本文将对Goertzel基本算法和Goertzel优化算法进行讨论。
采 用Goertzel基本算法能得出与常规离散傅立叶变换(DFT)或FFT相同的频率实部和虚部。如果需要的话,还可以从该频率实部和虚部中算出幅度和相 位信息。Goertzel优化算法则比Goertzel基本算法更快也更简单,但Goertzel优化算法并不给出频率实部和虚部分量,它只能给出相关的 幅度平方。如果需要幅度信息,可通过对该结果开方得到,但该方法无法得到相位信息。

2 基本实现过程
第一步:对数据取左声道(主要针对第二段音频),画出滤波前的按键音时域图和频域图(方便对比分析滤波效果);

第二步:对音频滤波,画出滤波后的效果图;

第三步:对数据进行分帧,并求其短时能量。分帧参数需要根据音频自行进行调试。在给出的两段音频中将帧长设置为256,帧重叠数设置为100时对两段音频均适用;

第四步:为了使分割得到的音频均为有效音频,故设置能量阈值为0.02,将能量低于0.02的信号视为无效信号,尽可能使分割得到的音频均为所需的有效信号的音频,并画出其有效信号图参照;

第五步:由于第四步得到的实际为帧编号数而非数据的位置,因此要将数据还原为其所在位置,以便进行音频切割;

第六步:分别取出每一段音频,对其进行傅里叶变换得到频率数据,用findpeaks函数找出音频所对应的高频和低频,并将其存入一个fs_result中。

⛄二、部分源代码


clear
clc

[x,Fs]=audioread('2.wav');

⛄三、运行结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

⛄四、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1] 沈再阳.精通MATLAB信号处理[M].清华大学出版社,2015.
[2]高宝建,彭进业,王琳,潘建寿.信号与系统——使用MATLAB分析与实现[M].清华大学出版社,2020.
[3]王文光,魏少明,任欣.信号处理与系统分析的MATLAB实现[M].电子工业出版社,2018.

3 备注
简介此部分摘自互联网,仅供参考,若侵权,联系删除

🍅 仿真咨询
1 各类智能优化算法改进及应用

生产调度、经济调度、装配线调度、充电优化、车间调度、发车优化、水库调度、三维装箱、物流选址、货位优化、公交排班优化、充电桩布局优化、车间布局优化、集装箱船配载优化、水泵组合优化、解医疗资源分配优化、设施布局优化、可视域基站和无人机选址优化

2 机器学习和深度学习方面
卷积神经网络(CNN)、LSTM、支持向量机(SVM)、最小二乘支持向量机(LSSVM)、极限学习机(ELM)、核极限学习机(KELM)、BP、RBF、宽度学习、DBN、RF、RBF、DELM、XGBOOST、TCN实现风电预测、光伏预测、电池寿命预测、辐射源识别、交通流预测、负荷预测、股价预测、PM2.5浓度预测、电池健康状态预测、水体光学参数反演、NLOS信号识别、地铁停车精准预测、变压器故障诊断

3 图像处理方面
图像识别、图像分割、图像检测、图像隐藏、图像配准、图像拼接、图像融合、图像增强、图像压缩感知

4 路径规划方面
旅行商问题(TSP)、车辆路径问题(VRP、MVRP、CVRP、VRPTW等)、无人机三维路径规划、无人机协同、无人机编队、机器人路径规划、栅格地图路径规划、多式联运运输问题、车辆协同无人机路径规划、天线线性阵列分布优化、车间布局优化

5 无人机应用方面
无人机路径规划、无人机控制、无人机编队、无人机协同、无人机任务分配

6 无线传感器定位及布局方面
传感器部署优化、通信协议优化、路由优化、目标定位优化、Dv-Hop定位优化、Leach协议优化、WSN覆盖优化、组播优化、RSSI定位优化

7 信号处理方面
信号识别、信号加密、信号去噪、信号增强、雷达信号处理、信号水印嵌入提取、肌电信号、脑电信号、信号配时优化

8 电力系统方面
微电网优化、无功优化、配电网重构、储能配置

9 元胞自动机方面
交通流 人群疏散 病毒扩散 晶体生长

10 雷达方面
卡尔曼滤波跟踪、航迹关联、航迹融合

以下是使用MATLAB进行DTMF识别电话号码的代码: ```matlab % 读入频文件 [x, Fs] = audioread('sample.wav'); % 取出左声道信号 x = x(:,1); % 设定DTMF频率 f1 = 697; % 第一行频率 f2 = 770; % 第二行频率 f3 = 852; % 第三行频率 f4 = 941; % 第四行频率 f5 = 1209; % 第一列频率 f6 = 1336; % 第二列频率 f7 = 1477; % 第三列频率 % 设定DTMF信号时长和采样频率 dtmf_duration = 0.2; % 200毫秒 dtmf_fs = 8000; % 8kHz % 生成DTMF信号 dtmf_t = 0:1/dtmf_fs:dtmf_duration; dtmf_1 = sin(2*pi*f1*dtmf_t) + sin(2*pi*f5*dtmf_t); dtmf_2 = sin(2*pi*f1*dtmf_t) + sin(2*pi*f6*dtmf_t); dtmf_3 = sin(2*pi*f1*dtmf_t) + sin(2*pi*f7*dtmf_t); dtmf_4 = sin(2*pi*f2*dtmf_t) + sin(2*pi*f5*dtmf_t); dtmf_5 = sin(2*pi*f2*dtmf_t) + sin(2*pi*f6*dtmf_t); dtmf_6 = sin(2*pi*f2*dtmf_t) + sin(2*pi*f7*dtmf_t); dtmf_7 = sin(2*pi*f3*dtmf_t) + sin(2*pi*f5*dtmf_t); dtmf_8 = sin(2*pi*f3*dtmf_t) + sin(2*pi*f6*dtmf_t); dtmf_9 = sin(2*pi*f3*dtmf_t) + sin(2*pi*f7*dtmf_t); dtmf_ast = sin(2*pi*f4*dtmf_t) + sin(2*pi*f5*dtmf_t); dtmf_0 = sin(2*pi*f4*dtmf_t) + sin(2*pi*f6*dtmf_t); dtmf_pound = sin(2*pi*f4*dtmf_t) + sin(2*pi*f7*dtmf_t); % 对信号进行滤波 % 设定滤波器参数 filter_order = 8; filter_cutoff = 1000; % 设计低通滤波器 [b_low, a_low] = butter(filter_order, filter_cutoff/(Fs/2), 'low'); % 设计高通滤波器 [b_high, a_high] = butter(filter_order, filter_cutoff/(Fs/2), 'high'); % 对信号进行滤波 x_low = filter(b_low, a_low, x); x_high = filter(b_high, a_high, x); % 对DTMF信号进行滤波 dtmf_1_low = filter(b_low, a_low, dtmf_1); dtmf_1_high = filter(b_high, a_high, dtmf_1); dtmf_2_low = filter(b_low, a_low, dtmf_2); dtmf_2_high = filter(b_high, a_high, dtmf_2); dtmf_3_low = filter(b_low, a_low, dtmf_3); dtmf_3_high = filter(b_high, a_high, dtmf_3); dtmf_4_low = filter(b_low, a_low, dtmf_4); dtmf_4_high = filter(b_high, a_high, dtmf_4); dtmf_5_low = filter(b_low, a_low, dtmf_5); dtmf_5_high = filter(b_high, a_high, dtmf_5); dtmf_6_low = filter(b_low, a_low, dtmf_6); dtmf_6_high = filter(b_high, a_high, dtmf_6); dtmf_7_low = filter(b_low, a_low, dtmf_7); dtmf_7_high = filter(b_high, a_high, dtmf_7); dtmf_8_low = filter(b_low, a_low, dtmf_8); dtmf_8_high = filter(b_high, a_high, dtmf_8); dtmf_9_low = filter(b_low, a_low, dtmf_9); dtmf_9_high = filter(b_high, a_high, dtmf_9); dtmf_ast_low = filter(b_low, a_low, dtmf_ast); dtmf_ast_high = filter(b_high, a_high, dtmf_ast); dtmf_0_low = filter(b_low, a_low, dtmf_0); dtmf_0_high = filter(b_high, a_high, dtmf_0); dtmf_pound_low = filter(b_low, a_low, dtmf_pound); dtmf_pound_high = filter(b_high, a_high, dtmf_pound); % 计算信号的能量 x_energy = x_low.^2 + x_high.^2; % 计算DTMF信号的能量 dtmf_1_energy = dtmf_1_low.^2 + dtmf_1_high.^2; dtmf_2_energy = dtmf_2_low.^2 + dtmf_2_high.^2; dtmf_3_energy = dtmf_3_low.^2 + dtmf_3_high.^2; dtmf_4_energy = dtmf_4_low.^2 + dtmf_4_high.^2; dtmf_5_energy = dtmf_5_low.^2 + dtmf_5_high.^2; dtmf_6_energy = dtmf_6_low.^2 + dtmf_6_high.^2; dtmf_7_energy = dtmf_7_low.^2 + dtmf_7_high.^2; dtmf_8_energy = dtmf_8_low.^2 + dtmf_8_high.^2; dtmf_9_energy = dtmf_9_low.^2 + dtmf_9_high.^2; dtmf_ast_energy = dtmf_ast_low.^2 + dtmf_ast_high.^2; dtmf_0_energy = dtmf_0_low.^2 + dtmf_0_high.^2; dtmf_pound_energy = dtmf_pound_low.^2 + dtmf_pound_high.^2; % 设置能量阈值 energy_threshold = 0.1; % 进行DTMF信号检测 dtmf_detected = ''; if max(dtmf_1_energy) > energy_threshold*max(x_energy) dtmf_detected = strcat(dtmf_detected, '1'); end if max(dtmf_2_energy) > energy_threshold*max(x_energy) dtmf_detected = strcat(dtmf_detected, '2'); end if max(dtmf_3_energy) > energy_threshold*max(x_energy) dtmf_detected = strcat(dtmf_detected, '3'); end if max(dtmf_4_energy) > energy_threshold*max(x_energy) dtmf_detected = strcat(dtmf_detected, '4'); end if max(dtmf_5_energy) > energy_threshold*max(x_energy) dtmf_detected = strcat(dtmf_detected, '5'); end if max(dtmf_6_energy) > energy_threshold*max(x_energy) dtmf_detected = strcat(dtmf_detected, '6'); end if max(dtmf_7_energy) > energy_threshold*max(x_energy) dtmf_detected = strcat(dtmf_detected, '7'); end if max(dtmf_8_energy) > energy_threshold*max(x_energy) dtmf_detected = strcat(dtmf_detected, '8'); end if max(dtmf_9_energy) > energy_threshold*max(x_energy) dtmf_detected = strcat(dtmf_detected, '9'); end if max(dtmf_ast_energy) > energy_threshold*max(x_energy) dtmf_detected = strcat(dtmf_detected, '*'); end if max(dtmf_0_energy) > energy_threshold*max(x_energy) dtmf_detected = strcat(dtmf_detected, '0'); end if max(dtmf_pound_energy) > energy_threshold*max(x_energy) dtmf_detected = strcat(dtmf_detected, '#'); end % 输出识别结果 disp(strcat('DTMF识别结果:', dtmf_detected)); ``` 在这个代码中,我们先读入一个频文件,然后取出左声道信号。接着,我们设定了DTMF频率和信号时长以及采样频率。然后我们生成了12种不同的DTMF信号。 接着,我们设定了滤波器参数,设计了低通滤波器和高通滤波器,并对信号DTMF信号进行了滤波。 然后,我们计算信号DTMF信号的能量。设定了能量阈值,进行DTMF信号检测。最后输出识别结果。 在使用这个代码时,需要将`sample.wav`替换为你要进行识别频文件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海神之光

有机会获得赠送范围1份代码

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值