矿石收音机论坛

 找回密码
 加入会员

QQ登录

只需一步,快速开始

搜索
查看: 2261|回复: 14

为啥 DTMF 双音拨号识别,用DFT比FFT好?

[复制链接]
     
发表于 2024-6-6 14:58:56 | 显示全部楼层 |阅读模式
本来用 FFT 来解析的,能读,但有错误,准确度不高
网上说 DTMF 要用 DFT,有大佬了解吗

FFT 不是比 DFT 高效吗?
发表于 2024-6-6 15:05:04 | 显示全部楼层
回复 支持 1 反对 0

使用道具 举报

     
发表于 2024-6-6 15:14:41 | 显示全部楼层
本帖最后由 luosifu 于 2024-6-6 15:21 编辑

自己删除了我回复的内容,懒得去翻书了,没有依据的回复容易误导各位
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2024-6-6 15:19:35 | 显示全部楼层
luosifu 发表于 2024-6-6 15:14
我想瞎说的楼上坛友已经找到了,因为双音频的那几个频率是已知且固定的,DFT可以只针对这几个频率去计算。 ...


能用,就绘制图形能用,单看数值结果上看不出规律
都忽高忽低的= =# 也不知道啥问题
回复 支持 反对

使用道具 举报

     
发表于 2024-6-6 16:12:45 | 显示全部楼层
本帖最后由 MF35_ 于 2024-6-6 16:15 编辑

2楼已经给了答案了,除了频谱仪外,很多涉及到频域分析的仪器,典型的比如阻抗(复数)测试仪,都用DFT而不是FFT,就是因为频率已知的前提下,DFT的计算是非常简单的,只需要一个正弦表和一个余弦表而已

固定单频点的DFT算法还有有其他的名字,数字相干检波、数字鉴相、数字锁相检波等等,其实都一回事,本质上就是用余弦表和正弦表做两次加权积分,或者说加权平均抽取,都是一个概念

评分

1

查看全部评分

回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2024-6-6 22:30:46 | 显示全部楼层
Image 006.jpg
DFT没写出来,FFT倒是又可以了
回复 支持 反对

使用道具 举报

发表于 2024-6-8 20:41:13 来自手机 | 显示全部楼层
看你用什麼機器 如果8位機用FFT會受不了,因為無法實時解碼
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2024-6-8 21:11:06 | 显示全部楼层
xiaolaba 发表于 2024-6-8 20:41
看你用什麼機器 如果8位機用FFT會受不了,因為無法實時解碼

air001 Cortex-M0
回复 支持 反对

使用道具 举报

发表于 2024-6-8 21:29:56 来自手机 | 显示全部楼层
JuncoJet 发表于 2024-6-8 21:11
air001 Cortex-M0

要用1bit adc(比較器)的話可以用dft試試看,就一sin表 然後移相90度參個cos表
如果實時要求就看看Goertzel algorithm ,比dft更有效,8位機都行那arm更是輕鬆
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2024-6-9 00:47:57 | 显示全部楼层
xiaolaba 发表于 2024-6-8 21:29
要用1bit adc(比較器)的話可以用dft試試看,就一sin表 然後移相90度參個cos表
如果實時要求就看看Goer ...


用的 Arduino Goertzel 库,
参考 fsk 的例子做双音识别,失败

  1. #define A1 PA6
  2. // Define the ADC midpoint (512 is the default)
  3. #define ADC_MIDPOINT 512
  4. // Define the sample rate (8800 S/s is the default for 16 MHz Boards)
  5. #define SAMPLE_RATE 8800
  6. // include the Goertzel library
  7. #include <Goertzel.h>
  8. // Array buffer for ADC samples
  9. int Samples[100];
  10. // Variable for resulting magnitude
  11. float Mag;
  12. // Instantiate class for 440 Hz tone detection
  13. Goertzel f1(697);
  14. Goertzel f2(770);
  15. Goertzel f3(852);
  16. Goertzel f4(941);
  17. Goertzel f5(1209);
  18. Goertzel f6(1336);
  19. Goertzel f7(1477);
  20. void setup() {
  21.   Serial.begin(115200);
  22. }
  23. void loop() {
  24.   int DEPTH = sizeof(Samples) / sizeof(Samples[0]);
  25.   // Get 100 ADC samples from A1 and store them in the buffer
  26.   for (int n = 0; n < DEPTH; n++) {
  27.     Samples[n] = analogRead(A1);
  28.   }
  29.   // Determine the amount of Samples
  30.   char str[]="Num:  ",num=0;
  31.   float r1,r2,r3,r4,r5,r6,r7;
  32.   r1 = f1.Mag(Samples, DEPTH);
  33.   r2 = f2.Mag(Samples, DEPTH);
  34.   r3 = f3.Mag(Samples, DEPTH);
  35.   r4 = f4.Mag(Samples, DEPTH);
  36.   r5 = f5.Mag(Samples, DEPTH);
  37.   r6 = f6.Mag(Samples, DEPTH);
  38.   r7 = f7.Mag(Samples, DEPTH);
  39.   if(r5>r1>0){
  40.     num='1';
  41.   }else if(r6>r1>0){
  42.     num='2';
  43.   }else if(r7>r1>0){
  44.     num='3';
  45.   }else if(r5>r2>0){
  46.     num='4';
  47.   }else if(r6>r2>0){
  48.     num='5';
  49.   }else if(r7>r2>0){
  50.     num='6';
  51.   }else if(r5>r3>0){
  52.     num='7';
  53.   }else if(r6>r3>0){
  54.     num='8';
  55.   }else if(r7>r3>0){
  56.     num='9';
  57.   }else if(r5>r4>0){
  58.     num='*';
  59.   }else if(r6>r4>0){
  60.     num='0';
  61.   }else if(r7>r4>0){
  62.     num='#';
  63.   }
  64.   str[sizeof(str)-2]=num;
  65.   // print result to serial
  66.   Serial.println(str);
  67. }
复制代码
回复 支持 反对

使用道具 举报

     
发表于 2024-6-9 05:47:08 | 显示全部楼层
在采样频率和被测频率不是整数倍的时候,FFT有个频谱泄露问题很麻烦,有改善的办法但无法完全避免
回复 支持 反对

使用道具 举报

     
发表于 2024-6-9 13:31:48 来自手机 | 显示全部楼层
用MT8870芯片硬件译码很简单
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2024-6-9 14:16:43 | 显示全部楼层
快乐毛毛虫 发表于 2024-6-9 13:31
用MT8870芯片硬件译码很简单


自己主要是为了学习原理,乐趣
软解也能通用的解决很多类似的问题
回复 支持 反对

使用道具 举报

     
发表于 2024-6-9 21:37:35 | 显示全部楼层
20多年前,我用MT8870做电话遥控装置,用MT8880做自动拨打电话卡号和密码的自动拨号器,打IP电话省事多了。
回复 支持 反对

使用道具 举报

发表于 2024-6-10 21:33:18 | 显示全部楼层
JuncoJet 发表于 2024-6-9 00:47
用的 Arduino Goertzel 库,
参考 fsk 的例子做双音识别,失败

叉回去參考看看
https://github.com/xiaolaba/ATmega-DTMF-Decoder
DFT也是可以的, 第一代PIC用過, 不過源碼找不到了.
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入会员

本版积分规则

小黑屋|手机版|矿石收音机 ( 蒙ICP备05000029号-1 )

蒙公网安备 15040402000005号

GMT+8, 2025-4-26 23:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表