function [t,v] = DTMF(digit, time, fs) % TONES '0' '1' '2' '3' '4' '5' '6' '7' '8' '9' 'a' 'b' 'c' 'd' '*' '#' low_tones = [ 941 697 697 697 770 770 770 852 852 852 697 770 852 941 941 941 ]; hi_tones = [ 1336 1209 1336 1477 1209 1336 1477 1209 1336 1477 1633 1633 1633 1633 1209 1477 ]; lfs = low_tones(digit+1) * 2*pi; hfs = hi_tones(digit+1) * 2*pi; t = 0:1/fs:time-1/fs; v = (sin(lfs*t) + sin(hfs*t)) / 2; end function lab1 % % Generacja tonów DTMF % [t1_8k, d1_8k] = DTMF(1, 1, 8000); [t1_8k, d5_8k] = DTMF(5, 1, 8000); [t1_8k, d9_8k] = DTMF(9, 1, 8000); [t1_8k, dD_8k] = DTMF(13, 1, 8000); d15_8k = (d1_8k + d5_8k) / 2; d159_8k = (d1_8k + d5_8k + d9_8k) / 3; d159D_8k = (d1_8k + d5_8k + d9_8k + dD_8k) / 4; [t1_44k, d1_44k] = DTMF(1, 1, 44100); [t1_44k, d5_44k] = DTMF(5, 1, 44100); [t1_44k, d9_44k] = DTMF(9, 1, 44100); [t1_44k, dD_44k] = DTMF(13, 1, 44100); d15_44k = (d1_44k + d5_44k) / 2; d159_44k = (d1_44k + d5_44k + d9_44k) / 3; d159D_44k = (d1_44k + d5_44k + d9_44k + dD_44k) / 4; dtmf_snd = { d1_8k, d15_8k, d159_8k, d159D_8k; d1_44k, d15_44k, d159_44k, d159D_44k }; TV = [ 0.00 0.01 -1.4 1.4 ]; % % Wizualizacja sygnałów DTMF % for i = 1 : 1 : size(dtmf_snd,2) figure(2*i - 1); stairs(t1_8k(1:0.01*8000),dtmf_snd{1,i}(1:0.01*8000)), axis([0 0.01 -1.3 1.3]); xlabel('Time (s)'); ylabel('Voltage (V)'); figure(2*i); stairs(t1_44k(1:0.01*44100),dtmf_snd{2,i}(1:0.01*44100),'Color',[0 0.8 0]), axis(TV); xlabel('Time (s)'); ylabel('Voltage (V)'); end % % Detekcja tonów DTMF algorytmem Goertzel'a wraz z wizualizacją % f = [697 770 852 941 1209 1336 1477 1633]; freq_indices = f + 1; for i = 1 : 1 : size(dtmf_snd,2) dft_data = goertzel(dtmf_snd{1,i},freq_indices); figure(10 + (i-1)); stem(f,abs(dft_data)), axis([600 1700 0 inf]);xlabel('Frequency (Hz)'); ylabel('DFT Magnitude'); end % % Interpolacja metodami 'linear'(1), 'pchip'(2), 'spline'(3) próbek DTMF % 8kHz -> 44.1kHz wraz z wizualizacją % dtmf_int = cell(3, size(dtmf_snd,2)); for i = 1 : 1 : size(dtmf_int,2) dtmf_int{1,i} = interp1(t1_8k, dtmf_snd{1,i}, t1_44k, 'linear'); dtmf_int{2,i} = interp1(t1_8k, dtmf_snd{1,i}, t1_44k, 'pchip'); dtmf_int{3,i} = interp1(t1_8k, dtmf_snd{1,i}, t1_44k, 'spline'); for j = 1 : 1 : size(dtmf_int,1) figure(20 + (j-1) + 3*(i-1)); stairs(t1_44k(1:0.01*44100),dtmf_int{j,i}(1:0.01*44100),'Color','red'), axis(TV); xlabel('Time (s)'); ylabel('Voltage (V)'); end end % % Obliczenie wartości błędu średniokwadratowego uzyskanych interpolacji % metodą 'linear'(1), 'pchip'(2), 'spline'(3) wraz tabelaryzacją % mse_int = cell(size(dtmf_int)); for i = 1 : 1 : size(mse_int,2) for j = 1 : 1 : size(mse_int,1) mse_int{j,i} = sqrt(mean((dtmf_snd{2,i}(1:44095) - dtmf_int{j,i}(1:44095)).^2)); end end T1 = cell2table(mse_int,'VariableNames',{'DTMF1' 'DTMF15' 'DTMF159' 'DTMF159D'},'RowNames',{'linear' 'pchip' 'spline'}) % % Dodanie do próbek DTMF białego szumu gaussowskiego % dtmf_nse = cell(size(dtmf_snd)); for i = 1 : 1 : size(dtmf_nse,2) dtmf_nse{2,i} = awgn(dtmf_snd{2,i}, 10, 'measured'); dtmf_nse{1,i} = interp1(t1_44k, dtmf_nse{2,i}, t1_8k, 'nearest'); figure(40 + 2*(i-1)); stairs(t1_8k(1:0.01*8000),dtmf_nse{1,i}(1:0.01*8000)), axis([0 0.01 -1.3 1.3]); xlabel('Time (s)'); ylabel('Voltage (V)'); figure(40+ 2*(i-1) + 1); stairs(t1_44k(1:0.01*44100),dtmf_nse{2,i}(1:0.01*44100),'Color',[0.6 0.6 0.6]), axis(TV); xlabel('Time (s)'); ylabel('Voltage (V)'); end % % Interpolacja metodami 'linear'(1), 'pchip'(2), 'spline'(3) próbek DTMF % z dodanym białym szymem gaussowskim 8kHz -> 44.1kHz wraz z wizualizacją % dtmf_nsi = cell(3, size(dtmf_nse,2)); for i = 1 : 1 : size(dtmf_nsi,2) dtmf_nsi{1,i} = interp1(t1_8k, dtmf_nse{1,i}, t1_44k, 'linear'); dtmf_nsi{2,i} = interp1(t1_8k, dtmf_nse{1,i}, t1_44k, 'pchip'); dtmf_nsi{3,i} = interp1(t1_8k, dtmf_nse{1,i}, t1_44k, 'spline'); for j = 1 : 1 : size(dtmf_nsi,1) figure(50 + (j-1) + 3*(i-1)); stairs(t1_44k(1:0.01*44100),dtmf_nsi{j,i}(1:0.01*44100),'Color','red'), axis(TV); xlabel('Time (s)');ylabel('Voltage (V)'); end end % % Obliczenie wartości błędu średniokwadratowego uzyskanych interpolacji % metodą 'linear'(1), 'pchip'(2), 'spline'(3) dla próbek zawierających szum % wraz tabelaryzacją % mse_nsi = cell(size(dtmf_nsi)); mse_nse = cell(size(dtmf_nsi)); for i = 1 : 1 : size(dtmf_nsi,2) for j = 1 : 1 : size(dtmf_nsi,1) mse_nsi{j,i} = sqrt(mean((dtmf_snd{2,i}(1:44095) - dtmf_nsi{j,i}(1:44095)).^2)); mse_nse{j,i} = sqrt(mean((dtmf_nse{2,i}(1:44095) - dtmf_nsi{j,i}(1:44095)).^2)); end end T2 = cell2table(mse_nsi,'VariableNames',{'DTMF1' 'DTMF15' 'DTMF159' 'DTMF159D'},'RowNames',{'linear' 'pchip' 'spline'}) T3 = cell2table(mse_nse,'VariableNames',{'DTMF1' 'DTMF15' 'DTMF159' 'DTMF159D'},'RowNames',{'linear' 'pchip' 'spline'}) % % Obliczenie wartości SNR dla uzyskanych interpolacji metodą 'linear'(1), % 'pchip'(2), 'spline'(3) z próbek zawierających szum względem "czystego" % sygnału wraz tabelaryzacją % snr_nsi = cell(size(dtmf_nsi)); for i = 1 : 1 : size(dtmf_nsi,2) for j = 1 : 1 : size(dtmf_nsi,1) snr_nsi{j,i} = snr(dtmf_snd{2,i}(1:44095), dtmf_snd{2,i}(1:44095) - dtmf_nsi{j,i}(1:44095)); end end T4 = cell2table(snr_nsi,'VariableNames',{'DTMF1' 'DTMF15' 'DTMF159' 'DTMF159D'},'RowNames',{'linear' 'pchip' 'spline'}) % sound(dtmf_snd{1,1}, 8000); % pause(2); % sound(dtmf_int{1,1}, 44100); % pause(2); % sound(dtmf_int{2,1}, 44100); % pause(2); % sound(dtmf_int{3,1}, 44100); % pause(2); % sound(dtmf_snd{2,1}, 44100); end