matlab判断电话播键音,MATLAB电话拨号音的合成与识别
1.实验目的1.本实验内容基于对电话通信系统中拨号音合成与识别的仿真实现。主要涉及到电话拨号音合成的基本原理及识别的主要方法,利用 MATLAB 软件以及 FFT 算法实现对电话通信系统中拨号音的合成与识别。并进一步利用 MATLAB 中的图形用户界面 GUI 制作简单直观的模拟界面。使其对电话通信系统拨号音的合成与识别有个基本的了解。
2.能够利用矩阵不同的基频合成 0 - 9 不同按键的拨号音,并能够对不同的拨号音加以正确的识别,实现由拨号音解析出电话号码的过程。进一步利用 GUI 做出简单的图形操作界面。要求界面清楚,画面简洁,易于理解,操作简单。从而实现对电话拨号音系统的简单的实验仿真。
2.实验原理
1. DTMF 信号的组成
双音多频 DTMF ( Dual Tone Multi-Frequency )信号,是用两个特定的单音频率信号的组合来代表数字或功能。在 DTMF 电话机中有 16 个按键,其中 10 个数字键 0 — 9 , 6 个功能键 * 、 # 、 A 、 B 、 C 、 D 。其中 12 个按键是我们比较熟悉的按键,另外由第 4 列确定的按键作为保留,作为功能键留为今后他用。 根据 CCITT 建议,国际上采用 697Hz 、 770Hz 、 852Hz 、 94lHz 低频群及 1209Hz 、 1336Hz 、 1477H: 、 1633Hz 高频群。从低频群和高频群任意各抽出一种频率进行组合,共有 16 种组合,代表 16 种不同的数字键或功能,每个按键唯一地由一组行频和列频组成,如表 1 所示。
转载请注明出处。)
DTMF 的组合功能
3.实验步骤
1. DTMF 信号的产生合成
现在将对上节制作的图形电话拨号面板上的各控件单位的动作和变化进行设置,即对 tu1.m 文件进行编辑。其主要的功能是使对应的按键,按照表 1 的对应关系产生相应的拨号音,完成对应行频及列频的叠加输出。此外,对于图形界面的需要,还要使按键的号码数字显示在拨号显示窗口中。
鉴于 CCITT 对 DTMF 信号规定的指标,这里每个数字信号取 1000 个采样点模拟按键信号,并且每两个数字之间用 100 个 0 来表示间隔来模拟静音。以便区别连续的两个按键信号。间隔的静音信号也是在按键时产生的。
以按键 0 为例,简单介绍拨号音产生的过程:
% 按键 0 的响应函数
function varargout = pushbutton0_Callback(h, eventdata, handles, varargin)
n=[1:1000]; % 每个数字 1000 个采样点表示
d0=sin(0.7217*n)+sin(1.0247*n); % 对应行频列频叠加
n0=strcat(get(handles.edit1,'string'),'0'); % 获取数字号码
set(handles.edit1,'string',n0); % 显示号码
space=zeros(1,100); %100 个 0 模拟静音信号
global NUM
phone=[NUM,d0];
NUM=[phone,space]; % 存储连续的拨号音信号
wavplay(d0,8192); % 产生拨号音
程序解释:
NUM 为定义的全局变量,用于存储连续的拨号音( DTMF )信号,包括数字信号音以及静音信号。
d0=sin(0.7217*n)+sin(1.0247*n) 中的行频与列频是由表 1 中 0 键对应的计算得出,已知声音取样频率,则取样后。
对于保留的两个功能键“ * ”“#”,按照现行键盘式拨号电话的习惯,将“ * ”作为删除键,“#”作为确认键。“ * ”删除键的作用是将前面拨错的号码删除退回,表现为将显示窗口已经显示的错误号码退回一位数字,并且将连续拨号音信号的存储单元 NUM 中退回一位拨号音信号和静音信号。删除可以进行连续的操作。“#”确认键的作用是将前面拨过的号码进行确认保留,意味着此时连续拨号音信号的存储单元 NUM 中的信号即为最后用于识别的连续拨号音 DTMF 信号,并在显示窗口中显示“#”号作为标记。
% 删除键的响应函数
function varargout = pushbuttonback_Callback(h, eventdata, handles, varargin)
n=[1:1000];
num=get(handles.edit1,'string');
l=length(num);
n11=strrep(num,num,num(1:l-1));
d11=sin(0.7217*n)+sin(0.9273*n);
set(handles.edit1,'string',n11);
global NUM
L=length(NUM);
NUM=NUM(1:L-1100);
wavplay(d11,8192);
2.图形电话拨号面板的制作
利用 GUI 图形用户界面设计工具制作电话拨号面板,把 DTMF 信号和电话机的键盘矩阵对应起来。其中选用我们熟悉的 10 个数字键 0 — 9 , 2 个功能键“ * ”、“#”,另四个键省略。按照图 1 电话机键盘矩阵的排列方式制作四行三列的按键控件。每个按键可用( Push Button )添加。
然后,为了更直观的反应对应的按键号码,可以设置一个编辑框,用于动态的显示拨号号码,模拟实际电话的拨号显示窗口。编辑框可用( Edit Text )添加。
另外,为了图形电话拨号面板的简洁美观,可以添加空白区域作为背景,并用静态文本框制作文字信息。背景可用( Frame )添加,静态文本框可用( Static Text )添加。
最终利用 GUI 图形用户界面设计工具生成的图形电话拨号面板用于拨号音的合成产生部分,如下图所示:
3.DTMF 信号的检测识别
对电话拨号音( DTMF )信号的检测识别的仿真实现,可以直接计算付里叶变换得到输入的信号频率。这里采用 FFT 算法对信号进行解码分析。首先对接收到的数字信号作 FFT 分析,计算出其幅频谱,进而得到功率谱。对于连续的双音多频( DTMF )信号,需要把有效的数字拨号信号从静音间隔信号中分割提取出来,然后再用 FFT 算法对信号进行解码分析。
MATLAB 实现信号音的识别如下:
% 信号音识别 ----------------------------------------------------------------
function varargout = pushbuttonNUM_Callback(h, eventdata, handles, varargin)
global NUM
wavplay(NUM,8192);
L=length(NUM);
n=L/1100;
number='';
for i=1:n
j=(i-1)*1100+1;
d=NUM(j:j+999); % 截取出每个数字
f=fft(d,2048); % 以 N=2048 作 FFT 变换
a=abs(f);
p=a.*a/10000; % 计算功率谱
num(1)=find(p(1:250)==max(p(1:250))); % 找行频
num(2)=300+find(p(300:380)==max(p(300:380))); % 找列频
if (num(1) < 180) row=1; % 确定行数
elseif (num(1) < 200) row=2;
elseif (num(1) < 220) row=3;
else row=4;
end
if (num(2) < 320) column=1; % 确定列数
elseif (num(2) < 340) column=2;
else column=3;
end
z=[row,column]; % 确定数字
if z==[4,2] tel=0;
elseif z==[1,1] tel=1;
elseif z==[1,2] tel=2;
elseif z==[1,3] tel=3;
elseif z==[2,1] tel=4;
elseif z==[2,2] tel=5;
elseif z==[2,3] tel=6;
elseif z==[3,1] tel=7;
elseif z==[3,2] tel=8;
elseif z==[3,3] tel=9;
end
t(i)=tel;
c=strcat(number,int2str(tel));
number=c;
i=i+1;
end
set(handles.edit3,'string',number);
程序解释:
确定行频和列频的数值范围是通过计算得出的:已知输入信号的取样频率,而做FFT的N=2048,则频谱分辨率为,由此可算出频谱图上任意点对应的频率。例如,数字8的高、低端频率为,则在谱图上对应的点。
4.实验内容实验报告要求:(1) 简述实验目的及原理。(2) 打印出一个数字拨号音的频谱图,加以分析说明,并解释DTMF 信号的检测识别的原理。(3) 总结实验得出主要结论。
转载请注明出处。)
matlab判断电话播键音,MATLAB电话拨号音的合成与识别相关推荐
- matlab电话拨号音的合成与识别代码,实验报告 电话拨号音的合成与识别
大连理工大学实验报告 学院(系): 电信 专业: 电子信息工程 班级: 电子1302 姓名: 曾昱 学号: 201311066 组: 实验时间: 实验室: 实验台: 指导教师签字: 成绩: 电话拨号音 ...
- matlab判断文件是否损坏,检查 MATLAB 代码文件是否有问题
示例 以下示例使用了 lengthofline.m,它是带有可改进代码的 MATLAB 示例文件.您可以在 matlabroot/help/techdoc/matlab_env/examples 中可 ...
- matlab 判断文件有多少行,在Matlab中有没有办法确定文件中的行数,而不是循环遍历每一行?...
我喜欢使用以下代码完成这项任务 fid = fopen('someTextFile.txt', 'rb'); %# Get file size. fseek(fid, 0, 'eof'); fileS ...
- MATLAB听拨号音识别号码应用
1引言 双音多频信号(Dual Tone Multiple Frequency , DTMF)最初是由美国贝尔实验室研制.它具有很强的抗干扰能力以及较快的传输速度,因此被广泛应用于音频电话系统中.另外 ...
- MATLAB判断文件是否存在、删除文件
MATLAB判断文件是否存在: exist('output.txt','file') 如果output.txt存在,返回2,若不存在返回0 MATLAB删除文件: delete('output.txt ...
- matlab判断系统稳定性 -Nyquist图(极坐标图)判据(还没有搞完。。。。。。。)
matlab判断系统稳定性 -Nyquist图(极坐标图)判据(还没有搞完.......)
- matlab if判断 字符,matlab判断语句与
matlab if语句 在MATLAB中,if语句有3种格式. (1) 单分支if语句:if 条件 语句组 end当条件成立时,则执行语句组,执行完之后继续执行if语句的后继语句,若条件不成立,则直接 ...
- matlab 判断矩阵奇异,Matlab 奇异值、奇异矩阵、svd函数
奇异值: 奇异值分解法是线性代数中一种重要的矩阵分解法,在信号处理.统计学等领域有重要应用. 定义:设A为m*n阶矩阵,A'表示A的转置矩阵,A'*A的n个特征值的非负平方根叫作A的奇异值.记为σi( ...
- matlab 判断矩阵是正定、半正定还是负定
用Matlab 判断矩阵是正定.半正定还是负定 % 判断矩阵m是正定.半正定还是负定 m = [2 -1; -1 2]; if issymmetric(m) % 检查矩阵是否对称% disp('矩阵对 ...
最新文章
- 解决VS 于 致命错误 RC1015: 无法打开包含文件 #39;afxres.h#39; 问题
- Scala消息通信之akka,akka案例
- jQuery就业课系列之.jQueryDOM
- ubuntu系统下面PhantomJS not found on PATH
- 【PMP】项目风险管理~重点知识
- koa --- koa-bouncer验证
- 何时使用JavaFX代替HTML
- 非 GUI 模式运行 JMeter 压力测试
- python 任务调度 celery_斑马斑马-09-白云之上-python任务调度之celery
- Cordova Android 禁用长按选中功能
- 简单工厂模式、工厂模式以及抽象工厂模式(具体)
- 对数函数log()用法
- matlab四大取整函数fix,floor,ceil,round
- 人工智能技术的原理是什么,人工智能技术在实际应用中具有哪些优势?
- 怎样在微信上发淘宝商品链接?
- 青云诀2显示登录服务器超时,青云诀2游戏突然显示数据包损坏怎么办 解决方案分享...
- python的基本数据类型关键字_Python3 基本数据类型
- 冒死推荐一些值得推荐的 Java 练手项目
- TensorFlow-gpu使用方法
- 如何快速学会一项新技能?