WOJSKOWA AKADEMIA TECHNICZNA LABORATORIUM CYFROWEGO PRZETWARZANIA SYGNAAÓW SPRAWOZDANIE Z PRACY LABORATORYJNEJ NR 3 TEMAT: Analiza widmowa sygnałów okresowych dyskretnych. Dyskretna transformata Fouriera sygnału dzwiękowego. PROWADZCY: dr inż. Leszek Grad WYKONUJCY: Joanna Rutkowska GRUPA: I9G2S1 Ćwiczenie obejmuje: wykonanie zadanej operacji typu filtracyjnego na widmie sygnału dzwiękowego (LP, HP); zmianę częstotliwości próbkowania sygnału dzwiękowego z wykorzystaniem DFT. Podzielone zostało na poszczególne zadania. Wszystkie zadania do realizacji w formie skryptów w Matlabie. Początkowy kod programu przedstawia się następująco: [signal,fs] = wavread('dzwiek.wav'); sound(signal,fs); % odtworzenie sygnału dzwiękowego L = length(signal); % długość sygnału t = L / fs; skala_t = 1/fs:1/fs:L/fs; % miara czasowa sygnału skala_f = fs/L:fs/L:fs; % miara częstotliwościowa sygnału fftowa = fft(signal); % transformata fft na sygnale %% WYKRESY SYGNAAU I WIDMA figure(1); subplot(2,1,1); plot(skala_t, signal); title('Przebieg sygnału'); xlabel('Czas [s]'); ylabel('Amplituda'); axis tight; subplot(2,1,2); plot(skala_f,abs(fftowa),'red'); % transformata przedstawiona kolorem czerwonym title('Transformata fft sygnału'); xlabel('Częstotliwość [Hz]'); ylabel('Amplituda'); axis tight; Podstawowy sygnał został przedstawiony na następujących wykresach: Figura 1 Zadanie 1: Wykonać operację na widmie sygnału dzwiękowego polegającą na usunięciu (wyzerowaniu) z niego harmonicznych odpowiadających przedziałowi częstotliwości (filtr dolnoprzepustowy). Następnie wykonać transformatę odwrotną, odsłuchać dzwięk, porównać z oryginałem również wyświetlając przebieg czasowy oryginału i sygnału przetworzonego. Kod programu realizujący zadanie 1 przedstawia się następująco: %% FILTRACJA FILTREM DOLNOPRZEPUSTOWYM fc = 1200/fs; %przypisanie wartości fc(dla potrzeb zadania przyjmujemy ją sami) LP_fft = fftowa; %przypisanie fft na potrzeby filtru LP_fft( floor( fc * L ) + 2 : ceil( L * ( 1 - fc ) ) ) = 0; % wyzerowanie harmonicznych sygnału z przedziału LP_normal = ifft(LP_fft); %transformata ifft w celu odzyskania sygnału czasowego sound(LP_normal,fs); %odtworzenie sygnału po filtracji filtrem dolnoprzepustowym figure(2); subplot(2,1,1); plot(skala_t,LP_normal); title({'Przebieg czasowy sygnału'; 'po wykonaniu filtracji dolnoprzepustowej'}); xlabel('Czas [s]'); ylabel('Amplituda'); axis tight; subplot(2,1,2); plot(skala_f,abs(LP_fft),'red'); %transformata przedstawiona kolorem czerwonym title({'Transformata sygnału';'po wykonaniu filtracji dolnoprzepustowej'}); xlabel('Częstotliwość [Hz]'); ylabel('Amplituda'); axis tight; W ramach zadania otrzymano następujące wykresy: Figura 2 Zadanie 2: Powyższe czynności wykonać usuwając z widma elementy <0,fc> v (filtr górnoprzepustowy). Porównać wyniki obydwu operacji. Kod programu realizujący zadanie 2 przedstawia się następująco: %% FILTRACJA FILTREM GÓRNOPRZEPUSTOWYM fc2 = 1000/fs; %przypisanie wartości fc2(dla potrzeb zadania przyjmujemy ją sami) HP_fft = fftowa; %przypisanie fft na potrzeby filtru HP_fft( 2 : floor( fc2 * L ) + 2 ) = 0; % wyzerowanie harmonicznych sygnału z przedziału <2,fc2> HP_fft( ceil( L * ( 1 - fc2 ) ) : L ) = 0; % wyzerowanie harmonicznych sygnału z przedziału HP_normal = ifft(HP_fft); %transformata ifft w celu uzyskania sygnału czasowego sound(HP_normal,fs); %odtworzenie sygnału po filtracji filtrem górnoprzepustowym figure(3); subplot(2,1,1); plot(skala_t,HP_normal); title({'Przebieg czasowy sygnału';'po wykonaniu filtracji górnoprzepustowej'}); xlabel('Czas [s]'); ylabel('Amplituda'); axis tight; subplot(2,1,2); plot(skala_f,abs(HP_fft),'red'); %transformata przedstawiona kolorem czerwonym title({'Transformata sygnału';'po wykonaniu filtracji górnoprzepustowej'}); xlabel('Częstotliwość [Hz]'); ylabel('Amplituda'); axis tight; W ramach zadania otrzymano następujące wykresy: Figura 3 Wnioski z wykonania zadania 1 i zadnia 2: Zadanie polegało na wyzerowaniu próbek odpowiadających odpowiednim częstotliwościom podanym z zadaniach. Dla zadania 1 zerowane były próbki odpowiadające wysokim częstotliwościom dzwięku, przez co otrzymano ton dzwięku stał się niższy. Dla zadania 2 usunięte zostały tony niskie, zatem nowy dzwięk miał ton wyższy w porównaniu z oryginalnym. Pomimo modyfikacji, nowe dzwięki nadal były zrozumiałe i podobne brzmieniowe do oryginału. Zadanie 3: Korzystając z DFT zwiększyć częstotliwość próbkowania sygnału. W tym celu dokonać odsunięcia drugiej połowy widma tak, aby ostatni prążek znalazł się na pozycji nowej częstotliwości próbkowania. Powstałą lukę wypełnić zerami. Wykonać transformatę odwrotną. Zweryfikować otrzymane wyniki (np. poprzez wyświetlenie sygnałów sprzed i po operacji różnymi kolorami symboli na jednym wykresie). Kod programu realizujący zadanie 3 przedstawia się następująco: %% ZWIKSZENIE CZSTOTLIWOŚCI PRÓBKOWANIA more = floor(fs * 1.5); % zwiększamy częstotliwość próbkowania sygnału(przyjęłam nową częstotliwość równą 1.5fs) x = floor( ( ( more / fs ) - 1 ) * L ); % określamy liczbę próbek zerowych L2 = ( L + x ); %nowa liczność próbek MORE_fft = zeros (1,L2); % deklaracja nowej tablicy fft sygnału MORE_fft( 1 : floor(L/2+ 1)) = fftowa( 1 : floor( L / 2 + 1) ); % przypisanie wartości dla początkowych próbek w tablicy MORE_fft( x + floor( L / 2 + 2 ) : x + L ) = fftowa( floor( L / 2 + 2 ) : L ); % przypisanie wartości dla końcowych próbek w tablicy MORE_normal = ifft(MORE_fft); %transformata odwrotna skala_t2 = 1/more : 1/more : L2/more; % określenie nowej skali czasowej skala_f2 = more/L2 : more/L2 : more; % określenie nowej skali częstotliwościowej sound(real(MORE_normal),more); % odtworzenie nowego sygnału dzwiękowego W ramach zadania otrzymano następujące wykresy: Figura 4 Wnioski z wykonania zadania 3: Zadanie polegało na zwiększeniu częstotliwości próbkowania sygnały dzwiękowego. Zadanie zostało zrealizowane poprzez odsunięcie połowy próbek w widmie fft sygnały, a następnie wypełnienie luki zerami. Zwiększona ilość próbek to większa częstotliwość próbkowania, a co za tym idzie jakość sygnału wzrosła, przez co stał się ona bardziej zrozumiały dla odbiorcy w porównaniu z oryginalnym nagraniem. Zadanie 4: Korzystając z DFT zmniejszyć częstotliwość próbkowania sygnału postępując analogicznie jak wyżej. Kod programu realizujący zadanie 4 przedstawia się następująco: %% ZMNIEJSZENIE CZSTOTLIWOŚCI PRÓBKOWANIA less = floor( fs * 0.5 ); % ustalamy nową częstotliwość próbkowania (przyjęłam 0.5fs) a = floor( L * less / ( 2 * fs ) ); L3 = 2 * a + 1; % ustalamy nową liczność próbek dla sygnału LESS_fft = zeros( 1, L3 ); %deklaracja nowej tablicy dla transformaty fft sygnału LESS_fft( 1 : floor( L3 / 2 + 1 ) ) = fftowa( 1 : floor( L3 / 2 + 1 ) ); %przepisanie początkowych próbek do tablicy LESS_fft( floor( L3 / 2 + 2 ) : L3 ) = fftowa( floor( L3 / 2 + 2 ) - L3 + L : L ); % przepisanie końcowych próbek do tablicy LESS_normal = ifft(LESS_fft); % transformata odwrotna skala_t3 = 1/less:1/less:L3/less; % określenie nowej skali czasowej skala_f3 = less/L3:less/L3:less; % określenie nowej skali częstotliwościowej sound(LESS_normal,less); W ramach zadania otrzymano następujące wykresy: Figura 5 Wnioski z wykonania zadania 4: Zadanie polegało na zmniejszeniu częstotliwości próbkowania. Zostało ono zrealizowane poprzez przepisanie do nowej tablicy(o połowę mniejszej niż tablica fft oryginalnego dzwięku) tylko 0,25 początkowych próbek oraz 0,25 końcowych próbek. Otrzymany w ten sposób sygnał jest stłumiony, jakby oddalony, gorszy jakościowo i mniej zrozumiały dla odbiorcy. Wnioski w wykonania ćwiczenia: Poprzez operacje na transformacie Fouriera sygnału dzwiękowego możemy wpływać na eksponowanie pożądanych tonów w dzwięku jak także na tłumienie tych niechcianych. Umożliwiają one także modelowanie jakości dzwięku.