Sprawozdanie
Cyfrowe Przetwarzanie sygnałów
Marek Pętlak
I6G1N1
Laboratorium 3
1.Opis zadania
● Wyznaczyć transformatę DFT z definicji oraz postaci macierzowej.
● Wyświetlić przebieg czasowy oraz widma sygnału dźwiękowego na wykresie;
● Wykonać zadaną operację typu filtracyjnego na widmie sygnału dźwiękowego;
● Zmienić częstotliwości próbkowania sygnału dźwiękowego z wykorzystaniem DFT
2.Rozwiązanie
Pierwszym etapem zadanie było wczytanie pliku którego przebieg miał zostać wyświetlony. Do tego celu posłużyło polecenie wavread. Do odsłuchania dźwięku służy polecenie sound
[u,fs]=wavread('Marek');
%sound(u,fs);
L=length(u);
czas= 0:1/fs:L/fs-1/fs;
subplot(7,1,1),plot(czas,u);
U=fft(u);
L1=0:fs/L:fs/L*(L-1);
subplot(7,1,2), plot(L1,abs(U));
Do zmiennej L przypisujemy długość pliku która zostanie wykorzystana do wyliczenia osi czasu. Jeśli chcemy wyświetlić nasz plik należy użyć polecenia plot lub subplot jeśli chcemy uzyskać kilka wykresów w jednym oknie. Do wyświetlenia widma niezbędna jest jeszcze jedna wartość która w tym przypadku (częstotliwość próbkowania) została zapisana do zmiennej L1.
Następnie należało przeprowadzić filtrację dźwięku za pomocą filtra górno - i dolnoprzepustowego.
fc=1100;
i = 1;
U1=U;
%górnoprzepustowy
U1(1:fc)=0+i*0;
U1(L-fc:L)=0+i*0;
%dolnoprzepustowy
U1(L/2-fc:L/2+fc)=0+i*0;
subplot(7,1,4),plot(L1, abs(U1));
u1 = real(ifft(U1));
subplot(7,1,3),plot(czas, u1);
sound(u1,fs);
Następnie należało zmienić częstotliwość próbkowania dźwięku
fs=fs/3;
L1=0:fs/L:fs/L*(L-1);
subplot(7,1,5),plot(L1,abs(U1));
fs=21000;
L1=0:fs/L:fs/L*(L-1);
subplot(7,1,6),plot(L1,abs(U1));
fs=44100;
L1=0:fs/L:fs/L*(L-1);
subplot(7,1,7),plot(L1,abs(U1));
sound(u1,fs);
Można tego dokonać poprzez ręczną zamianę parametry fs i ponowne wyliczenie osi częstotliwości.
3.Kod
clc;
[u,fs]=wavread('Marek');
%sound(u,fs);
L=length(u);
czas= 0:1/fs:L/fs-1/fs;
subplot(7,1,1),plot(czas,u);
U=fft(u);
L1=0:fs/L:fs/L*(L-1);
subplot(7,1,2), plot(L1,abs(U));
fc=1100; i = 1; U1=U;
U1(1:fc)=0+i*0;
U1(L-fc:L)=0+i*0;
U1(L/2-fc:L/2+fc)=0+i*0;
subplot(7,1,4),plot(L1, abs(U1));
u1 = real(ifft(U1));
subplot(7,1,3),plot(czas, u1);
fs=fs/3;
L1=0:fs/L:fs/L*(L-1);
subplot(7,1,5),plot(L1,abs(U1));
fs=21000;
L1=0:fs/L:fs/L*(L-1);
subplot(7,1,6),plot(L1,abs(U1));
fs=44100;
L1=0:fs/L:fs/L*(L-1);
subplot(7,1,7),plot(L1,abs(U1));
Laboratorium 4
1.Opis zadania
● Wyświetlić obraz oraz jego widma w postaci obrazu, wykonać operację odbicia widma(fftshift);
● Wykonać zadane operacje typu filtracyjnego na widmie obrazu, sprawdzić skutków tej operacji;
● Zmienić rozdzielczości obrazu z wykorzystaniem DFT .
2.Rozwiązanie
Pierwszy etap działania polegał na wczytaniu zdjęcia które miałoby zostać poddane filtracji. Do tego celu służy polecenie imread
imread.
Aby wyświetlić obraz ustalamy colormape z jaką ma być wyświetlony a następnie za pomoca polecenia image wyświetlamy wczytany obraz.
[x,map]=imread('Lisa','bmp')
figure(1);
colormap(map);
image(x);
X = fft2(double (x));
figure(2);
absX=abs(X);
absX(1,1)=0;
absX=(absX).^(1/4);
absX=256*absX/max(max(absX));
image(absX);
colormap(map);
Żeby wyświetlić widmo należy wywołać funkcję „fft2”.
W celu rozjaśnienia widma należy wykonać kilkakrotnie polecenie absX, którego efektem będzie rozjaśnienie pikseli.
Następną należało przeprowadzić filtrację w wyniku której w widmie obrazu pozostawały tylko narożników.
[w,k]=size(X);
A=zeros(w,k);
A(w-17:w,k-17:k)=1;
A(1:17,k-17:k)=1;
A(1:17,1:17)=1;
A(w-17:w,1:17)=1;
X=X.*A;
x1=ifft2(X);
figure(3)
colormap(map);
image(abs(x1));
Aby to osiągnąć pobieramy rozdzielczość wczytanego zdjęcia i tworzymy macierz o takich samych wymiarach i wypełniamy ją zerami. Następnie w narożnikach macierzy tworzymy kwadraty o wymiarze 17x17 i taką macierze wymnażamy przez widmo obrazu.
Wykorzystując odwrotną DFT odtwarzamy zdjęcie i wyświetlamy je.
Otrzymane w ten sposób zdjęcie jest nieostre ze względu na pozostawienie samych rogów widma.
Przeprowadzenie filtracji odwrotnej polegającej na usunięciu samych narożników spowodowałoby, że uzyskalibyśmy sam kontur obrazu.
3.Kod
clc;
[x,map]=imread('Lisa','bmp')
figure(1);
colormap(map);
image(x);
X = fft2(double (x));
figure(2);
absX=abs(X);
absX(1,1)=0;
absX=(absX).^(1/4);
absX=256*absX/max(max(absX));
image(absX);
colormap(map);
[w,k]=size(X);
A=zeros(w,k);
A(w-17:w,k-17:k)=1;
A(1:17,k-17:k)=1;
A(1:17,1:17)=1;
A(w-17:w,1:17)=1;
X=X.*A;
x1=ifft2(X);
figure(3)
colormap(map);
image(abs(x1));