按键拨号声音 DTMF MATLAB程序样例
DTMF(Dual tone MultiFrequency)
一、文献简介
[1]介绍了DTMF由Bell实验室发明,实现电话系统自动长途呼叫,用以代替机械拨号转盘按键。
[2]补充介绍了DTMF matlab实现方式
[3]中给出了信号模拟生成的方式代码
[4]中介绍了音频格式以及基本声学概念:(采样值)、(采样(频)率)、(取样率或比特率或位速)、(位深)、(声道,如mono或stereo)
[5]中视频演示了AU对声音信号FFT处理
[6]种介绍了一中电话拨号系统的GUI样式
二、程序样例
1.下面的程序对应于当按键为1时(对应于fr(1)和fc(1))的情况
fr=[697 770 852 941];%fre_row
fc=[1209 1336 1447];%fre_column
Fs=32768;%sample frequency,但是一般选取8k
t=0:1/Fs:0.25;
y1=sin(2*pi*fr(1)*t);
y2=sin(2*pi*fc(1)*t);
y=(y1+y2)/2;
plot(t,y);
sound(y,Fs);
2.下面的程序对应于按下按键“123456789”的情况【本代码可直接复制到MATLAB命令行测试,可听到清脆的“拨号声”】
%DTMF code
clc;
clear;
fl=[697 770 852 941];%fre_row/low fre
fh=[1209 1336 1447];%fre_column/high fre
Fs=8000;%sample frequency,一般选取8k
lasttime=0.25;%单音持续时间
numstring='123456789';
ratio=3;%调整两次拨号之间的间隔
compound=[];%最终的模拟出的信号,是一个行向量
t=1/Fs:1/Fs:lasttime;%单音的时间长度,这里单音长度为0.25s
for i=1:length(numstring)switch numstring(i)case'1'freq_low=fl(1);freq_hgh=fh(1);case'2'freq_low=fl(1);freq_hgh=fh(2);case'3'freq_low=fl(1);freq_hgh=fh(3);case'4'freq_low=fl(2);freq_hgh=fh(1);case'5'freq_low=fl(2);freq_hgh=fh(2);case'6'freq_low=fl(2);freq_hgh=fh(3);case'7'freq_low=fl(3);freq_hgh=fh(1);case'8'freq_low=fl(3);freq_hgh=fh(2);case'9'freq_low=fl(3);freq_hgh=fh(3);case'0'freq_low=fl(4);freq_hgh=fh(2);case'*'freq_low=fl(4);freq_hgh=fh(1);case'#'freq_low=fl(4);freq_hgh=fh(3);otherwiseerror('error occurred!');endy1=sin(2*pi*freq_low*t);y2=sin(2*pi*freq_hgh*t);y=(y1+y2)/2;single=[y,zeros(1,Fs*lasttime*ratio)];%相邻两个单音之间补零,模拟按键后的停顿compound=[compound,single];
end
sound(compound,Fs);%按键的声音播放
%画图
n=length(compound);
t1=1:n;%图形横轴单位划归为秒
subplot(1,2,1);
plot(t1/Fs,compound);
title('电话按键时域图形');
axis([0 length(numstring) -2 2]);
xlabel('时间/s');
ylabel('幅值')
% audiowrite('test.wav',compound,Fs);%可选保存声音文件
subplot(1,2,2);
p=abs(fft(compound));%快速傅里叶变换
plot(t1*Fs/n,p);
title('电话按键频域图形');
xlabel('频率/Hz');
ylabel('幅值/dB')
3.双音信号的频谱分析代码(这里选取了直流\50Hz\75Hz成分的混合)
%双音信号的频谱 fft
Fs=256;%采样频率
N=256;%采样点数
Ts=1/Fs;%采样周期
n=0:1:N-1;
t=n*Ts;%采样步长
y=2+3*cos(2*pi*50*t-pi*30/180)+1.5*cos(2*pi*75*t+pi*90/180);
Y1=y;
subplot(2,1,1);
plot(t,Y1);
f=n*Fs/(N) ;%真实的频率
Y2=fft(y)/N*2;%真实的幅值
subplot(2,1,2);
plot(f,abs(Y2));
xlabel('频率/Hz');
ylabel('振幅');title('fft');grid on;
Fig.test.wav声音波形在AU中的展现
这里选取的是时间在【2.070s,2.100s】之间的波形,横轴代表时间,单位是s,纵轴代表20lg(采样值),单位是dB。特别注意纵轴,又上到下分别0dBz到负无穷再到0dB,坐标轴这样刻画的目的在于满足当采样值为负数下的表达式成立。
波形时间长度:9s,采样(频)率:8KHz,声道:mono,位深:16bit.
根据上述信息计算文件大小:
位速:8K*16bit=128Kbps=16KBps,文件大小:16KBps*9s=144KB.
综上,matlab中生成的声音数据大小为144KB.
link:
[1] DTMF百度百科
[2]《matlab 数值计算》-Cleve.B.Moler-第8章 傅里叶分析-8.1 按键式拨号盘
[3] 代码参考
[4] wav文件格式讲解
[5] B站:用AU通过按键声判断号码
[6] CSDN:一种电话拨号音频系统构建
按键拨号声音 DTMF MATLAB程序样例相关推荐
- S7-200Smart 恒压供水程序样例+485通讯样例 + 触 摸屏样例子
S7-200Smart 恒压供水程序样例+485通讯样例 + 触 摸屏样例子. 1.此程序样例为一拖二恒压供水样例,采用S7-200Smart PLC和smart 700触摸屏人机与abb变频器485 ...
- S7-200Smart 恒压供水程序样例+485通讯样例 + 触摸屏样例子
S7-200Smart 恒压供水程序样例+485通讯样例 + 触摸屏样例子. 1.此程序样例为一拖二恒压供水样例,采用S7-200Smart PLC和smart 700触摸屏人机与abb变频器485通 ...
- 安川机器人DX200运输带同步程序样例
安川机器人DX200运输带同步程序样例,自己做的,在生产中.发电子邮箱 17100625757785033永***j
- 全套S7-1200一拖三恒压供水程序样例+PID样例+触摸屏样例
全套S7-1200一拖三恒压供水程序样例+PID样例+触摸屏样例 . 1.此程序采用S7-1200PLC和KTP1000PN触摸屏人机执行PID控制变频器实现恒压供水. 包括plc程序,触摸屏程序,项 ...
- 04-ABB工业机器人中断程序样例
前段时间一个项目需要机器人将自己的坐标定时发送给上位机,我师父随手写了一个中断样例,在这里分享一下: 首先介绍两个RAPID指令: 1.IDelete:删除中断,用于取消或者删除中断预定. 2.CON ...
- C语言必知-指针数组(附程序样例和详解)
指针数组 除了类型之外,指针变量和其他的变量很相似,只不过加上指针标识就行 例如int *api[10],由于下标引用的优先级高于间接访问(就是解引用),因此 api是一个数组,数组中的元素的类型就是 ...
- 内存区划分;内存分配;堆、栈概念分析;动态内存管理数据结构及程序样例;核心态与用户态...
一. 在c中分为这几个存储区1.栈 - 由编译器自动分配释放 2.堆 - 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收 3.全局区(静态区),全局变量和静态变量的存储是放在一块的,初 ...
- java程序样例_一个完整的java程序示例
一个完整的java程序示例 2020-08-15 05:22 阅读数 74 第一个java程序 package mypack; //相当于一个目录 public class HelloWorld{ p ...
- python运行代码示例_python程序样例
<Python和HDF 5大数据应用>--2.2 设置 本节书摘来自异步社区<Python和HDF 5大数据应用>一书中的第2章,第2.2节,作者[美]Andrew Colle ...
- C++基础教学(含程序样例)
解决闪现问题 在return 0; 的代码上方添加 system("PAUSE"); cout 代表"控制台输出"(console output),必须在代码行 ...
最新文章
- 【全网之最】全网最短代码——给名字、电话、账号、昵称加星号*添加隐私保护、身份证号加密、信息脱敏
- mysql8.0取消授权_mysql8创建用户、删除用户、授权、取消授权
- SpringMVC整合fastdfs-client-java实现web文件上传下载
- App字体大小不随系统改变而改变
- leetcode 665. Non-decreasing Array | 665. 非递减数列(Java)
- linux 系统 可视化工具实时监控_Linux上的实时监控平台-你需要这样做
- arraylist从大到小排序_为什么插入排序比冒泡排序更受欢迎?
- 互联网安全架构师培训课程 互联网安全与防御高级实战课程 基于Springboot安全解决方案
- 三维GIS引擎平台设计
- Guava之Joiner笔记
- Java B组蓝桥杯第七届国赛:圆圈舞
- CameraPath插件使用
- 极速办公(PPT)插入的图像如何铺满页面
- 借助智能手机应用程序和可穿戴设备在夏季塑造身材
- 学习笔记 02:关于在某宝上面购买的stm32f103c8t6最小系统开发板如何使用USBtoTTL模块烧录程序的记录
- 可以有效改进项目管理技能的十个过程
- 那些年被欺骗的感情---分布式实现限流操作(上)
- 电脑无法打开计算机的策略对象,win10系统提示“无法打开此计算机上的组策略对象”的解决方法...
- 当火车进入隧道,耳朵感到不舒服以后
- python的驻留机制