SPRAWOZDANIE Z ĆWICZENIA LABORATORYJNEGO NR 3
Wykonał: Wojciech Węgrecki
Grupa: I9G2S1Treść zadania:
3.1
Wykonaj operację na widmie sygnału dźwiękowego polegającą na usunięciu (wyzerowaniu) z niego harmonicznych odpowiadających przedziałowi częstotliwości <fc,fs-fc> (filtr dolnoprzepustowy). Następnie wykonaj transformatę odwrotną, odsłuchaj dźwięk, porównaj z oryginałem również wyświetlając przebieg czasowy oryginału i sygnału przetworzonego.
Powyższe czynności wykonaj usuwając z widma elementy <0,fc>v<fs-fc,fs> (filtr górnoprzepustowy). Porównaj wyniki obydwu operacji.
Korzystając z DFT zwiększ częstotliwość próbkowania sygnału. W tym celu dokonaj odsunięcia drugiej połowy widma tak, aby ostatni prążek znalazł się na pozycji nowej częstotliwości próbkowania. Powstałą lukę wypełnij zerami. Wykonaj transformatę odwrotną. Zweryfikuj otrzymane wyniki (np. poprzez wyświetlenie sygnałów sprzed i po operacji różnymi kolorami symboli na jednym wykresie.
Korzystając z DFT zmniejsz częstotliwość próbkowania sygnału postępując analogicznie jak wyżej.
Wykonanie zadania:
Aby przejść do wykonywania zasadniczej treści zadania w MATLABie należało najpierw wczytać dźwięk, później wykonać dyskretną transformatę Fouriera (DFT) a następnie zdefiniować wartości, które podczas rysowania wykresów będą służyły jako oś x - czas i częstotliwość oraz przyjąć wartość fc(w moim przypadku 5000 Hz). Dodatkowo wyznaczyłem długość dźwięku za pomocą funkcji length. Wszystkie te operacje zostały wykonane za pomocą następującego kodu:
[dzwiek,fs,nbit]=wavread('dzwiek.wav'); %wczytanie dźwięku
dzwiek=dzwiek(:,1);
widmo=fft(dzwiek); %transformata fouriera dzwieku
L=length(dzwiek); %dlugosc dzwieku
f=0:fs/L:(L-1)*fs/L; %częstotliwość dźwięku (wykorzystywana do skalowania osi x)
czas=0:1/fs:(L-1)/fs; %obliczenie czasu trwania sygnalu (wykorzystywany do skalowania osi x)
fc=5000; % ustalona wartosc po ktorej zerujemy
3.1
W tym zadaniu należało stworzyć filtr dolnoprzepustowy, tzn. wyzerować harmoniczne odpowiadające przedziałowi <fc,fs-fc>. Następnie należało wykonać transformatę odwrotną, odsłuchać dźwięk i porównać z oryginałem wyświetlając przebieg czasowy oryginału i sygnału przetworzonego. Dodatkowo wyświetliłem widmo sygnału przed i po przefiltrowaniu (rys. 1).
Wszystko to osiągnąłem za pomocą kodu:
%filtr dolnoprzepustowy
widmo_dolno=widmo; % zmienna pomocnicza
for i=fc:1:(length(widmo_dolno)-fc)
widmo_dolno(i)=0; % wyzerowanie wartosci
end;
potrans=ifft(widmo_dolno); %wykonanie transformaty odwrotnej
wavplay(real(potrans),fs); %odtworzenie dźwięku
figure(2) %rysowanie czterech wykresów
subplot(4,1,1) ;
plot(czas,dzwiek);
grid on
title('Oryginalny sygnał');
subplot(4,1,2);
plot(czas,potrans)
title('Sygnał po przefiltrowaniu')
grid on
subplot(4,1,3)
stem(f, abs(widmo))
grid on
title('Widmo oryginał');
subplot(4,1,4);
stem(f,abs(widmo_dolno))
title('Filtr Dolnoprzepustowy');
grid on
wavwrite(real(potrans), 'filtr_dolny'); % zapisanie pliku po transformacie i filtrze dolnoprzepustowym
rys.1 Porównanie oryginalnego sygnału, sygnału po przepuszczeniu przez filtr dolnoprzepustowy, widma oryginalnego sygnału i widma po filtracji
3.2
W tym zadaniu należało stworzyć filtr górnoprzepustowy, tzn. wyzerować harmoniczne odpowiadające przedziałowi <0,fc>∪<fs-fc,fs> Następnie należało wykonać transformatę odwrotną, odsłuchać dźwięk i porównać z oryginałem wyświetlając przebieg czasowy oryginału i sygnału przetworzonego. Dodatkowo wyświetliłem widmo sygnału przed i po przefiltrowaniu (rys. 2).
Wszystko to osiągnąłem za pomocą kodu:
% filtr górnoprzepustowy
widmo_gorno=widmo; %zmienna pomocnicza
for i=1:1:fc % wyzerowanie wartosci od 0 do fc
widmo_gorno(i)=0;
end;
for i=length(widmo_gorno)-fc:1:length(widmo_gorno) % zerowanie wartosci od fs - fc do fs
widmo_gorno(i)=0;
end;
potrans2=ifft(widmo_gorno); %transformata odwrotna
wavplay(real(potrans2),fs); %odtworzenie dźwięku
figure(1) %wyswietlenie czterech wykresow
subplot(4,1,1) ;
plot(czas,dzwiek); %oryginalny sygnał
title('oryginalny sygnal');
grid on
subplot(4,1,2)
plot(czas,potrans2); % sygnał po przefiltrowaniu
grid on
title('Sygnał po przefiltrowaniu')
subplot(4,1,3) ;
stem(f,abs(widmo)); % widmo oryginal
grid on
title('Widmo oryginał');
subplot(4,1,4);
stem(f,abs(widmo_gorno))
title('Filtr Górnoprzepustowy'); %widmo po przefiltrowaniu
grid on
wavwrite(real(potrans2), 'filtr_gorny'); %zapisanie pliku po transformacie odwrotnej i filtrze górnoprzepustowym
rys.2 Porównanie oryginalnego sygnału, sygnału po przepuszczeniu przez filtr górnoprzepustowy, widma oryginalnego sygnału i widma po filtracji
Porównując dźwięki po obu filtracjach to dźwięk po filtracji górnoprzepustowej jest cichszy i mniej wyraźny. Można zrozumieć treść obu nagrań, ale jakość tego nie jest najlepsza. Dodatkowo sprawiają wrażenie jakby były w zwolnionym tempie. Głos w nagraniu po filtracji dolnoprzepustowej jest niższy i głośniejszy.
3.3
Zadanie polegało na tym, aby korzystając z DFT zwiększyć częstotliwość próbkowania sygnału. W tym celu należało 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łem zerami. Następnie wykonałem transformatę odwrotną i zweryfikowałem otrzymane wyniki poprzez wyświetlenie sygnałów sprzed i po operacji różnymi kolorami na jednym wykresie(rys. 3).
Kod tego zadania:
widmo=fft(s); %widmo oryginalnego sygnalu
widmo_zw=widmo; %widmo pomocnicze do wyciecia
L=length(widmo); % dlugosci widma oryginalnego
czas_u=L/fs; % czas utowru
czas=0:1/fs:(L-1)/fs;
%##################################################
% zwiększanie czestotliwosci
for i=1:1:floor(0.5*L) % przepisanie nowego widma do polowy
widmo_zw(i)=widmo(i);
end;
for i=floor(0.5*L):1:floor(L)% od polowy wypelnienei zerami
widmo_zw(i)=0;
end;
j=floor(L);
for i=floor(0.5*L):1:L % przepisanie reszty widma
widmo_zw(j)=widmo(i);
j=j+1;
end;
L2=length(widmo_zw); % dlugosc utworu po zwiekszeniu czestotliwosci
f2=floor(L2/czas_u); %obliczenie czestotliwosci utworu po zwiekszeniu
krok1=0:fs/L:(L-1)*fs/L; % krok rysowania pierwszego widma
krok2=0:f2/L2:(L2-1)*f2/L2; % krok rysowania drugiego widma
czas2=0:1/f2:(L2-1)/f2; % krok rysowania drugiego sygnału
czas_utworu2=L2*(1/f2); % czas utworu po zmianie częstotliwości
figure(2) % narysowanie oryginalnego sygnalu z nalozonym na nie sygnalem po zmianie czestotliwosci
plot(czas,s);
grid on;
hold on;
plot(czas2,ifft(widmo_zw),'r');
title('sygnał oryginalny(kolor niebieski), sygnał po zwiekszeniu(kolor czerwony)');
rys. 3 Sygnał przed i po operacji zwiększenia częstotliwości próbkowania. Sygnał oryginalny jest narysowany kolorem niebieskim, a po zmianie kolorem czerwonym
3.4
Zadanie polegało na tym, aby korzystając z DFT zmniejszyć częstotliwość próbkowania sygnału. W tym celu usunąłem co drugi prążek widma. Następnie wykonałem transformatę odwrotną i zweryfikowałem otrzymane wyniki poprzez wyświetlenie sygnałów sprzed i po operacji różnymi kolorami na jednym wykresie (rys. 4). Dodatkowo porównałem trzy widma sygnałów - widmo oryginalne, widmo po zwiększeniu częstotliwości (zadanie 3.3) oraz widmo po zmniejszeniu częstotliwości (rys.5).
Kod skryptu realizujący w/w zadanie:
%##################################################
% zmniejszanie czestotliwosci
widmo_zm=0;
j=1;
for i=(1:2:L) %przepisanie co drugiej wartości
widmo_zm(j)=widmo(i);
j=j+1;
end;
L3=length(widmo_zm); % dlugosc utworu po zmniejszeniu czestotliwosci
f3=floor(L3/czas_u); %obliczenie czestotliwosci utworu po zmniejszeniu
krok3=0:f3/L3:(L3-1)*f3/L3; % krok rysowania trzeciego widma
czas3=0:1/f3:(L3-1)/f3; % krok rysowania trzeciego sygnału
figure(1)
subplot(3,1,1)
stem(krok1,abs(widmo)); % rysowanie widma oryginalnego
grid on
title('widmo oryginalne');
subplot(3,1,2)
stem(krok2,abs(widmo_zw)); % rysowanie widma po zwiększeniu
grid on
title('widmo po zwiekszeniu czestotliwosci');
subplot(3,1,3)
stem(krok3,abs(widmo_zm)); % rysowanie widma po zmniejszeniu
grid on
title('widmo po zmniejszeniu czestotliwosci');
figure(3) % narysowanie oryginalnego sygnalu z nalozonym na nie sygnalem po zmianie czestotliwosci
plot(czas,s);
grid on;
hold on;
plot(czas3,ifft(widmo_zm),'r');
title('sygnał oryginalny(kolor niebieski), sygnał po zmniejszeniu(kolor czerwony)');
rys. 4 Sygnał przed i po operacji zmniejszenia częstotliwości próbkowania. Sygnał oryginalny jest narysowany kolorem niebieskim, a po zmianie kolorem czerwonym
rys. 5 Porównanie trzech widm sygnałów - widma oryginalnego, widma po zwiększeniu częstotliwości i widma po zmniejszeniu częstotliwości
WNIOSKI
Do wykonania operacji usuwania harmonicznych, jako przedziału częstotliwości fc użyłem wartości 5000Hz. Po zamianie nowopowstałego widma na sygnał dźwiękowy okazało się, że w nowym nagraniu nie występują wysokie tony dźwięków co sprawia wrażenie obniżenia głosu i jego spowolnienia. Jednak mimo to dźwięk jesteśmy w stanie rozpoznać. Zniekształcenie zależy od częstotliwości fc. Im ona jest niższa tym dźwięk jest bardziej zniekształcony.
Usuniecie z widma zakresu niskich częstotliwości poskutkowało wyzerowaniu skrajnych części widma, co w odsłuchiwanym dźwięku przełożyło się na znaczne obniżenie jakości nagrania oraz na wyciszenie dźwięku. W tym wypadku także jesteśmy w stanie rozróżnić wypowiadane słowa, jednak im wyższa wartość fc tym staje się to coraz trudniejsze.
Porównując efekt działania obu filtrów, zdecydowanie można powiedzieć, że oba w znacznym stopniu modyfikują sygnał dźwiękowy. Oba filtry mają zupełnie przeciwne działanie i sprawdzanie ich działania na jednej wartości fc staje się niemożliwe. Gdy zmniejszamy wartość fc pogarsza się dźwięk po filtracji dolnoprzepustowej, jednak po filtracji górnoprzepustowej jest on w dosyć dobrej jakości, a gdy zwiększamy fc efekt jest przeciwny.
Wykonując kolejne zadanie, polegające na zwiększeniu częstotliwości próbkowania zauważyłem, że jakoś danego dźwięku poprawiła się. Dźwięk się wyostrzył i zmniejszyła się ilość zniekształceń i szumów. Efekt ten osiągnęliśmy dzięki zwiększonej ilości próbek.
Zmniejszając częstotliwość próbkowania osiągnęliśmy całkowicie przeciwny efekt do poprzedniego. Dźwięk jest w bardzo słabej jakości, niezrozumiałej dla ucha. Dzieje się tak, ponieważ usunęliśmy dużą ilość próbek.
Operując na widmie amplitudowym możemy w łatwy sposób poprawiać lub pogarszać jakość przetwarzanego dźwięku.