Zadanie 1. Animacja wzoru Eulera

W tym zadaniu należało wykonać “animację” wzoru Eulera dla fazy w zakresie , z krokiem .

Kod:


faza=0:5:360;
y1=cos((faza./180).*pi); % Wykres cosinusa
y2=sin((faza./180).*pi); % Wykres sinusa

for tfaza=0:5:360 
    
    signal1=cos((tfaza/180)*pi); % Położenie punktu na wykresie cosinusa
    signal2=sin((tfaza/180)*pi); % Położenie punktu na wykresie sinusa

    figure(1)
    subplot(2,2,2);
    plot(faza,y1,'b-',tfaza,signal1,'ro');
    axis([0 360 -1 1]);
    ylabel('Amplituda [-]'), xlabel('Faza [°]'); 
    title('Cosinus');
    subplot(2,2,4);
    plot(faza,y2,'b-',tfaza,signal2,'ro');
    axis([0 360 -1 1]);
    ylabel('Amplituda [-]'), xlabel('Faza [°]'); 
    title('Sinus');
    subplot(2,2,[1,3]);
    compassplot((tfaza/180)*pi,1)
    title('Euler');
    pause(1)                                              
end  

Wynik działania programu:

Zadanie 2. Własna implementacja DFT

W tym zadaniu należało napisać funkcję będącą własną implementacją Dyskretnej Transformaty Fouriera, przy użyciu jednej pętli for oraz funkcji sum().

Kod:


Fs=100;                             % Częstotliwość próbkowania
dt=1/Fs;                            % Krok czasowy
t=0:dt:10-1/Fs;                     % Wektor czasu
s=sin(2*pi*15*t) + sin(2*pi*40*t);  % Sygnał
N=length(s);                        % Ilość próbek
n=0:(N-1);                          % Kolejne próbki

% Moja implementacja Dyskretnej Transformaty Fouriera:
index=1;
for k=0:(N-1)
    S(index) = sum(s.*exp(-2*pi*1i*k*n/N));
    index=index+1;
end

f = (0:N-1)*Fs/N;                   % Wektor częstotliwości
S_amp = abs(S);                     % Amplituda
S_phase = atan2(imag(S),real(S));   % Faza

% Normalizuję wektory:
S_amp_norm = abs(S)/N*2; S_amp_norm(1)=S_amp_norm(1)/2;
S_phase_norm = S_phase; S_phase_norm(S_amp_norm<0.01)=0;

figure(1)
% Widmo amplitudowe:
subplot(2,1,1)
plot(f, S_amp_norm)
xlabel('Częstotliwość [Hz]'), ylabel('Amplituda'),
xlim([0,50]);
% Widmo fazowe:
subplot(2,1,2)
plot(f, S_phase_norm)
xlabel('Częstotliwość [Hz]'), ylabel('Faza [rad]')
% display y-axis ticks in radians
y_ticks = -1:0.25:1;
yticks(y_ticks*pi)
ticks_for_phase={};
for i=1:length(y_ticks)
    ticks_for_phase{i}=[num2str(y_ticks(i)) ' \pi'];
end
yticklabels(ticks_for_phase)
xlim([0,50]);

Wynik działania programu:

Na podstawie mojej implementacji Dyskretnej Transformaty Fouriera jestem w stanie utworzyć jednostronne widma amplitudowe i fazowe, z których można odczytać, że sygnał poddany DFT składa się z dwóch sygnałów o częstotliwościach odpowiednio 15 i 40 Hz, z przesunięciem fazowym , co się zgadza, gdyż sygnał został zadany jako s=sin(2*pi*15*t) + sin(2*pi*40*t), a .

Zadanie 3. Widma częstotliwościowe sygnałów

W tym zadaniu należało przedstawić jednostronne widmo amplitudowe i widmo przesunięcia fazowego dla dwóch przypadków:

Przypadek 1: Zadany sygnał:

Kod:


Fs = 200;                           % Częstotliwość próbkowania
dt = 1/Fs;                          % Krok czasowy
t = 0:dt:3-dt;                      % Wektor czasu
% Sygnał:
s = 2*sin(2*pi*26*t) + 4.5*cos(2*pi*80*t)+0.8*cos(2*pi*8*t+pi)+6;
S = fft(s);                         % FFT dla sygnału
N = length(s);                      % Ilość próbek
df = Fs/N;                          % Krok częstotliwościowy
f_vec = (0:(N-1))*df;               % Wektor częstotliwości
S_amp = abs(S);                     % Amplituda
S_phase = atan2(imag(S),real(S));   % Faza

% Widma przed normalizacją:
figure(1)
% Widmo amplitudowe:
subplot(2,1,1)
plot(f_vec, S_amp)
xlabel('Częstotliwość [Hz]'), ylabel('Amplituda')
xlim([0,Fs/2]);
% Widmo fazowe:
subplot(2,1,2), plot(f_vec, S_phase)
xlabel('Częstotliwość [Hz]'), ylabel('Faza [rad]')
% display y-axis ticks in radians
y_ticks = -1:0.25:1;
yticks(y_ticks*pi)
ticks_for_phase={};
for i=1:length(y_ticks)
    ticks_for_phase{i}=[num2str(y_ticks(i)) ' \pi'];
end
yticklabels(ticks_for_phase)
xlim([0,Fs/2]);

% Normalizuję wektory:
S_amp_norm = abs(S)/N*2; S_amp_norm(1)=S_amp_norm(1)/2;
S_phase_norm = S_phase; S_phase_norm(S_amp_norm<0.01)=0;

% Widma po normalizacji:
figure(2)
% Widmo amplitudowe:
subplot(2,1,1) 
plot(f_vec, S_amp_norm)
xlabel('Częstotliwość [Hz]'), ylabel('Amplituda'),
xlim([0,Fs/2]);
% Widmo fazowe:
subplot(2,1,2), plot(f_vec, S_phase_norm)
xlabel('Częstotliwość [Hz]'), ylabel('Faza [rad]')
% display y-axis ticks in radians
y_ticks = -1:0.25:1;
yticks(y_ticks*pi)
ticks_for_phase={};
for i=1:length(y_ticks)
    ticks_for_phase{i}=[num2str(y_ticks(i)) ' \pi'];
end
yticklabels(ticks_for_phase)
xlim([0,Fs/2]);

Wynik działania programu:

Na podstawie uzyskanych widm można odczytać, że sygnał ma 4 składowe: Co się zgadza, gdyż oraz .

Przypadek 2:

Kod:


% Parametry sygnału:
A1 = 5;
A2 = 3;
A3 = 1.5;
f1=0;
f2=15;
f3=40;
phi1=0;
phi2=pi/4;
phi3=-pi/2;

Fs = 100;                           % Częstotliwość próbkowania
dt = 1/Fs;                          % Krok czasowy
t = 0:dt:3-dt;                      % Wektor czasu
% Sygnał:
s = A1*cos(2*pi*f1*t+phi1)+A2*cos(2*pi*f2*t+phi2)+A3*cos(2*pi*f3*t+phi3);
S = fft(s);                         % FFT dla sygnału
N = length(s);                      % Ilość próbek
df = Fs/N;                          % Krok częstotliwościowy
f_vec = (0:(N-1))*df;               % Wektor częstotliwości
S_amp = abs(S);                     % Amplituda
S_phase = atan2(imag(S),real(S));   % Faza

% Widma przed normalizacją:
figure(1)
% Widmo amplitudowe:
subplot(2,1,1)
plot(f_vec, S_amp)
xlabel('Częstotliwość [Hz]'), ylabel('Amplituda')
xlim([0,Fs/2]);
% Widmo fazowe:
subplot(2,1,2), plot(f_vec, S_phase)
xlabel('Częstotliwość [Hz]'), ylabel('Faza [rad]')
% display y-axis ticks in radians
y_ticks = -1:0.25:1;
yticks(y_ticks*pi)
ticks_for_phase={};
for i=1:length(y_ticks)
    ticks_for_phase{i}=[num2str(y_ticks(i)) ' \pi'];
end
yticklabels(ticks_for_phase)
xlim([0,Fs/2]);

% Normalizuję wektory:
S_amp_norm = abs(S)/N*2; S_amp_norm(1)=S_amp_norm(1)/2;
S_phase_norm = S_phase; S_phase_norm(S_amp_norm<0.01)=0;

% Widma po normalizacji:
figure(2)
% Widmo amplitudowe:
subplot(2,1,1) 
plot(f_vec, S_amp_norm)
xlabel('Częstotliwość [Hz]'), ylabel('Amplituda'),
xlim([0,Fs/2]);
% Widmo fazowe:
subplot(2,1,2), plot(f_vec, S_phase_norm)
xlabel('Częstotliwość [Hz]'), ylabel('Faza [rad]')
% display y-axis ticks in radians
y_ticks = -1:0.25:1;
yticks(y_ticks*pi)
ticks_for_phase={};
for i=1:length(y_ticks)
    ticks_for_phase{i}=[num2str(y_ticks(i)) ' \pi'];
end
yticklabels(ticks_for_phase)
xlim([0,Fs/2]);


Wynik działania programu:

Zadanie 4. Aliasing

W tym zadaniu należało wykreślić widma amplitudowe dla tego samego sygnału, przy częstotliwościach próbkowania równym 1000 Hz, 100 Hz i 10 Hz.

Kod:


% Częstotliwości próbkowania sygnałów:
fs1=1000;
fs2=100;
fs3=10;

% Sygnał 1:
dt=1/fs1;
out = sim('Lab2_10_model2.slx');
s1=out.simout';
t1=out.tout';

% Zmniejszenie częstotliwości próbkowania sygnału 1:
s2=downsample(s1,10);
s3=downsample(s1,100);
% s2=decimate(s1,10);
% s3=decimate(s1,100);

% Dostosowanie wektorów czasu do utworzonych sygnałów:
t2 = downsample(t1, 10);
t3 = downsample(t1, 100);

% Ilości próbek sygnałów:
N1 = length(s1);
N2 = length(s2);
N3 = length(s3);

% Kroki częstotliwościowe:
df1 = fs1/N1;
df2 = fs2/N2;
df3 = fs3/N3;

% Wektory częstotliowści:
f_vec1 = (0:(N1-1))*df1;
f_vec2 = (0:(N2-1))*df2;
f_vec3 = (0:(N3-1))*df3;

% Obliczenie FFT dla sygnałów:
S1 = fft(s1);
S2 = fft(s2);
S3 = fft(s3);

% Amplitudy sygnałów:
S1_amp = abs(S1);
S2_amp = abs(S2);
S3_amp = abs(S3);

% Normalizowanie sygnałów:
S1_amp_norm = abs(S1)/N1*2; S1_amp_norm(1)=S1_amp_norm(1)/2;
S2_amp_norm = abs(S2)/N2*2; S2_amp_norm(1)=S2_amp_norm(1)/2;
S3_amp_norm = abs(S3)/N3*2; S3_amp_norm(1)=S3_amp_norm(1)/2;

figure(1)
% Przebieg czasowy:
subplot(2,1,1)
plot(t1,s1);
xlim([0 1]); 
xlabel("Czas [s]")
ylabel("Amplituda [-]")
title("Sygnał spróbkowany, fs= 1000");
% Widmo amplitudowe:
subplot(2,1,2)
plot(f_vec1, S1_amp_norm)
xlabel('Częstotliwość [Hz]'), ylabel('Amplituda')
xlim([0,fs1/2]);

figure(2)
% Przebieg czasowy:
subplot(2,1,1)
plot(t2,s2);
xlim([0 1]); 
xlabel("Czas [s]")
ylabel("Amplituda [-]")
title("Sygnał spróbkowany, fs= 100");
% Widmo amplitudowe:
subplot(2,1,2)
plot(f_vec2, S2_amp_norm)
xlabel('Częstotliwość [Hz]'), ylabel('Amplituda')
xlim([0,fs2/2]);

figure(3)
% Przebieg czasowy:
subplot(2,1,1)
plot(t3,s3);
xlim([0 1]); 
xlabel("Czas [s]")
ylabel("Amplituda [-]")
title("Sygnał spróbkowany, fs= 10");
% Widmo amplitudowe:
subplot(2,1,2)
plot(f_vec3, S3_amp_norm)
xlabel('Częstotliwość [Hz]'), ylabel('Amplituda')
xlim([0,fs3/2]);


Wynik działania programu:

Jak widać, dla częstotliwości próbkowania równej 10 Hz nie jest spełnione kryterium Shannona-Nyquista. Dodatkowo, na podstawie widma amplitudowego można zauważyć, że oryginalny sygnał o składowych częstotliwościowych 6 Hz i 8 Hz jest błednie identyfikowany jako sygnał o składowych częstotliwościowych 2 Hz i 4 Hz, a więc zjawisko aliasingu wpływa także na analizę widmową sygnału.

Zadanie 5. Widma sygnałów charakterystycznych

W tym zadaniu należało wykreślić widma sygnałów:

  • Szum,
  • Impuls,
  • Sygnał piłokształtny.

Kod:


Tk = 25;    % Czas symulacji
fs = 1e4;   % Częstotliwość próbkowania
dt=1/fs;    % Krok czasowy

% Wygenerowanie sygnałów:
out = sim('gen_signal2.slx');
s1=out.signal1;
s2=out.signal2;
s3=out.signal3;
t=out.tout';

N = length(s1);         % Ilość próbek
df = fs/N;              % Krok częstotliwościowy
f_vec = (0:(N-1))*df;   % Wektor częstotliwści

% Obliczenie FFT dla sygnałów:
S1 = fft(s1);
S2 = fft(s2);
S3 = fft(s3);

% Amplitudy sygnałów:
S1_amp = abs(S1);
S2_amp = abs(S2);
S3_amp = abs(S3);

% Fazy sygnałów:
S1_phase = atan2(imag(S1),real(S1));
S2_phase = atan2(imag(S2),real(S2));
S3_phase = atan2(imag(S3),real(S3));

% Normalizowanie sygnałów:
S1_amp_norm = abs(S1)/N*2; S1_amp_norm(1)=S1_amp_norm(1)/2;
S1_phase_norm = S1_phase; S1_phase_norm(S1_amp_norm<0.01)=0;

S2_amp_norm = S2_amp;
S2_phase_norm = S2_phase; S2_phase_norm(S2_amp_norm<0.01)=0;

S3_amp_norm = abs(S3)/N*2; S3_amp_norm(1)=S3_amp_norm(1)/2;
S3_phase_norm = S3_phase; S3_phase_norm(S3_amp_norm<0.01)=0;

figure(1)
% Przebieg czasowy:
subplot(3,1,1)
plot(t,s1); 
xlabel("Czas [s]")
ylabel("Amplituda [-]")
title("Szum");
% Widmo amplitudowe:
subplot(3,1,2)
plot(f_vec, S1_amp_norm)
xlabel('Częstotliwość [Hz]'), ylabel('Amplituda')
xlim([0,fs/2]);
% Widmo fazowe:
subplot(3,1,3)
plot(f_vec, S1_phase_norm)
xlabel('Częstotliwość [Hz]'), ylabel('Faza [rad]')
xlim([0,fs/2]);

figure(2)
% Przebieg czasowy:
subplot(3,1,1)
plot(t,s2);
xlabel("Czas [s]")
ylabel("Amplituda [-]")
title("Impuls");
% Widmo amplitudowe:
subplot(3,1,2)
plot(f_vec, S2_amp_norm)
xlabel('Częstotliwość [Hz]'), ylabel('Amplituda')
xlim([0,fs/2]);
% Widmo fazowe:
subplot(3,1,3)
plot(f_vec, S2_phase_norm)
xlabel('Częstotliwość [Hz]'), ylabel('Faza [rad]')
xlim([0,fs/2]);

figure(3)
% Przebieg czasowy:
subplot(3,1,1)
plot(t,s3); 
xlabel("Czas [s]")
ylabel("Amplituda [-]")
title("Sygnał piłokształtny");
% Widmo amplitudowe:
subplot(3,1,2)
plot(f_vec, S3_amp_norm)
xlabel('Częstotliwość [Hz]'), ylabel('Amplituda')
xlim([0,fs/2]);
% Widmo fazowe:
subplot(3,1,3)
plot(f_vec, S3_phase_norm)
xlabel('Częstotliwość [Hz]'), ylabel('Faza [rad]')
xlim([0,fs/2]);

Wynik działania programu:

  • Szum:
  • Impuls:
  • Sygnał piłokształtny: