基于matlab的DTMF信号的产生和检测(1)

2024-05-20 20:08
文章标签 matlab 检测 信号 产生 dtmf

本文主要是介绍基于matlab的DTMF信号的产生和检测(1),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

DTMF是什么?Double Tone Multiple Frequency就是这个,双音多频信号,不仅在我们现在的音频电话中使用,还在数据通信中处理各种数据流等信息。

一个DTMF信号由两个单音频正弦信号组成,有一个低频组(697hz,770hz,852hz,941hz),还有一个高频群(1209hz,1366hz,1477hz,1633hz),特点:

1.所有音频都位于人的可听范围内,因此按键下去时人可以听到。
2.8个频率中没有一个频率是其他任意一个频率的倍数。
3.任意两个频率的组合,相加或相减都不等于其他任意一个频率。

这些特性不仅简化了DTMF信号的解码同时也降低了DTMF误检的概率。

记得在《名侦探柯南》剧场版12里面柯南和怜子被困在水库里,柯南用足球把固定电话的听筒给打下来后和怜子分别发出697hz,1209hz以及941hz,1366hz的声音,最终报警成功。我也是醉了,柯南不是音痴吗?怎么会有绝对音感?且不说这个神奇的现象。拨号电话能够这样通过两个频率的声音组合作为DTMF信号拨出去,还是让我对这个提起了一点兴趣。

但是规定DTMF生成模块中信号的采样频率为1M多,我不知道什么音频信号会达到那么高,但是现在用matlab仿真的话的确还是有可能的。

产生的信号频率精度优于1%,这个之后再实际硬件上再实现就好了。

DTMF用下式表示:
x(t) = sin(2*pi*f1*t) + sin(2*pi*f2*t)
x = sin(2*pi*n*f1(p)/fs) + sin(2*pi*n*f2(q)/fs)这个就是在matlab上面写的,但是采样频率这里还有待考虑。

输入的时候还需要加上高斯白噪声,SNR = input(输入信道信噪比);w = awgn(x,SNR);这个函数就有用。


tm=[1,2,3,65;4,5,6,66;7,8,9,67;42,0,35,68]; % DTMF信号代表的16个数
N=205;K=[18,20,22,24,31,34,38,42];
f1=[697,770,852,941]; % 行频率向量
f2=[1209,1336,1477,1633]; % 列频率向量
TN=input('键入11位电话号码= '); % 输入11位数字
SNR=input('键入信道信噪比= '); % 输入信噪比
TNr=0; %接收端电话号码初值为零
for l=1:11;
d=fix(TN/10^(11-l));
TN=TN-d*10^(11-l);
for p=1:4;
for q=1:4;
if tm(p,q)==abs(d); break,end % 检测码相符的列号q
end
if tm(p,q)==abs(d); break,end % 检测码相符的行号p
end
n=0:1023; % 为了发声,加长序列
x = sin(2*pi*n*f1(p)/fs) + sin(2*pi*n*f2(q)/fs);% 构成双频信号
sound(x,8000); % 发出声音(真的就是发出话音信号的声音了)
pause(0.15)

很多代码需要解释,你产生了信号,当然需要检测出来,因为matlab仿真,需要显示出你所按的键的图样。这里用到了goertzel算法。

这个算法实质上是以一个二阶IIR带通滤波器为基础,可由两个差分方程表示,其实是由DFT实现的,其运算次数比FFT在点数多的时候方便,因为可以有选择地计算个别点出的DFT,而对不需要的点不进行运算。


X=goertzel(w(1:N),K+1); % 用Goertzel算法计算八点DFT样本
val = abs(X); % 列出八点DFT向量
subplot(4,3,l);
stem(K,val,'.');grid;xlabel('k');ylabel('|X(k)|') % 画出DFT(k)幅度
axis([10 50 0 120])
limit = 80; %
for s=5:8;
if val(s) > limit, break, end % 查找列号
end
for r=1:4;
if val(r) > limit, break, end % 查找行号
end
TNr=TNr+tm(r,s-4)*10^(11-l);
end
disp('接收端检测到的号码为:') % 显示接收到的字符
%disp(char(65))
disp(TNr)

这里需要DFT,所以要涉及到N,和k,N就是DFT所需要的采样的,所变换的点数。k就是要求计算的DFT[x]的频点序号向量。

检测DTMF信号的DFT参数:
确定三个:采样频率fs,DFT的变换点数,需要对信号的观察时间的长度Tp。

对信号频谱分析也有要求:频率分辨率,谱分析的频谱范围,检测频率的准确性。

1.相邻间隔频率最小的是73hz,Fmin =73hz,Tpmin = 13.7ms,要求按键时间>40ms

2.697~1633hz,这里不考虑二次谐波的干扰。

3.序列的N点DFT是对序列频谱函数0~2pi区间的N点等间隔采样,若是一个周期序列,截取周期序列的整数倍周期,进行DFT,其采样点刚好在周期信号的频率上,DFT的幅度最大处就是信号的准确频率。

对应模拟频率的采样点频率为fk = fs*k/N(又叫频率分辨率)

希望选一个合适的N,使该公式算出的fk能接近要检测的频率。或者用8个频率中任意一个fk’带入进去,得到k值,然后k取整数。

ITUT规定,每秒最多按10个键,即每个键时隙最短为100ms,其中音频实际持续时间至少为45ms,不大于55ms。因为我们生成DTMF信号的采样频率巨大,意思就是1s采样100多万个点哦,100ms采样15万多个个点,即我们自己设置78125个点产生DTMF信号,剩下的78125个点就是静音的点。都是50ms。

所以呢,要把N点求出来,从而求出k值。

fk/fs = k/N;

假设fs巨大,fk最多也就是1633hz吧,那么k/N就得很小很小,那么N就要很大,因为k是要从图上面看的检测DFT幅度显示所对应的频率的系数的。所以N就很大,那么就加大N,捕捉N个样值所需要的时间就增加了,而这个时间的增加会对检测的效果产生影响

弄不懂的是,DTMF产生时的采样信号和检测时的采样信号不同,而且频率偏移度根据ITU规定1.5%以内正常,超出3.5%就拒绝,这样的话697hz的拒绝误差就比1633hz的允许误差要小,因为低频群和高频群的绝对误差是不同的,应该要区别处理,到底要不要呢?要就应该把N分开用,高频群一个N,低频群一个N。

今天暂时分析到这里.。。

这篇关于基于matlab的DTMF信号的产生和检测(1)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/995951

相关文章

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

烟火目标检测数据集 7800张 烟火检测 带标注 voc yolo

一个包含7800张带标注图像的数据集,专门用于烟火目标检测,是一个非常有价值的资源,尤其对于那些致力于公共安全、事件管理和烟花表演监控等领域的人士而言。下面是对此数据集的一个详细介绍: 数据集名称:烟火目标检测数据集 数据集规模: 图片数量:7800张类别:主要包含烟火类目标,可能还包括其他相关类别,如烟火发射装置、背景等。格式:图像文件通常为JPEG或PNG格式;标注文件可能为X

MCU7.keil中build产生的hex文件解读

1.hex文件大致解读 闲来无事,查看了MCU6.用keil新建项目的hex文件 用FlexHex打开 给我的第一印象是:经过软件的解释之后,发现这些数据排列地十分整齐 :02000F0080FE71:03000000020003F8:0C000300787FE4F6D8FD75810702000F3D:00000001FF 把解释后的数据当作十六进制来观察 1.每一行数据

基于 YOLOv5 的积水检测系统:打造高效智能的智慧城市应用

在城市发展中,积水问题日益严重,特别是在大雨过后,积水往往会影响交通甚至威胁人们的安全。通过现代计算机视觉技术,我们能够智能化地检测和识别积水区域,减少潜在危险。本文将介绍如何使用 YOLOv5 和 PyQt5 搭建一个积水检测系统,结合深度学习和直观的图形界面,为用户提供高效的解决方案。 源码地址: PyQt5+YoloV5 实现积水检测系统 预览: 项目背景

JavaFX应用更新检测功能(在线自动更新方案)

JavaFX开发的桌面应用属于C端,一般来说需要版本检测和自动更新功能,这里记录一下一种版本检测和自动更新的方法。 1. 整体方案 JavaFX.应用版本检测、自动更新主要涉及一下步骤: 读取本地应用版本拉取远程版本并比较两个版本如果需要升级,那么拉取更新历史弹出升级控制窗口用户选择升级时,拉取升级包解压,重启应用用户选择忽略时,本地版本标志为忽略版本用户选择取消时,隐藏升级控制窗口 2.

matlab读取NC文件(含group)

matlab读取NC文件(含group): NC文件数据结构: 代码: % 打开 NetCDF 文件filename = 'your_file.nc'; % 替换为你的文件名% 使用 netcdf.open 函数打开文件ncid = netcdf.open(filename, 'NC_NOWRITE');% 查看文件中的组% 假设我们想读取名为 "group1" 的组groupName

利用matlab bar函数绘制较为复杂的柱状图,并在图中进行适当标注

示例代码和结果如下:小疑问:如何自动选择合适的坐标位置对柱状图的数值大小进行标注?😂 clear; close all;x = 1:3;aa=[28.6321521955954 26.2453660695847 21.69102348512086.93747104431360 6.25442246899816 3.342835958564245.51365061796319 4.87

C# double[] 和Matlab数组MWArray[]转换

C# double[] 转换成MWArray[], 直接赋值就行             MWNumericArray[] ma = new MWNumericArray[4];             double[] dT = new double[] { 0 };             double[] dT1 = new double[] { 0,2 };

[数据集][目标检测]血细胞检测数据集VOC+YOLO格式2757张4类别

数据集格式:Pascal VOC格式+YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):2757 标注数量(xml文件个数):2757 标注数量(txt文件个数):2757 标注类别数:4 标注类别名称:["Platelets","RBC","WBC","sickle cell"] 每个类别标注的框数:

列举你能想到的UNIX信号,并说明信号用途

信号是一种软中断,是一种处理异步事件的方法。一般来说,操作系统都支持许多信号。尤其是UNIX,比较重要应用程序一般都会处理信号。 UNIX定义了许多信号,比如SIGINT表示中断字符信号,也就是Ctrl+C的信号,SIGBUS表示硬件故障的信号;SIGCHLD表示子进程状态改变信号;SIGKILL表示终止程序运行的信号,等等。信号量编程是UNIX下非常重要的一种技术。 Unix信号量也可以