DTMF信号检测之goertzel算法

必须要了解goertzel算法才可以继续接下去。

之所以用频率来了解整个过程,是因为频域比较好分析。N数据的DFT和FFT之间的比较是DFT运算量过大,和N^2成正比,而FFT和Nlog2N成正比。

而goertzel算法实质也是对DFT的快速运算,但可以有选择地计算个别点处的DFT。

而goertzel算法实质就是一个两极点的IIR滤波器DTMF信号检测之goertzel算法_第1张图片

是有递归,是有乘法器,延迟器,加法器。我们算递归的时候主要就是要看中间的量。中间的递归量由x(n)+2cos(2pik/N)Vk(N-1)-Vk(N-2),
对序列x(n)的DFT等价于x(n)与系统传递函数h(n)的第N个卷积值。

对系统的传递函数h(n)进行z变换,得到H(Z),可以看成是级联型网络,y(n) = v(n) - W V(n-1).功率输出就是|yn|^2.

DTMF检测的原理,是在DTMF频率上,检查接收到的信号能量,已确定是否接受到了正确的DTMF音调对。对于要检测的音调数量比较小的情况下,滤波组实现更有效。因为我们关心的频率只有8个点。所以用DFT更加有效。

对于8个不同的K值,他对应于DTMF的8个频率。用goertzel算法可以有效地计算出DFT系数,goertzel算法可以看作是针对每个频率k的匹配滤波器。x(n)算是输入信号,Hk(k)为第k个频率组件上的滤波器传递函数,而X(k)则为相应的滤波器输出。

这里定义一个yk(n)可以看作是x(n) 与序列Wu[n]的卷积,所以yk[n]可以看作是具有冲激响应Wu[n]的滤波器输出。所以X(k)就等于yk(n)|n = N-1。X(k)是滤波器Hk(z)在时间n = N-1时的输出。对yk(n) = x(n)Wu(n)两边做z变换。得到Yk(z) = X(z)(1/1-W),那么第k个goertzel滤波器的传递函数就是Hk(z)。

此滤波器有一个极点位于频率Wk = 2pik/N的单位圆上,所以可以用上面的式子定义的N个滤波器组成平行组合,对输入的数据块进行滤波,计算出整个DFT,其中每一个滤波器有一个位于DFT的相应频率上的极点。因此goertzel算法计算出N个DFT系数,所以参数N必须选择得能保证X(k)上靠近DTMF频率fk,这可以通过选择N满足下列关系实现:

fk/fs = k/N

滤波器的递推部分位于延迟元件的左边。而非递推部分则位于延迟软件的右边。用直接2型实现,因为只是在时间N-1时需要输出量yk(n),所以我们只是在第(N-1)次的迭代中,才需要计算滤波器的非递推部分。

递推部分已经知道,X(k) = Wk(N-1) - Exp*W(N-2).

对于音调检测,只有X(k)的幅值平方是需要的。

你可能感兴趣的:(matlab,算法,递归,数据,fft)