DTMF信号以其实用,简单,安全,高效的优点而应用在各行各业。比如,电话键的声音为什么0123456789是不同的。原因是因为不同的键在不同的行列,不同的行列有不同的频率。每次按一个键,行列交叉产生一个由两个正弦波合成的信号。一个正弦信号我们称为单音,两个就已经是和弦了。称得是上乐音的基础了。我们知道DTMF信号一般对应的键盘布局如图1:(常常我们只使用12键。这里不再就其原因赘述,因为不懂。)
这里我们简单列举一个信号9的行频图形,列频图形,以及它的合成图形。因为9比较特殊一些,这里我们先就9为什么特殊做以简单说明:
以下说明凭记忆转载,有错难免。
我们知道9宫图是这样排列的:
随便你取横行竖列3个数的任意排列相乘,比如:
294 * 753 = 221382;2+2+1+3+8+2=18;1+8=9;
一个不足以说明问题:再来:
168 * 438 = 73584;7+3+5+8+4=27;2+7=9;
两个也可能是巧合:
159 * 294 = 46746;4+6+7+4+6=27;2+7=9;
三个也许还是偶然,不过我们有理由相信任意行列包括斜行斜列,这样做下去终会得到9.
就像我们证不出为什么哥德巴赫猜想的最后一步,但不能妨碍我们相信此猜想的正确性。同样的道理也可以应用到九宫图最终得9.毕竟99归一,许多问题,我们不必去太想。
闲话少说,言归正传:
9对应行频为852hz,列频为1477hz。
行正弦波852hz:
列正弦波1477hz:
合成信号为:
以上各波形图下标为matlab画图时用离散的序列点的原故,可以乘以采样间隔1/8000s,这样256序号对应的时刻为0.032s,即32ms,这样就与实际接近一些,不会很离谱了。
你打开手机键盘音,按一下9,你就可以听到9的波形图了。
当我们应用gertzel算法最后算出其频谱为:
这里的下标我们是故意设在八个频点上,这八个频点的由来是这样的:把8000hz,256份,每份大约为31.25hz,这样852hz/31.25hz约为27.264。实际上数字频率范围为( -pi~pi ),其原生态的数字频谱应该是这样的:
书上说我们只用关心正数字频率(0 ~ pi )范围内的数据就够了,负频率没有意义。其实不然,正数是怎么来的,或者更具体一点余弦函数是怎么来的。
带有虚数的指数是复数,复数是实数的上级,不是负频率没意义,是我们还不太理解。
接下来,我们要问,原生态的频率怎么对应到实际频率852hz,1477hz呢?
只需乘以( 8000 / ( 2 * pi ) )= 1273 ,因为采样频率是8000hz,它被压缩在2 * pi范围内,这样一个单位弧度的频谱就代表着( 8000 / ( 2 * pi ) )= 1273hz.。我们找到幅度值超过80的点的下标为:
-1.1290 -0.6381 0.6872 1.1781
我们因为不了解,所以只关心正频率范围内的0.6872, 1.1781,都乘以1273hz,等于
874, 1499.
非常遗憾,没能准确到852与1477频率处。这一方面是由于运算时采取了四舍五入,另一方面也是由于采的只有256个点,更重要是由于理想只能接近。据说理想是不能实现的,实现的理想往往变了样。
至此,我们已经将理论部分进行部分说明。
以下我们就gertzel算法来加以说明:
首先我们需要明确gertzel算法与fft有什么不同。实质上他们都是一样的,但表现形式上是这样的:
FFT算法需要等到所有数据都采集完成,才能进行运算,并且最终会产生与采样点数目一样的频谱值。
而gertzel算法是来一个点算一个点,每大N(采样点数)次算一次指定频率的频谱值,也就是它最终只产生指定数目的频谱值。好处就是节省空间。
两者比较,我们会发现后者能更好的利用硬件资源。
那为什么gertzel是来一次算一次,而不像fft那样等数据采集完了算一次,这个我们有必要用公式去说明。公式的好处就是标准,言语总是有许多歧义,甚至多余。
首先们知道fft是快速傅里叶变换,它的实质是DFT,即离散傅里叶变换。离散傅里叶变换是可以通过定义来算的。在采样点比较少的时候,你用DFT的定义去算频谱,计算机是可以接受的,当采样点高到一定数目时,你的内存因为不够,计算机就不乐意算了,即使够,你也得等很长时间才出结果。通用计算机尚且如此,如果你用单片机或者其它嵌入式芯片去做的话,你就无法保证实时性。就好比泰坦尼克号要撞冰山,明明都看见,还要撞,就是因为实时性不够。
有了上面的说明,我们首先就知道fft是为了让DFT更快的算出来。它们俩本质上是一样的。不能说是替身关系。应该说是为了去一个地方,你可以选择步行,或者坐飞机。现代社会节奏这么快,恨不能时空穿梭。接下来我们就用DFT定义来说明gertzel的算术步骤。
N点数据序列的DFT为:
芯片当然可以做复位运算,但是两个实数相乘,我们乘一次就够了。而两个复位,我们则需实部与实部相乘,虚部与虚部相乘,实部与虚部相乘,虚部与实部相乘,数一下,1234,太麻烦了。我们站在滤波器的角度讲就会说,这个片子太差劲了。相反,我们站在片子的角度讲,这个滤波器不好。如何解决它们之间的矛盾,这是我们将要解决的问题。
这个问题书上是这么解决的,单极点滤波器只有一个极点,如果我们加一个极点,式子会变了。但是它变不变不要紧。我们关心的是它的输出还会是我们想要的X(k)吗?会的,当然会的,别人已经用实验替我们回答了。加了一个共轭极点之后我们的双极点滤波器可以用两个差分方程来实现。如下:
最后的平方是没有的,我们是对的,ti给的文档是错的。
图片太多,附讨论内容WORD格式文档。
希望大家多多交流~~
[
本帖最后由 feman5012 于 2009-4-22 19:36 编辑 ]