双音多频( DTMF)信号的识别

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
The amplitude spectrum of DTMF_data_01.wav 400
Amplitude
200
0 0 500 1000 1500 2000 2500 3000 3500 4000 4500 5000 Frequency / Hz
Fig. 1. DTMF_data_01.wav 的幅度谱
2015
4.3 C++实现 DTMF 信号串的读取和识别
本问题应该使用短时傅里叶变换,即使用一个滑动窗对输入信号做采样并进行 FFT。适当地
数字信号处理
Digital Signal Processing
2015
双音多频(DTMF)信号的识别
张懿 清华大学电子工程系
摘要
使用 MATLAB 完成了对 10 个音频文件的读取和频谱分析,给出了 10 个文件对应的真实数 字。使用 C++编程实现了基 2FFT 的 DIT 形式,并用其完成了前述任务。使用 C++编程实现了 对 DTMF 信号串的自动识别。编程实现了 DTMF 信号实时处理,并且以多线程的方式对处理 过程进行了模拟。
实现 FFT 后,将输入的元素做 FFT,得到频谱。对频谱中元素去绝对值,得幅度谱。由幅度 谱可以找到两个幅度最大的峰,即为 DTMF 的两个频率。考虑到本问题的特殊性,可以仅检 查高频群和低频群中的频点附近幅度的大小,分别在两个频率群中找到幅度最大的频率,即 为要找的频率。
4
数字信号处理
Digital Signal Processing
3 实验任务
(1) 下载附件包中的附件 1 里有 10 个长度不一的音频文件,利用 Matlab 编程对这 10 个文件进行读取、 频谱分析,最后给出 10 个文件所对应的真实数字。 (2) 利用 C/C++语言自编程序(禁止使用现成的 DSP 算法库),完成( 1)中的要求。 (3) 下载附件包中的附件 2 里有一个长音频文件,文件中包含了一串 DTMF 信号, 每 个双音多频信号之间的时间间隔不一,C/C++语言自编程序(禁止使用现成的 DSP 算法库), 对本串 DTMF 信号进行识别。 注: 禁止手动找出长音频中将存在信号的位置,然后分别 处理。
/* x is the sequence to be performed fft on. Np is the number of point in fft, which should be a power of 2.
3
数字信号处理
Digital Signal Processing
2015
The length of x should be less than Np. Output sequence length is Np. */ int rank = (int)floor(log2(Np)); int L0 = x.size(); for (int i = 0; i < Np-L0; i++) {
Fig. 2. 按时间抽取的 FFT 蝶形图,本图中三层计算单元中分别有 4, 2, 1 个块。
基 2 FFT 实现代码如下。函数的输入为将进行 FFT 的序列 x 及要进行的点数 Np,这里 Np 应 为2^R。若 x 长度不到 Np,在之后补零。
vector<complex<double>> b2fft(vector<complex<double>> x, int Np) {
4 实验方法
4.1 MATLAB 实现单个 DTMF 信号的读取和识别
基本思路为,对信号进行 FFT,在频域中找到对应的低频群信号和高频群信号。可以先用
2
数字信号处理
Digital Signal Processing
2015
max 函数找到幅度最大的频点,再利用 MATLAB 自带的 findpeaks 设置适当的幅度阈值找到 最大的两个峰,即为 DTMF 的两个频率。
1
数字信号处理
Digital Signal Processing
2015
1 实验目的
利用快速傅里叶变换(FFT)或其他高效算法对给定音频文件中的双音多频信号进行识别。
2 实验背景
在有线电话拨号时,电话机根据当前所拨号码的不同产生不同频率组的电路信号,从而被另 一端的交换机所识别,根据每个顺序识别的号码进行预先定义好的线路交换操作。拨号产生 的信号即双音多频信号。 双音多频 DTMF(Dual Tone Multi Frequency),由高频群和低频群组成,高低频群各包含 4 个频率。一个高频信号和一个低频信号叠加组成一个组合信号,代表一个数字。 DTMF 信 号有 16 个编码。 交换机中根据电路的此类双频信号识别用户的播号。 DTMF 的具体频 率配置如下图所示:
x_inv[i] = x[bitinverse(i, rank)]; } vector <complex<double>> out(Np); vector <complex<double>> in(x_inv); // input of each step for (int k = 1; k <= rank; k++) // take rank steps in all {
for (int B = 1; B <= (int)pow(2, rank - k); B++) {
for (int m = 0; m < (int)pow(2, k - 1); m++) {
int up = (int)((B - 1)*pow(2, k) + m); int down = (int)((B - 1)*pow(2, k) + m + pow(2, k - 1)); complex<double> W = rotcoef((int)pow(2, k), m); out[up] = in[up] + W*in[down]; out[down] = in[up] - W*in[down]; } } if (k != rank) // swap in and out except for last step { in = out; } } return out; }
目录
双音多频(DTMF)信号的识别 ....................................................................................................... 1 摘 要.........................................................................................................................................1 1 实验目的...............................................................................................................................2 2 实验背景...............................................................................................................................2 3 实验任务................................................................................................................................2 4 实验方法...............................................................................................................................2 4.1 MATLAB 实现单个 DTMF 信号的读取和识别...........................................................2 4.2 C++实现单个 DTMF 信号的读取和识别 ...................................................................3 4.3 C++实现 DTMF 信号串的读取和识别 .......................................................................5 4.4 C++实现 DTMF 信号串的实时读取和识别 ...............................................................6 5 实验结果与分析...................................................................................................................6 5.1 MATLAB 实现单个 DTMF 信号的读取和识别...........................................................6 5.2 C++实现单个 DTMF 信号的读取和识别 ...................................................................7 6.3 C++实现 DTMF 信号串的读取和识别 .......................................................................7 5.4 C++实现 DTMF 信号串的实时读取和识别 ...............................................................8 6 实验总结...............................................................................................................................8 7 附录.......................................................................................................................................8

������������
������������2[������]
(1-2)
最终可以将其拆分成一系列的 2 点基本蝶形单元。故先将输入序列取比特逆序,进入 R 层计 算单元。第 k 层计算单元可以分成2^(R − k)个计算块,块大小为2^k。块内可以分为上半和 下半部分,顺序取上半和下半部分的元素进行 2 点蝶形运算,即每个块可以拆成2^(k − 1)个 2 点基本蝶形单元。每层运算后,输出作为下一层的输入,故可以由 3 层循环实现。
4.2 C++实现单个 DTMF 信号的读取和识别
在 C++环境下,首先实现 FFT 函数。 将点数补成 2 的 R 次方,按时间奇偶抽取
X[k] = ������1[������] + ������������������������2[������]
(1-1)
X
[k
+
来自百度文库
������]
2
=
������1[������]
x.push_back(complex<double>(0.0)); // add 0 to input to get Np elements
} vector <complex<double>> x_inv(Np); // input with inverse order for (int i = 0; i < (int)pow(2, rank); i++) {
相关文档
最新文档