prefacio
El propósito del experimento: usar Matlab para simular la realización del sistema de marcación multifrecuencia de dos tonos
Entrada: una cadena de números de teléfono analógicos digitales
Salida: números de teléfono detectados
Versión Matlab: 2021b
Sistema: Mac OS
Método experimental: método de tabla de consulta + función de Goerzel
La idea principal del experimento.
Cualquier número se puede expresar como la suma de dos señales de coseno, por lo que primero debemos convertir el número de teléfono recibido en una secuencia de dominio de tiempo. Las reglas de conversión son las siguientes
La secuencia en el dominio del tiempo x[n] se utiliza como entrada de la función de goertzel y el valor de retorno es la transformada de Fourier discreta correspondiente a la secuencia en el dominio del tiempo discreta.
En la tabla se puede ver que tenemos un total de 8 frecuencias, por lo que definimos el arreglo k como el punto de muestreo correspondiente a cada frecuencia cuando el número de puntos de muestreo es N=205. Detectamos estos 8 puntos de muestreo y observamos sus amplitudes.La frecuencia correspondiente a los dos puntos de muestreo con mayor amplitud es la frecuencia en la tabla correspondiente al número ingresado actualmente. De esta manera, podemos detectar qué número se recibe actualmente. Dado que la frecuencia de muestreo típica de la señal telefónica es de 8 kHz, aquí Ts (período de muestreo) es 1/8000 s.
Dos preguntas clave:
- ¿Por qué elegir 8000 Hz como frecuencia de muestreo? ¿Por qué esta frecuencia de muestreo es factible?
- Por qué el número de puntos de muestreo es 205
1. El rango de frecuencia de la señal a detectar es de 697 ~ 1633Hz, pero considerando la existencia de interferencia de voz, además de detectar estas 8 frecuencias, también es necesario detectar la amplitud de su segunda multiplicación de frecuencia, la onda sinusoidal con forma de onda normal y poca interferencia El segundo multiplicador es muy pequeño Si el segundo armónico resulta ser grande, no puede estar seguro de que sea una señal DTMF. De esta forma, el rango de frecuencia del análisis de espectro es de 697 ~ 3266 Hz. Según el teorema de muestreo, la frecuencia de muestreo debe ser mayor que el doble de la frecuencia máxima, que es 6532 Hz. Por lo tanto, aquí se selecciona 8000 Hz como la frecuencia de muestreo, que cumple con los requisitos.
2. La frecuencia de muestreo de DFT es
La frecuencia del punto de muestreo del dominio analógico correspondiente es
Esperamos elegir un N apropiado, la frecuencia calculada usando esta fórmula puede estar cerca de la frecuencia a detectar, o cuando cualquiera de las 8 frecuencias se sustituye en la fórmula, el valor de k obtenido es el más cercano al valor entero, de modo que aunque el punto con la amplitud más grande Hay un error en la frecuencia detectada, la frecuencia DTMF correspondiente aún se puede juzgar con precisión, y luego el número o símbolo correspondiente se puede juzgar con precisión. Después de probar con diferentes valores de N, se concluye que cuando N=205, el resultado es el mejor.
código de implementación de MATLAB
% Low Frequency
f1 = 697;
f2 = 770;
f3 = 852;
f4 = 941;
% High Frequency
F1 = 1209;
F2 = 1336;
F3 = 1477;
F4 = 1633;
N = 205; % The quantity of sampling points
Fs = 8000; % Sampling Frequency
T = 1/Fs; % Sampling Period
t = [0:N-1]*T; % t = n*T
% The table for look up
k1 = cos(2*pi*f1*t) + cos(2*pi*F1*t);
k2 = cos(2*pi*f1*t) + cos(2*pi*F2*t);
k3 = cos(2*pi*f1*t) + cos(2*pi*F3*t);
ka = cos(2*pi*f1*t) + cos(2*pi*F4*t);
k4 = cos(2*pi*f2*t) + cos(2*pi*F1*t);
k5 = cos(2*pi*f2*t) + cos(2*pi*F2*t);
k6 = cos(2*pi*f2*t) + cos(2*pi*F3*t);
kb = cos(2*pi*f2*t) + cos(2*pi*F4*t);
k7 = cos(2*pi*f3*t) + cos(2*pi*F1*t);
k8 = cos(2*pi*f3*t) + cos(2*pi*F2*t);
k9 = cos(2*pi*f3*t) + cos(2*pi*F3*t);
kc = cos(2*pi*f3*t) + cos(2*pi*F4*t);
km = cos(2*pi*f4*t) + cos(2*pi*F1*t); % *
k0 = cos(2*pi*f4*t) + cos(2*pi*F2*t);
kj = cos(2*pi*f4*t) + cos(2*pi*F3*t); % #
kd = cos(2*pi*f4*t) + cos(2*pi*F4*t);
% 4*4 matrix monitoring the table
key=['1','2','3','a';
'4','5','6','b';
'7','8','9','c';
'*','0','#','d'];
k=[18,20,22,24,31,34,38,42]; % the points corrsponding 8 frequencies
%-----------------------pre process----------------------------------------
num = input('please enter the key:','s'); % input as a string
num = num - '0'; % minus the offset (ascii)
len = length(num); % the length of the input telephone number
disp('The number of the key is: ');
disp(len); % display the length
number = zeros(len, length(t)); % len * length(t) zero matrix
for i = 1:len % for every number in input
switch num(i) % Look-up table method
case 1
number(i,1:N) = k1;
case 2
number(i,1:N) = k2;
case 3
number(i,1:N) = k3;
case 4
number(i,1:N) = k4;
case 5
number(i,1:N) = k5;
case 6
number(i,1:N) = k6;
case 7
number(i,1:N) = k7;
case 8
number(i,1:N) = k8;
case 9
number(i,1:N) = k9;
case 0
number(i,1:N) = k0;
case 49
number(i,1:N) = ka;
case 50
number(i,1:N) = kb;
case 51
number(i,1:N) = kc;
case 52
number(i,1:N) = kd;
case -6 % number is *
number(i,1:N) = km;
case -13 % number is #
number(i,1:N) = kj;
otherwise
error('The key is not right!');
end
end
disp('The key is: ');
for i = 1:len
dft = goertzel(number(i,1:N), k+1); % return Discrete Fourier Transform
figure;
x = [697, 770, 852, 941, 1209, 1336, 1477, 1633]; % The 8 frequency magnitude
stem(x, abs(dft), '.');
xlabel('Hz');
title('Frequency Spectrum');
idx = find(abs(dft) > 50); % find the frequency where dft is not zero
disp(key(idx(1), idx(2) - 4));
end