学院(系): 电信 专业: 电子信息工程 班级: 电子1204 姓 名: 梁宇 学号: 201281001 组: ___ 实验时间: 实验室: 实验台: 指导教师签字: 成绩:
实验二、电话拨号音的合成与识别
一、实验目的和要求
本实验内容基于对电话通信系统中拨号音合成与识别的仿真实现。 实验目的:
1.电话拨号音合成的基本原理及识别的主要方法
2.利用MATLAB 软件以及FFT 算法实现对电话通信系统中拨号音的合成与识别 3.并进一步利用MATLAB中的图形用户界面GUI 制作简单直观的模拟界面。
在DTMF 电话机中有16个按键,其中10个数字键0—9,6个功能键*、#、A、B、C、D。其中12 个按键是我们比较熟悉的按键,另外由第4 列确定的按键作为保留,作为功能键留为今后他用。 二、实验原理和内容
1.双音多频DTMF(Dual Tone Multi-Frequency)信号,是用两个特定的单音频率信号的组合来代表数字或功能。
2.双音多频信号(Dual-Tone Multi-Frequency, DTMF)是电话系统中电话机与交换机之间的一种用户信令,通常用于发送被叫号码。
3.在使用双音多频信号之前,电话系统中使用一连串的断续脉冲来传送被叫号码,称为脉冲拨号。脉冲拨号需要电信局中的操作员手工完成长途接续。
4.双音多频信号是贝尔实验室发明的,其目的是为了自动完成长途呼叫。
5.双音多频的拨号键盘是4 ×4 的矩阵,每一行代表一个低频,每一列代表一个高频。每按一个键就发送一个高频和低频的正弦信号组合,比如‘1’相当于频率为697Hz和1209Hz两个正弦信号的组合。交换机可以解码这些频率组合并确定所对应的按键。 双音多频信号的产生
1.CCITT(国际电报电话咨询委员会)对DTMF 信号规定的指标是,传送/接接收率为每秒
10个数字,即每个数字100ms。代表数字的音频信号必须持续至少45ms ,但不超过55ms 。100ms内其他时间为静音,以便区别连续的两个按键信号。
2.图1所示典型DTMF信号频率范围是700-1700Hz,为满足Nyquist条件,选取8192Hz 的采样频率。即1秒采样8192个点,则100ms采样820个点模拟按键信号。假设用410个点作为产生的DTMF信号,其他410个点的0 来表示间隔来模拟静音。以便区别连续的两个按键信号。
三、实验用到的Matlab命令和举例 数字键对应的信号的产生 • 以产生0为例:
•已知声音取样频率fS=8192Hz ,0键对应的行频与列频分别是fL=941Hz和fH=1336Hz, 则取样后wL=2pifL/fS=0.7217 和wH=2pifH / fS=1.0247 。 • 则0对应的信号产生为d0=sin(0.7217n)+sin(1.0247n) • 产生0 的matlab代码
• n=[1:410]; % 每个数字用410 个采样点表示
• d0=sin(0.7217*n)+sin(1.0247*n); % 对应行频列频叠加 • space=zeros(1,410); %410 个0 模拟静音信号 • phone=[d0, space]; 功能键对应的信号的产生
• 对于保留的两个功能键“*”“#”,按照现行键盘式拨号电话的习惯,将“*”作为删除键,“#”作为确认键。
• “*”删除键的作用是将前面拨错的号码删除退回,表现为将显示窗口已经显示的错误号码退回一位数字,并且将连续拨号音信号的存储单元中退回一位拨号音信号和静音信号。删除可以进行连续的操作。
• “#”确认键的作用是将前面拨过的号码进行确认保留,意味着此时连续拨号音信号的存储单元中的信号即为最后用于识别的连续拨号音DTMF 信号,并在显示窗口中显示“#”号作为标记。 • 删除键实现代码 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); 双音多频信号的识别
• 对电话拨号音(DTMF )信号的检测识别可以直接计算付
里叶变换得到输入的信号频率。这里采用FFT 算法对信号进行解码分析。
• 首先对接收到的数字信号作FFT 分析,计算出其幅频谱,进而得到功率谱。对于连续的双音多频(DTMF )信号,需要把有效的数字拨号信号从静音间隔信号中分割提取出来,然后再用FFT 算法对信号进行解码分析。
f=fft(d,8192); % 以N=2048作FFT变换d是取出来每位拨号音的采样点 a=abs(f);
p=a.*a/handles.fs; % 计算功率谱
num(1)=find(p(1:1000)==max(p(1:1000))); % 找行频
num(2)=1000+find(p(1000:1700)==max(p(1000:1700))); % 找列频 if (num(1) < 730) row=1; % 确定行数 elseif (num(1) < 810) row=2;
elseif (num(1) < 900) row=3; else row=4; end
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- huatuo0.cn 版权所有 湘ICP备2023017654号-2
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务