C语言编程产生拨号音,DTMF信号的产生与识别

目 录 一 实验背景一 实验背景 3 3 二 实验目的二 实验目的 3 3 三 实验内容三 实验内容 3 3 四 实验原理四 实验原理 3 3 五 实验程序及注释五 实验程序及注释 5 5 六 六 CCS5000CCS5000程序调试程序调试 9 9 1 1 编译 编译过过程 工程 工程程架架构 编译环构 编译环境境设置设置 2 2 程序运行结果 程序运行结果 图形图形显显示 数据示 数据显显示 示 七 实验总结及感想七 实验总结及感想 第 2 页 共 14 页 DTMF 信号的产生与识别信号的产生与识别 一 实验背景 一 实验背景 双音多频DTMF Dual Tone Multi Frequency 信令 逐渐在全世界范围内 使用在按键式电话机上 因其提供更高的拨号速率 迅速取代了传统转盘式电 话机使用的拨号脉冲信令 作为实现电话号码快速可靠传输的一种技术 它具 有很强的抗干扰能力和较高的传输速度 因此 可广泛用于电话通信系统中 但绝大部分是用作电话的音频拨号 另外 它也可以在数据通信系统中广泛地 用来实现各种数据流和语音等信息的远程传输 近年来DTMF也应用在交互式控 制中 诸如语言菜单 语言邮件 电话银行和ATM 终端等 将DTMF信令的产生 与检测集成到任一含有数字信号处理器 DSP 的系统中 是一项较有价值的工程 应用 二 实验目的 二 实验目的 1 熟悉DSP5402的体系结构 指令系统 汇编语言程序的编写 2 了解DTMF的基础知识 3 学习用c语言对DTMF的编程方法 4 掌握DTMF的信号产生及信号检验 5 在CCS环境下 最终完成程序的调试 三 实验内容 三 实验内容 1 利用DTMF信号产生的原理合成数字1 其合成公式是 分析其时域波形和频谱 2 生成各个按键信号 3 利用fft分析0 9十个数字拨号信息的频谱 观察频谱图中的峰值点的幅值 以及它们出现的位置 根据谱峰的幅值和位置 识别各DTMF信号所对应 对应的数字 4 编写Goertzel算法的程序 识别各DTMF信号所对应对应的数字 比较fft 与Goertzel算法的效率 5 生成一串拨号音 例如8位电话号码 进行识别 6 详细列出电话拨号音合成和识别的步骤 四 实验原理 四 实验原理 1 1 DTMFDTMF信号合成信号合成 第 3 页 共 14 页 根据 CC ITT 建议 国际上采用 697Hz 770Hz 852Hz 941Hz 1209Hz 1336Hz 1477Hz 1633Hz 12 个频率 并将其分成两个群 即低频群和高频群 从低频群和高频群中任意抽出一个频 率进行叠加组合 具有 16 种组合形式 让其代表数字和功率 如下图电话机键 盘的频率矩阵所列 当按下某个键时 所得到的按键信号是由 相应两个频率的正弦信号相加而成 设x k 为DTMF信号 产生方式为 X k Asin k Bsin k h W l W 式中 和 2 分别表示高频和低频频率 A B 分别为 h W2 h f sam f l W l f sam f 低频群和高频群样值的量化基线 电话信号的典型抽样频率为 8kHZ CCITT 对DTMF 信号规定的指标是 传送 接收率为每秒10个数字 sam f 即每个数字100ms 代表数字的音频信号必须持续至少45ms 但不超过 55ms 100ms 内其他时间为静音 无信号 以便区别连续的两个按键信号 2 DTMFDTMF信号的识别信号的识别 DTMF 解码即是在输入信号中搜索出有效的行频和列频 计算数字信号的频 谱可以采用 DFT 及其快速算法 FFT 而在实现 DTMF 解码时 采用 Goertzel 算 法要比 FFT 更快 通过 FFT 可以计算得到信号所有谱线 了解信号整个频域信 息 而对于 DTMF 信号只用关心其 8 个行频 列频及其二次谐波信息即可 二 次谐波的信息用于将 DTMF 信号与声音信号区别开 此时 Goertzel 算法能更 加快速的在输入信号中提取频谱信息 Goertzel 算法实质是一个两极点的 IIR 滤波器 其算法 第 4 页 共 14 页 图 1 Goertzel 算法原理框图 如图知 DFT 计算可以等价为 由于在 DTMF 检测中 输入的信号是实数序列 并不需要检测出 8 个行频 列频的相位 只需要计算出其幅度平方即可 对于实序列 x n Goertzel 算 法所需的内部变量 vk n 也为实数 因此计算如下 用上式的计算取代式 3 即可完全避免复数运算 当幅值的平方大于某一 定值时即可判定其频率点上有对应的信息 在识别DTMF信号时 要求确定抽样点数N 国际上通用N 205点或N 106点 表1列出了N 205点时 各个频率所对应的DFT结果X m 中的序号m 表1 N 205时个频率对应的抽样信息 基频 准确值 m最近的整数m值 两点的绝对误差 697 17 861 18 0 139 770 19 731 20 0 269 852 21 833 22 0 167 941 24 113 24 0 113 1209 30 981 31 0 019 1336 34 235 34 0 235 1477 37 848 38 0 152 五 实验程序及注释 五 实验程序及注释 include stdio h 头文件 include math h include type h include board h void delay int period 函数原型 第 5 页 共 14 页 void generate float dtmf int start int num void detect float dtmf int start int data float freq 10 2 941 1336 697 1209 697 1336 697 1447 770 1209 770 1336 770 1447 852 1209 852 1336 852 1447 0 9 对应的数字频率 float pi 3 1415926 s16 cnt 2 主程序 void main int i float dtmf 8 800 dsk 板的初始化 if brd init 100 return while cnt 循环闪灯 brd led toggle BRD LED0 delay 1000 brd led toggle BRD LED1 delay 1000 brd led toggle BRD LED2 delay 1000 generate dtmf 0 800 5 产生 5 的双音信号 generate dtmf 1 800 1 generate dtmf 2 800 6 generate dtmf 3 800 8 generate dtmf 4 800 1 generate dtmf 5 800 7 generate dtmf 6 800 1 generate dtmf 7 800 3 for i 0 i 8 i detect dtmf 800 i 信号的识别检测 return 延迟子程序 第 6 页 共 14 页 void delay int period int i j for i 0 i period i for j 0 j 1 j 双音信号产生子程序 void generate float dtmf int start int num float x 0 y 0 z 0 int j x freq num 0 8000 2 pi 模拟数字频率的转换 y freq num 1 8000 2 pi for j 1 j 400 j z sin x j sin y j dtmf start j 1 z 2 采样值的装入 前四百个点为双音信 号采样值 后四百个点为 0 即静音 信号 dtmf start j 1 400 0 信号识别子程序 void detect float dtmf int start int i j x y float w 8 b 8 3 result 8 w 0 2 cos 2 pi 18 205 w 1 2 cos 2 pi 20 205 w 2 2 cos 2 pi 22 205 w 3 2 cos 2 pi 24 205 w 4 2 cos 2 pi 31 205 w 5 2 cos 2 pi 34 205 w 6 2 cos 2 pi 37 205 w 7 2 cos 2 pi 42 205 for i 0 i 8 i b i 0 0 b i 1 0 for j 1 j 205 j b i 2 w i b i 1 b i 0 dtmf start j 1 第 7 页 共 14 页 b i 0 b i 1 b i 1 b i 2 result i b i 1 b i 1 b i 0 b i 0 w i b i 1 b i 0 信号幅值的平方 j 0 for i 0 i100 幅值与 100 比较 当超过 100 时 判断此频率点上信 号存在 j printf dtmf d f r n i result i if j 1 x i else if j 2 y i i 1 if j 2 if x 0 else if x 0 else if x 0 else if x 1 else if x 1 else if x 1 else if x 2 else if x 2 else if x 2 else if x 3 if i 1 printf The DTMF signal is d r n i 六 六 CCS5000CCS5000 程序调试程序调试 1 1 编译过程 工程架构 编译环境设置编译过程 工程架构 编译环境设置 1 创建新的工程 第 9 页 共 14 页 2 向工程中添加文件 从 Project Add Files to Project 分别选择 dtmf c 5402 cmd 这个文件 将片段映射到存储器中 rts lib 这个库提供目标 DSP 运行时间支持 runtime support 等文件 右击 dtmf pjt 选择 Scan All Dependencies h 文件将出现在 Project View 窗中的 Libraries 文件夹 头文件不能手动添 加 自动到 当前目录 源文件所在 或预编译器的 include Search Path i option 所指定的位置 显示头文件 Project show Dependencies 最终编译环境如下图所示 第 10 页 共 14 页 3 编译与运行程序 选择 ProjectProject RebuildRebuild AllAll 或单击 Rebuild All 菜单条按钮 CCS 重新进行 编辑 汇编 连接工程里的所有文件 第 11 页 共 14 页 选择 File Load Program 选中 dtmf out 并按 Open CCS 将程序装载到目标 DSP 上 打开显示程序反汇编指令的 Disassembly 窗口 选择 Debug Go Main 从主程序开始执行 2 2 实验结果及图像 实验结果及图像 观察信号时域图 第 12 页 共 14 页 观察信号频域图 信号检测输出 第 13 页 共 14 页 七 实验总结及感想 七 实验总结及感想 本实验主要是 DTMF 双音多频信号的产生与识别 按键信号是由相应两个频 率的正弦信号相加而成 通过 x freq num 0 8000 2 pi y freq num 1 8000 2 pi 实现对模拟行频和列频向数字的转换 对产生的正弦信号进行 400 点抽样 存入 dtmf 数组中 以便检测时调用 本实验是通过 Goertzel 算 法实现对信号的检测 通过对迭代方程的计算 得出信号幅值的平方 在八个 频率点处与已知常数进行比较 检测出符合条件的频率组合 并输出数值 完 成识别过程 当然 在实验过程中 遇到了很多困难 比如说 程序文件 5402 cmd 文件 刚开始直接调用 编译时出现错误 根据提示 在一系列的修改尝试后 补加 了段 sysmem SCRATCH PAGE 1 并且对其他段地址和长度的修改 才达到了要 求 在采样点选择问题上 刚开始选择抽样点数为 106 发现不能很好的观察 图像 然后通过翻阅 信号数字处理 结合所学知识 得到在取样频率为 8000hz 的时候 其最小抽样点数为 109 因此我们最后选择 205 实践证明 选择 205 为抽样点数 实现的非常完美 通过此次实验 我们对DTMF的基础知识有了个比较深刻的了解 掌握了 DTMF的信号产生及信号检验的原理及方法 并熟悉了用c语言对DTMF的编程的方 法 通过程序的调用及调式 我们熟悉了DSP5402的体系结构 指令系统等 我们定会总结实验方法 掌握理论知识 汲取经验教训 为进一步掌握 DSP的设计 CCS的使用打下基础 第 14 页 共 14 页

展开阅读全文

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值