当前位置:   article > 正文

「数字信号处理」MATLAB设计 双音多频拨号系统_matlab goertzel函数

matlab goertzel函数

前言

实验目的:用Matlab模拟实现双音多频拨号系统

输入:一串数字模拟电话号码

输出:检测出的电话号码

Matlab版本:2021b

系统:MacOS

实验方法:查表法+戈泽尔函数

实验大意 

任意一个数字可以表示为两个余弦信号的相加,因此我们这里将接收到的电话号码首先需要转化为这样的时域序列。转化规则如下

 

将时域序列x[n]作为goertzel函数的输入,返回值是该离散时域序列对应的离散傅里叶变换。

从表格中可以看出,我们共有8种频率,因此我们定义数组k为当采样点个数N=205个时,每个频率对应于第几个采样点。我们检测这8个采样点,观察他们的幅度,幅度最大的两个采样点对应的频率即为当前输入的数字对应表格中的频率。这样,我们就能检测出当前接收到的数字是几。由于电话信号的典型采样频率为8kHz,这里Ts(抽样周期)就为 1/8000s。


两个关键问题:

  1. 为什么选择8000Hz作为采样频率,为什么这个采样频率可行
  2. 为什么采样点个数为205

1. 要检测的信号频率范围是697 ~ 1633Hz,但考虑到存在语音干扰,除了检测这8个频率外,还要检测它们的二次倍频的幅度大小,波形正常且干扰小的正弦波的二次倍频是很小的,如果发现二次谐波很大,则不能确定这是DTMF信号。这样频谱分析的频率范围为697 ~ 3266Hz。按照采样定理,采样频率应该大于2倍的最大频率,即6532Hz。因此这里选择8000Hz作为采样频率,符合要求。

2. DFT的采样频率为 ωk=2πkN(k=0,1,2...N1) 

相应的模拟域的采样点频率为fk=FskN(k=0,1,2...N1)

我们希望选择一个合适的N,使用该公式算出的fk能接近要检测的频率,或者用8个频率中的任一个频率代入公式中时,得到的k值最接近整数值,这样虽然用幅度最大点检测的频率有误差,但仍可以准确判断所对应的DTMF频率,进而准确判断所对应的数字或者符号。经过不同数值N的测试后得出结论,N=205时,结果最好。

MATLAB实现代码

  1. % Low Frequency
  2. f1 = 697;
  3. f2 = 770;
  4. f3 = 852;
  5. f4 = 941;
  6. % High Frequency
  7. F1 = 1209;
  8. F2 = 1336;
  9. F3 = 1477;
  10. F4 = 1633;
  11. N = 205; % The quantity of sampling points
  12. Fs = 8000; % Sampling Frequency
  13. T = 1/Fs; % Sampling Period
  14. t = [0:N-1]*T; % t = n*T
  15. % The table for look up
  16. k1 = cos(2*pi*f1*t) + cos(2*pi*F1*t);
  17. k2 = cos(2*pi*f1*t) + cos(2*pi*F2*t);
  18. k3 = cos(2*pi*f1*t) + cos(2*pi*F3*t);
  19. ka = cos(2*pi*f1*t) + cos(2*pi*F4*t);
  20. k4 = cos(2*pi*f2*t) + cos(2*pi*F1*t);
  21. k5 = cos(2*pi*f2*t) + cos(2*pi*F2*t);
  22. k6 = cos(2*pi*f2*t) + cos(2*pi*F3*t);
  23. kb = cos(2*pi*f2*t) + cos(2*pi*F4*t);
  24. k7 = cos(2*pi*f3*t) + cos(2*pi*F1*t);
  25. k8 = cos(2*pi*f3*t) + cos(2*pi*F2*t);
  26. k9 = cos(2*pi*f3*t) + cos(2*pi*F3*t);
  27. kc = cos(2*pi*f3*t) + cos(2*pi*F4*t);
  28. km = cos(2*pi*f4*t) + cos(2*pi*F1*t); % *
  29. k0 = cos(2*pi*f4*t) + cos(2*pi*F2*t);
  30. kj = cos(2*pi*f4*t) + cos(2*pi*F3*t); % #
  31. kd = cos(2*pi*f4*t) + cos(2*pi*F4*t);
  32. % 4*4 matrix monitoring the table
  33. key=['1','2','3','a';
  34. '4','5','6','b';
  35. '7','8','9','c';
  36. '*','0','#','d'];
  37. k=[18,20,22,24,31,34,38,42]; % the points corrsponding 8 frequencies
  38. %-----------------------pre process----------------------------------------
  39. num = input('please enter the key:','s'); % input as a string
  40. num = num - '0'; % minus the offset (ascii)
  41. len = length(num); % the length of the input telephone number
  42. disp('The number of the key is: ');
  43. disp(len); % display the length
  44. number = zeros(len, length(t)); % len * length(t) zero matrix
  45. for i = 1:len % for every number in input
  46. switch num(i) % Look-up table method
  47. case 1
  48. number(i,1:N) = k1;
  49. case 2
  50. number(i,1:N) = k2;
  51. case 3
  52. number(i,1:N) = k3;
  53. case 4
  54. number(i,1:N) = k4;
  55. case 5
  56. number(i,1:N) = k5;
  57. case 6
  58. number(i,1:N) = k6;
  59. case 7
  60. number(i,1:N) = k7;
  61. case 8
  62. number(i,1:N) = k8;
  63. case 9
  64. number(i,1:N) = k9;
  65. case 0
  66. number(i,1:N) = k0;
  67. case 49
  68. number(i,1:N) = ka;
  69. case 50
  70. number(i,1:N) = kb;
  71. case 51
  72. number(i,1:N) = kc;
  73. case 52
  74. number(i,1:N) = kd;
  75. case -6 % number is *
  76. number(i,1:N) = km;
  77. case -13 % number is #
  78. number(i,1:N) = kj;
  79. otherwise
  80. error('The key is not right!');
  81. end
  82. end
  83. disp('The key is: ');
  84. for i = 1:len
  85. dft = goertzel(number(i,1:N), k+1); % return Discrete Fourier Transform
  86. figure;
  87. x = [697, 770, 852, 941, 1209, 1336, 1477, 1633]; % The 8 frequency magnitude
  88. stem(x, abs(dft), '.');
  89. xlabel('Hz');
  90. title('Frequency Spectrum');
  91. idx = find(abs(dft) > 50); % find the frequency where dft is not zero
  92. disp(key(idx(1), idx(2) - 4));
  93. end
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/315199
推荐阅读
相关标签
  

闽ICP备14008679号