Sistema de marcación multifrecuencia de doble tono con diseño de MATLAB "Procesamiento de señales digitales"

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:

  1. ¿Por qué elegir 8000 Hz como frecuencia de muestreo? ¿Por qué esta frecuencia de muestreo es factible?
  2. 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 \pequeño \omega _{k}=\frac{2\pi k}{N}\left ( k=0,1,2...N-1 \right ) 

La frecuencia del punto de muestreo del dominio analógico correspondiente es\small f_{k}=\frac{F_{s} k}{N}\left ( k=0,1,2...N-1 \right )

Esperamos elegir un N apropiado, \pequeña f_{k}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

Supongo que te gusta

Origin blog.csdn.net/m0_54689021/article/details/130157285
Recomendado
Clasificación