经典课程指导:《数字处理系统课程设计与实践》指导(2)DTMF之三 自适应检测
从本文开始,将陆续给出拨号音自适应检测的算法内容,难度逐渐加深,往产品方向靠拢。这个系列文章将DTMF检测的内容讲的淋漓尽致,相信大家可以从中感受到了数字信号处理的神奇和实用!同学们在学习数字信号处理的时候需要这样的实践课程,将本科阶段的数字信号处理知识全部用了起来,从FFT到滤波器!!!本文内容超过四千字,非专业人士莫入!不仅涉及到数字信号处理算法知识,还涉及到算法研发的引导过程!如果从能量检测和信号时长的角度出发考虑,算法的实现过程应该如何呢?能量检测用于是否存在拨号音,时长则是指导了算法中用于计算频率所要用的信号长度。对于传统固定电话网络(PSTN)用户,拨号音本身是持续发出的,直到用户开始拨号。而在用户拨号过程中,每个拨号按键音的时长并不是固定针对某个号码有特定时长,而是有一个大致的标准范围。一般来说,每个拨号按键音的持续时间在 100 毫秒左右。例如,用户按数字 “1” 这个键,发出的对应按键音持续时间大约为 100 毫秒,按其他数字键的情况类似。按键音之间的间隔时间(即从按完一个键到按下一个键之间的空白时间)通常也在 100 毫秒左右(当然这应该是最小值,时间间隔大也是允许的)。不过这只是一个大致的参考值,实际情况可能会因不同的电话设备、通信系统以及网络状况等因素而略有差异。了解了这些情况就可以开始写自适应拨号音检测算法了。如果用频域检测,势必存在信号检测时长的难题。那么采用滤波器进行流信号处理模式,就可以避开这个障碍了哦!什么是段信号处理?什么是流信号处理呢?
- 定义:是将一段完整的信号数据一次性加载到处理系统中进行处理的方式。这段信号具有明确的起止点,处理时把它视为一个相对独立、静态的数据集 。例如,处理一段时长固定为 5 秒的音频信号,先把这 5 秒内所有采样点数据完整收集起来,存放在内存缓冲区,再对整个缓冲区数据开展诸如频谱分析等操作。
- 特点:计算复杂度通常集中在一次性批处理数据上,算法设计往往基于这段完整的数据。后续如需处理新的数据段,要重复整个采集与处理流程;由于处理的数据量既定,资源分配相对好预估,适用于对实时性要求不高、数据量较小的场景,像离线音频编辑软件对录制好的音频片段做特效处理。在通信信号处理中,则体现为对一帧数据进行反复处理,以得到最好的误码性能。
这两种处理的典型代表就是傅里叶变换和滤波处理!这可以通过相关的仿真来强化理解!
提示:filter函数是对段信号进行处理,但实质上是流信号处理方式!为什么?我在下一篇文章的视频中会讲解!怎么写成流处理的形式呢?
滤波器如何设计呢?首先是要确定类型:带通滤波器。然后就是参数设计!先来看看学生(22通信的小王同学)写的代码!再来看看他的算法思路!%%%%%%%%%%%%%% DTMF双音多频信号自动检测 %%%%%%%%%%%%%%%% %%%%%%%%%% data:2024-12-18 author wang qihui %%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%% 读取数据 %%%%%%%%%%%%%%%%%%%%%%%% filename = 'yb手机号_15895902398.m4a';% filename = '1234567890间断.m4a'; [data,Fs] = audioread(filename);% 读取音频文件数据,注意这里的data是两列数据,Fs = 48000Hz data = data(:,1) + data(:,2);% 把双声道的数据都加载一起,这一步很重要,一个声道高频分量多一些,一个声道低频分量多一些