Files

copied

There are no circuits or boards in this repository.

Last update 4 years 6 months by Hugo R. Rocha
Files
FINAL.m
README.md
filtro passa baixa.pdsprj
FINAL.m
%--------------- Universidade Federal de Itajubá ---------------% % - Alisson Gomes Cerqueira RA: 34410 % % - Bruno Lacerda Costa da Rocha RA: 33862 % % - Davi Moreira Silva RA: 33541 % % - Juarez de Paula Sena Junior RA: 34398 % % - Walter Soares Junior RA: 34167 % % ------------------------------------------------------------- % % Trabalho: Análise do sinal DTMF % % EELI39 - Manutenção Elétrica - T01 % % ------------------------------------------------------------- % clc; clear; close all % -------------------- Entrada do algoritmo ------------------- % tempo_gravacao = 1; % [segundos] disp('--------------------- Algoritmo DTMF ----------------------') disp(' ') % Gravando: audirecorder(Freq. de amostragem, Bits por amostra, numero de canais) Freq_Amostragem = 10000; recObj = audiorecorder(Freq_Amostragem, 16, 2); fprintf('O sinal está sendo gravado... \n- Tempo de gravação: %d segundos', tempo_gravacao) disp(' ') disp(' ') recordblocking(recObj, tempo_gravacao); disp('Final de gravação.'); dados_input = getaudiodata(recObj); disp('-----------------------------------------------------------') % ------------------ Processamento do sinal ------------------- % % Determinando o número de amostras do sinal: tempo_amostras = 1; % Delimitando o tempo para obter a amostra de 1s; numero_amostras = length(dados_input); vetor_amostras = [1:1:numero_amostras]; % Determinar intervalo entre as amostras intervalo_amostras = tempo_gravacao / numero_amostras; numero_pontos_sinal = tempo_amostras/intervalo_amostras; % Construção de vetores para auxílio no processamento: % Ajuste de largura de banda: Ao inicio da largura de banda do sinal foi % arredondado para cima,enquanto que no final foi arredondado para baixo. ref_vet_sinal_aprox_1 = numero_pontos_sinal; % Determina a largura de banda do sinal ref_vet_sinal_1 = fix(ref_vet_sinal_aprox_1); % Delimita para o valor inteiro inferior Pontos_Sinal_1 = dados_input(1:ref_vet_sinal_1); % Gera um vetor correspondente ao sinal respeitando as coordenadas delimitadas vet_posicao_sinal_1 = [1:1:ref_vet_sinal_1]; % Vetor de posições para os pontos do sinal % ------------- Construção do algoritmo de DTMF ------------- % k_1 = [1:1:length(Pontos_Sinal_1)]; n_1 = [1:1:length(Pontos_Sinal_1)]; disp('Algoritmo em processamento...') for Amostra_Amp_1 = k_1 Vetor_Amostra_1 = Pontos_Sinal_1.*exp((-1i*2*deg2rad(180).*Amostra_Amp_1.*n_1)/length(Pontos_Sinal_1)); X_1(Amostra_Amp_1 + 1) = sum(Vetor_Amostra_1); end % Obter magnitude e fase de cada frequência % Retorna um vetor com as magnitudes para cada ponto Mag_X_1 = sqrt(real(X_1).^2 + imag(X_1).^2); % Retorna um vetor com as fases para cada ponto em radiano Phase_X_1 = atan(imag(X_1)./real(X_1)); % Por causa do critério de Nyquist, o numero de amostras tem de ser % dividido por dois Mag_X_corrigido_nyquist_1 = 2*Mag_X_1(1:length(Pontos_Sinal_1)); Phase_X_corrigido_nyquist_1 = 2*Phase_X_1(1:length(Pontos_Sinal_1)); % Para obter a amplitude do sinal, tem de dividir a magnitude % corrigida pelo critério de nyquist pelo número de amostras Amplitude_1 = Mag_X_corrigido_nyquist_1/length(Pontos_Sinal_1); X_corrigido_nyquist_1 = (2*X_1(1:floor((length(X_1)/2)))/length(Pontos_Sinal_1)); Real_X_corrigido_nyquist_1 = real(X_corrigido_nyquist_1); Imag_X_corrigido_nyquist_1 = imag(X_corrigido_nyquist_1); phase_X_corrigido_nyquist_1 = angle(X_corrigido_nyquist_1); % ------------- Apresentação gráfica do algoritmo ------------- % figure(1) subplot(2,1,2) Aux_1 = (Freq_Amostragem)/length(Amplitude_1); Eixo_y_1 = [1:Aux_1:Freq_Amostragem]; bar(Eixo_y_1,Amplitude_1,0.1) title('Magnitude do sinal após análise') xlabel('Frequência');ylabel('Magnitude'); xlim([500 2000]) figure(1); subplot(2,1,1) plot(dados_input); title('Sinal sonoro obtido') xlabel('Tempo');ylabel('Magnitude'); % ------------- Encontrando os valore na tabela ------------- % % Identificar as frequências do sinal % Para verificar o sinal e realizar as devidas comparações com a tabela de % DTMF, foi fragmentado o mesmo em dois intervalos de frequência. % Análise da primeira parte do sinal: auxiliar_02 =1; while auxiliar_02 < 2 mega = max(Amplitude_1(1,500:1000)); % Encontra o maior valor no vetor - parte I for Percorre = [1:1:1000] % Percorrendo todo o vetor para encontrar a frequência desejada if Amplitude_1(Percorre) == mega Maiores_Valores_1(1) = Eixo_y_1(Percorre); end end auxiliar_02 = auxiliar_02 + 1; end % Análise da segunda parte do sinal: auxiliar_02 =1; while auxiliar_02 < 2 mega = max(Amplitude_1(1,1000:1477)); % Encontra o maior elemento na 2º parte for Percorre = [1000:1:1477] if Amplitude_1(Percorre) == mega Maiores_Valores_1(2) = Eixo_y_1(Percorre); end end auxiliar_02 = auxiliar_02 + 1; end % Matriz de DTMF % Salienta-se que a matriz não possui os números A,B e C. Freq_Busca_Y = [697 770 852 941]; Freq_Busca_X = [1209 1336 1477 1633]; Matriz_Retorno = [1 2 3 0; 4 5 6 0; 7 8 9 0; 0, 0, 0, 0]; % Comparação dos elementos encontrados com a matriz DTMF for x = [1:1:length(Freq_Busca_Y)] % Encontrando a maior frequência if (abs((Freq_Busca_Y(x)- Maiores_Valores_1(1))) < 50) Freq_menor_1 = Freq_Busca_Y(x); end % Encontrando a menor frequência if (abs((Freq_Busca_X(x)- Maiores_Valores_1(2))) < 50) Freq_maior_1 = Freq_Busca_X(x); end end % ------------- Apresentação do resultado final ------------- % Linha_1 = find(Freq_Busca_Y == Freq_menor_1); Coluna_1 = find(Freq_Busca_X == Freq_maior_1); disp('-----------------------------------------------------------') Resultado_final = Matriz_Retorno(Linha_1,Coluna_1); fprintf('O resultado final é: %d', Resultado_final) disp(' ') disp('------------------------ FIM ------------------------------')
Report a bug