This is an old revision of the document!
In acest laborator vom continua sa exploram transformata Fourier Discreta (DFT), urmarind efectul esantionarii in domeniul frecventa (aparitia sinc-ului din cauza fenomenului de leakage) si metode de rezolvare a acestuia (zero-padding, ferestre, cresterea numarului de esantioane).
In acest exercitiu veti reface exemplul pe care l-am facut la curs cu 2 sinusoide pentru a vedea efectul fenomenului de leakage si a experimenta zero-padding. Pentru asta vom folosi urmatorul semnal:
$s(n) = A_1 \sin(2\pi f_1 n t_s) + A_2 \sin(2\pi f_2 n t_s)$,
unde $f_1$ si $f_2$ sunt frecventele celor doua sinusoide care compun semnalul, si $t_s = 1/f_s$ e perioada de sampling ($f_s = 1/t_s$).
Pentru a face asta urmariti urmatorii pasi:
close all; clear; fs = 8000; f1 = 0000; f2 = 2500; A1 = 1; A2 = 0.5; N = 8; t = 0:(N-1); s1 = A1*sin(2*pi*(f1/fs)*t); s2 = A2*sin(2*pi*(f2/fs)*t); s = s1 + s2; %% Plot signals h = figure; plot(t, s1, 'r--'); hold on; plot(t, s2, 'b-.'); plot(t, s, 'k-'); xlabel('Sample index'); ylabel('Amplitude'); title('Two sinewaves'); legend('s1', 's2', 's1 + s2'); print(h, '-dpng', 'lab7_sinewaves_c.png'); %% Compute/plot fft ffs = fft(s); fidx = (fs/N)*linspace(0, N-1, N); h = figure; stem(fidx, abs(ffs)); title('FFT of signal'); xlabel('DFT frequency index'); print(h, '-dpng', 'lab7_sinewaves_c_fft.png');
Code with zero-padding:
close all; clear; fs = 8000; f1 = 0; f2 = 2000; A1 = 1; A2 = 0.5; N = 8; Z = 64; t = 0:(N-1); tt = 0:(Z-1); s1 = A1*sin(2*pi*(f1/fs)*t); s2 = A2*sin(2*pi*(f2/fs)*t); %% Zero-pad the signals s1 = [s1, zeros(1, Z-N)]; s2 = [s2, zeros(1, Z-N)]; s = s1 + s2; %% Plot signals h = figure; plot(tt, s1, 'r--'); hold on; plot(tt, s2, 'b-.'); plot(tt, s, 'k-'); xlabel('Sample index'); ylabel('Amplitude'); title('Two sinewaves'); legend('s1', 's2', 's1 + s2'); print(h, '-dpng', 'lab7_sinewaves_zeropad_b.png'); %% Compute/plot fft ffs = fft(s); fidx = (fs/Z)*linspace(0, Z-1, Z); h = figure; stem(fidx, abs(ffs)); title('FFT of signal'); xlabel('DFT frequency index'); print(h, '-dpng', 'lab7_sinewaves_zeropad_fft_b.png');
În acest exercițiu aveți dat un semnal(click aici) care conține două note(două unde sinusoidale). Însă, una dintre ele este mult mai puternică decât cealaltă, asa că a doua, cea mai slabă nu e ușor de detectat din spectrul semnalului. În acest exercițiu vom încerca sa folosim o funcție fereastră pentru a determina cele doua note.
Să facem urmatoarele:
Semnalul, fereastra henning si semnalul atenuat ar trebui sa arate asa:
clear; close all; gen_signal = 0; %% Generate or load the 2-note signal if gen_signal %% Generate the 2-note signal fs = 1000; N = 64; x = 0:(N-1); f1 = 392; % (G4 - Sol major) A1 = 10; f2 = 440; % (A4 - La major) A2 = 1; s = zeros(1, N); s1 = A1*sin(2*pi*f1/fs*x); s2 = A2*sin(2*pi*f2/fs*x); notes_signal = s1+s2; save('notes_signal.mat', 'notes_signal', 'fs'); else %% Load signal fname = 'notes_signal.mat'; load(fname); end %% Plot signal N = length(notes_signal); t = (N/fs)*linspace(0, 1, N); h = figure; plot(t, notes_signal); title('Original signal'); xlabel('Time (s)'); ylabel('Amplitude'); print(h, '-dpng', 'notes_signal.png'); %% Plot fft of the signal ys = fft(notes_signal); fidx = linspace(0,fs/2-1,N/2); h = figure; stem(fidx, abs(ys(1:N/2))); xlabel('Frequency (Hz)'); title('Frequency spectrum of notes signal'); print(h, '-dpng', 'notes_signal_fftpos.png'); % %% Try zero-padding % Z = 128; % s_zeropadding = zeros(1, Z); % s_zeropadding(1:N) = notes_signal; % % %% Plot fft after zero-padding % ys = fft(s_zeropadding); % fidx = linspace(0,fs/2-1,N/2); % h = figure; % stem(fidx, abs(ys(1:N/2))); % xlabel('Frequency (Hz)'); % title('Frequency spectrum of notes signal with zero-padding'); % print(h, '-dpng', 'notes_signal_zp_fftpos.png'); %% Try to use a window to limit the sinc's effect w1 = hanning(N); w1 = w1(:)'; sw = notes_signal .* w1; %% Plot windowed signal h = figure; plot(t, sw); title('Windowed signal'); xlabel('Time (s)'); ylabel('Amplitude'); print(h, '-dpng', 'notes_signal_window.png'); %% Plot fft after window ys = fft(sw); fidx = linspace(0,fs/2-1,N/2); h = figure; stem(fidx, abs(ys(1:N/2))); xlabel('Frequency (Hz)'); title('Frequency spectrum of notes signal with window'); print(h, '-dpng', 'notes_signal_window_fftpos.png');
Precum am discutat la curs, frecventele date de sinc pot fi reduse prin creșterea numărului de eșantioane diferite de zero ale semnalului nostru. Asa că, atunci când este posibil, aceasta ne va ajuta sa vizualizăm semnale foarte aproape în frecvență.
Pentru a vedea acest efect, sa utilizăm aceleași note dar cu un semnal mult mai lung click aici.
Procedați la fel ca înainte:
clear; close all; gen_signal = 0; %% Generate or load the 2-note signal if gen_signal %% Generate the 2-note signal fs = 1000; N = 1024; x = 0:(N-1); f1 = 392; % (G4 - Sol major) A1 = 10; f2 = 440; % (A4 - La major) A2 = 1; s = zeros(1, N); s1 = A1*sin(2*pi*f1/fs*x); s2 = A2*sin(2*pi*f2/fs*x); notes_signal = s1+s2; save('notes_signal_long.mat', 'notes_signal', 'fs'); else %% Load signal fname = 'notes_signal_long.mat'; load(fname); end %% Plot signal N = length(notes_signal); t = (N/fs)*linspace(0, 1, N); h = figure; plot(t, notes_signal); title('Original signal'); xlabel('Time (s)'); ylabel('Amplitude'); print(h, '-dpng', 'notes_signal.png'); %% Plot fft of the signal ys = fft(notes_signal); fidx = linspace(0,fs/2-1,N/2); h = figure; stem(fidx, abs(ys(1:N/2))); xlabel('Frequency (Hz)'); title('Frequency spectrum of notes signal'); print(h, '-dpng', 'notes_signal_fftpos.png'); %% Try to use a window to limit the sinc's effect w1 = hanning(N); w1 = w1(:)'; sw = notes_signal .* w1; %% Plot windowed signal h = figure; plot(t, sw); title('Windowed signal'); xlabel('Time (s)'); ylabel('Amplitude'); print(h, '-dpng', 'notes_signal_window.png'); %% Plot fft after window ys = fft(sw); fidx = linspace(0,fs/2-1,N/2); h = figure; stem(fidx, abs(ys(1:N/2))); xlabel('Frequency(Hz)'); title('Frequency spectrum of notes signal with window'); print(h, '-dpng', 'notes_signal_window_fftpos.png');