SPRAWOZDANIE Z ĆWICZENIA
LABORATORYJNEGO NR 3
Wykonał: Wojciech Węgrecki
Grupa: I9G2S1
Treść 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.
3.2
Powyższe czynności wykonaj usuwając z widma elementy <0,fc>v<fs-
fc,fs> (filtr górnoprzepustowy). Porównaj wyniki obydwu operacji.
3.3
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.
3.4
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ść f
c
(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 <f
c
,f
s
-f
c
>. 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,f
c
>
∪<f
s
-f
c
,f
s
> 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.