【Matlab】Matlab电话拨号音合成与识别(代码+论文)【独一无二】

news2024/9/27 12:16:49

请添加图片描述


👉博__主👈:米码收割机
👉技__能👈:C++/Python语言
👉公众号👈:测试开发自动化【获取源码+商业合作】
👉荣__誉👈:阿里云博客专家博主、51CTO技术博主
👉专__注👈:专注主流机器人、人工智能等相关领域的开发、测试技术。


Matlab电话拨号音合成与识别(代码+论文)【独一无二】


目录

  • Matlab电话拨号音合成与识别(代码+论文)【独一无二】
  • 一、设计思路
    • 1. 拨号音合成思路
    • 2. 拨号音识别思路
    • 3. 实现思路
  • 二、具体实现
    • 1. 拨号音合成
    • 拨号音识别


一、设计思路

电话拨号音合成与识别的项目可以分为两个主要部分:拨号音的合成(生成)和拨号音的识别。

1. 拨号音合成思路

理解DTMF(双音多频)信号:电话拨号音使用的是一种称为双音多频(DTMF)的信号。每个按键按下时会生成两个特定的频率。了解这些频率对应的按键是生成拨号音的基础。

生成DTMF信号:使用MATLAB的信号处理工具箱,为每个数字(0-9)和特殊字符(#,*)生成对应的DTMF信号。这通常涉及到生成两个正弦波的叠加,每个波的频率对应于DTMF标准中指定的频率,然后将它们合成一个信号。

保存或播放信号:生成的信号可以保存为音频文件或直接在MATLAB中播放,以验证其正确性。

👇👇👇 关注公众号,回复 “拨号音合成与识别” 获取源码👇👇👇

2. 拨号音识别思路

录制或获取DTMF信号:这一步涉及到获取或录制包含DTMF拨号音的音频。这可以通过录制实际电话信号或使用之前步骤生成的音频文件来完成。

预处理音频信号:在识别拨号音之前,可能需要对音频信号进行预处理,比如去噪、归一化等,以提高识别准确率。

信号分析:使用MATLAB的信号处理功能来分析音频信号。这通常涉及到频谱分析,比如使用快速傅里叶变换(FFT)来识别信号中存在的频率分量。

识别DTMF频率:根据FFT分析的结果,识别出信号中的频率分量,并将它们与DTMF标准中定义的频率进行匹配,以确定被按下的按键。

输出结果:最后,将识别出的按键以文本或其他形式输出,完成识别过程。

3. 实现思路

  • 使用MATLAB的audioread和audiowrite函数来读取和保存音频文件。
  • 使用fft函数进行频谱分析。
  • 使用sin函数生成正弦波。
  • 使用MATLAB的filter函数进行信号预处理。

👇👇👇 关注公众号,回复 “拨号音合成与识别” 获取源码👇👇👇


二、具体实现

1. 拨号音合成

在定义DTMF频率表时,使用了结构体 dtmfFreqs 来存储DTMF信号的频率信息。每个按键对应一个字段,字段名采用字符代替数字,例如 ‘n1’ 代替了数字 1。这样的修改是为了提高代码的可读性和可维护性,因为字符可以更直观地表示按键的含义,而不必记住数字与按键的对
应关系。

👇👇👇 关注公众号,回复 “拨号音合成与识别” 获取源码👇👇👇

根据输入的键值,函数需要确定对应的字段名。键值表示的是电话键盘上的按键,包括数字键 0 到 9,以及 ‘*’ 和 ‘#’。

% 部分代码如下:
fs = 8000; % 采样频率
duration = 1; % 信号持续时间,单位为秒
t = 0:1/fs:duration-1/fs;

if key == '*'
    fieldName = 'star';
elseif key == '#'
    fieldName = 'hash';
else
    fieldName = ['n' key];
end

利用获取到的频率信息,函数生成对应的DTMF信号。采用了两个正弦波的叠加来表示DTMF信号,每个正弦波对应一个频率成分。根据正弦波的频率公式,使用正弦函数生成每个频率成分对应的波形。

% 部分代码如下:
sinWave1 = sin(2 * pi * dtmfFreqs.(fieldName)(1) * t);
sinWave2 = sin(2 * pi * dtmfFreqs.(fieldName)(2) * t);

% 1. 生成的DTMF信号波形图
figure;
plot(t, signal);
title('生成的DTMF信号波形');
xlabel('时间 (s)');
ylabel('振幅');

在这里插入图片描述

生成两个正弦波形的意义在于模拟DTMF信号的频率成分。DTMF信号是由两个频率成分叠加而成的,分别对应电话按键上的两个按钮。通过生成两个正弦波形,可以模拟这两个频率成分,从而生成符合电话按键的DTMF信号,使信号更接近实际的通信信号。

👇👇👇 关注公众号,回复 “拨号音合成与识别” 获取源码👇👇👇

在这里插入图片描述

通过FFT变换将DTMF信号转换到频域,并对频谱进行归一化和对称处理。生成的频谱图展示了信号在频域上的幅值分布,帮助分析和理解信号的频域特性。这为信号的频谱分析提供了有力的工具。生成的DTMF信号频谱如下:

👇👇👇 关注公众号,回复 “拨号音合成与识别” 获取源码👇👇👇

在这里插入图片描述
在DTMF信号的生成过程中,采用了两个频率成分的叠加来表示一个按键,其中每个频率成分对应电话按键上的一个按钮。
可以通过观察频谱图来确认每个正弦波的频率成分是否准确。频谱图显示的频率信息应该与预期的频率相符,这有助于验证生成的正弦波的频率设置是否正确。

👇👇👇 关注公众号,回复 “拨号音合成与识别” 获取源码👇👇👇

可以通过绘制两个正弦波的频谱来验证它们的叠加效果。由于DTMF信号是两个频率成分的叠加,因此期望在频谱上能够观察到这两个频率处的峰值。通过验证叠加效果,可以确保生成的DTMF信号在频域上与预期一致。

% 部分代码如下:
subplot(2,1,1);
plot(f(1:length(sinWave1)/2+1),P1_1) 
title('第一个正弦波的频谱')
xlabel('频率 (Hz)')
ylabel('|P1(f)|')

subplot(2,1,2);
plot(f(1:length(sinWave2)/2+1),P1_2) 
title('第二个正弦波的频谱')
xlabel('频率 (Hz)')
ylabel('|P1(f)|')

在这里插入图片描述
播放保存音频文件
播放信号:使用 sound(signal, fs) 函数可以播放生成的信号。signal 是生成的DTMF信号,fs 是采样频率。通过这个函数,可以听到生成的信号的声音效果。

👇👇👇 关注公众号,回复 “拨号音合成与识别” 获取源码👇👇👇

保存为音频文件:使用函数将生成的信号保存为音频文件。这个函数需要三个参数:文件名、信号数据和采样频率。文件名基于输入的键值,这样每个按键对应的DTMF信号都可以保存为一个单独的音频文件。保存为 .wav 格式的文件是为了保持音频的无损质量。
在这里插入图片描述

拨号音识别

1)读取音频文件并显示原始波形图
audioread(‘6.wav’)是一个Matlab函数调用,用于读取名为"6.wav"的音频文件。
返回的keySignal是一个包含了音频信号的数组,fs是音频文件的采样频率。
figure函数创建一个新的图形窗口,使得后续的绘图操作在这个窗口中进行。
plot函数用于绘制图形,绘制波形图。
(1:length(keySignal))/fs创建了一个时间轴,用于表示音频信号的时间。
keySignal是音频信号的振幅值。
将时间轴和振幅值作为参数传递给plot函数,以绘制原始音频信号的波形图。

👇👇👇 关注公众号,回复 “拨号音合成与识别” 获取源码👇👇👇

在这里插入图片描述

2)信号预处理
以上代码对音频信号进行了预处理,包括归一化和带通滤波器的应用。首先,通过归一化确保了音频信号的振幅范围统一在[-1, 1]之间,这样的处理提高了后续处理的稳定性和一致性。

% 部分代码如下:
keySignal = keySignal / max(abs(keySignal)); 
bpFilt = designfilt('bandpassfir', 'FilterOrder', 20, ...
    'CutoffFrequency1', 697-25, 'CutoffFrequency2', 1477+25, ...
    'SampleRate', fs);
filteredSignal = filter(bpFilt, keySignal);

在这里插入图片描述

👇👇👇 关注公众号,回复 “拨号音合成与识别” 获取源码👇👇👇

3)按键识别
识别音频中的DTMF信号并将其转换为相应的按键。使用了findpeaks函数来寻找频谱中的峰值,通过按降序排列找到前两个最高峰值,即主要频率成分。这一步骤确保了我们捕获了音频中最明显的频率特征。接下来,在第五部分中,我们定义了DTMF信号可能的频率和相应的按键映射关系。通过遍历找到的主要频率成分,并与预定义的DTMF频率表进行匹配,确定了对应的按键。在匹配过程中,设置了容差范围为25Hz,确保了频率匹配的准确性。一旦成功匹配到按键,即更新recognizedKey并结束循环。这段代码的执行流程清晰,通过频率的匹配实现了从音频信号到按键的准确识别。
最终的识别结果:
在这里插入图片描述
频谱如下:
在这里插入图片描述

👇👇👇 关注公众号,回复 “拨号音合成与识别” 获取源码👇👇👇

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

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

相关文章

springboot240基于Spring boot的名城小区物业管理系统

基于Spring boot的名城小区物业管理系统的设计与实现 摘要 当下,正处于信息化的时代,许多行业顺应时代的变化,结合使用计算机技术向数字化、信息化建设迈进。以前相关行业对于物业信息的管理和控制,采用人工登记的方式保存相关数…

第三百八十回

文章目录 1. 概念介绍2. 使用方法3. 代码与效果3.1 示例代码3.2 运行效果 4. 内容总结 013pickers2.gif 我们在上一章回中介绍了"如何实现Numberpicker"相关的内容,本章回中将介绍wheelChoose组件.闲话休提,让我们一起Talk Flutter吧。 1. 概念…

文件操作命令touch、cat、more、cp、mv

touch 创建文件 1)可以通过touch命令创建文件。 2)语法: touch Linux路径 3)touch命令无选项,参数必填,表示要创建的文件路径,相对、绝对、特殊路径符均可以使用。 注:以 d 开头的…

Apache POI的简单介绍与应用

介绍 Apache POI 是一个处理Miscrosoft Office各种文件格式的开源项目。我们可以使用 POI 在 Java 程序中对Miscrosoft Office各种文件进行读写操作。PS: 一般情况下,POI 都是用于操作 Excel 文件,如图: Apache POI 的应用场景&…

韦东山嵌入式Liunx入门驱动开发五

文章目录 一、驱动程序基石1-1 休眠与唤醒1-2 POLL机制1-3 异步通知(1) 异步通知程序解析(2) 异步通知机制内核代码详解 1-4 阻塞与非阻塞1-5 定时器(1) 内核函数(2) 定时器时间单位 1-6 中断下半部 tasklet 本人学习完韦老师的视频,因此来复习巩固,写以…

【web | CTF】BUUCTF [HCTF 2018]WarmUp

天命&#xff1a;这题本地php代码是无法复现的 首先打开网站&#xff0c;啥也没有&#xff0c;查看源码 发现文件&#xff0c;打开访问一下看看&#xff0c;发现是代码审计 <?phphighlight_file(__FILE__);class emmm{public static function checkFile(&$page){$whit…

IOS 发布遇到“Unable to authenticate with App Store Connect”错误咋解决?

问题&#xff1a; 在开发ios app后&#xff0c;先发布adhoc版本&#xff0c;测试通过后&#xff0c;再发布testflight版本测试&#xff0c;但是可能会遇到一下问题。 解决办法&#xff1a; 在Signing &Capabilities中&#xff0c;在ios下边要指定有发布权限的Team账号&a…

文件底层的理解之缓冲区

目录 一、缓冲区的初步认识 二、向文件中写数据的具体过程 三、缓冲区刷新的时机 一、缓冲区的初步认识 缓冲区其实就是一块内存区域&#xff0c;采用空间来换时间&#xff0c;可以提高使用者的效率。我们一直说的缓冲区其实是语言层面上的缓冲区&#xff0c;其实操作系统内部…

黑马点评-商户查询业务

缓存原理 本文的业务就是redis的经典应用&#xff0c;标准的操作方式就是查询数据库之前先查询缓存&#xff0c;如果缓存数据存在&#xff0c;则直接从缓存中返回&#xff0c;如果缓存数据不存在&#xff0c;再查询数据库&#xff0c;然后将数据存入redis。 缓存更新策略 根据…

iMazing 3.0.0.3 for mac 中文破解版2024最新图文安装教程

我们刚刚发布了iMazing 3.0.0.3 for mac 中文版本。Windows和macOS用户现在都可以试驾并体验iPhone管理的未来。 备受期待的第一个Windows版本得益于过去几个月macOS测试版的所有改进&#xff0c;使其成为一个稳定的初始版本。 我们的开发团队创造了一种无缝的外观和体验&#…

sql 注入 之sqli-labs/less-6 双注入,双引号报错注入

和第五关类似&#xff0c;只不过闭合符号是双引号 1&#xff0c;查数据库 1"and%20(updatexml(1,concat(0x7e,(select%20database()),0x7e),1))%20-- 2.查表 内容有多行&#xff0c;所以使用limit依次查询 1"and%20(updatexml(1,concat(0x7e,(select%20table_nam…

Spring中的数据校验---JSR303

介绍–什么是JSR303 JSR 303是Java中的一项规范&#xff0c;用于定义在Java应用程序中执行数据校验的元数据模型和API。JSR 303的官方名称是"Bean Validation"&#xff0c;它提供了一种在Java对象级别上执行验证的方式&#xff0c;通常用于确保输入数据的完整性和准…

app软件开发的费用大约多少

现在手机的用户在增多&#xff0c;大部分的人都是通过手机软件去操作完成的东西比较多&#xff0c;所以导致现在的流量都在手机端。那么不管是电脑端还是手机端都是在同时发展的&#xff0c;使用电脑的人群只是倾向在了工作人群&#xff0c;而手机的流量大部分是来自于生活中。…

HarmonyOS—配置编译构建信息

在进行应用/服务的编译构建前&#xff0c;需要对工程和编译构建的Module进行设置。API Version 9、API Version 8与API Version 4~7的构建体系不同&#xff0c;因此在设置编译构建信息时也存在差异&#xff1a; API Version 9&#xff1a;需要对构建配置文件、构建脚本、应用依…

Springboot+vue的考勤管理系统(有报告)。Javaee项目,springboot vue前后端分离项目。

演示视频&#xff1a; Springbootvue的考勤管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot vue前后端分离项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层…

边缘计算网关的重要作用-天拓四方

随着物联网技术的迅猛发展&#xff0c;数据量的爆炸式增长对数据处理和分析提出了更高的要求。边缘计算网关作为连接物理世界和数字世界的桥梁&#xff0c;正逐渐受到各行业的重视。本文将从行业背景、功能特点以及带来的效益等方面&#xff0c;探讨边缘计算网关在当前及未来的…

HTML中自定义鼠标右键菜单

今天突然有人跟我提到了HTML中如何自定义鼠标右键菜单&#xff0c;这里大概记录一下吧&#xff0c;方便下次直接复制。免得还去看API文档。 文章目录 HTML中自定义鼠标右键菜单结果如下所示可以稍微改一下鼠标悬浮到右键菜单时的样式结果如下所示 只在某个特定的div才可以显示…

来不及了!大学必须完成的四件事!

老师们常说&#xff0c;上大学就轻松了 其实不然 大学不是人生的终点&#xff0c;而是新的起跑线 不是休息站&#xff0c;而是进入社会的最后冲刺跑道 大学生活苦乐参半&#xff0c;成人世界即将来临 出了校门&#xff0c;你会发现社会复杂多变&#xff0c;需要不断学习 稍…

C++之结构体以及通讯录管理系统

1&#xff0c;结构体基本概念 结构体属于自定义的数据概念&#xff0c;允许用户存储不同的数据类型 2&#xff0c;结构体的定义和使用 语法&#xff1a;struct 结构体名{ 结构体成员列表}&#xff1b; 通过结构体创建变量的方式有三种&#xff1a; 1&#xff0c;struct …

在Jupyter-lab中使用RDKit画分子2D图

在Jupyter-lab中使用RDKit画分子2D图 在做完分子对接后&#xff0c;想看看筛选后的分子的结构。因此想利用Jupyter-lab来画分子的2D图。 1. 安装Jupyter-lab与RDKit 系统&#xff1a;Win11已安装conda RDKit 是一个功能强大、灵活易用的化学信息学工具包&#xff0c;广泛应…