This is an old revision of the document!
În acest laborator vom începe să experimentăm efectele semnalelor eşantionate şi procesarea semnalelor digitale.
Materiale ajutătoare:
Vom încerca să implementăm un sistem de procesare digitală simplă, care funcţionează după cum urmează:
Urmăriţi aceşti paşi:
close all; f= [1, 2, 10, 20, 50, 100]; wvec = [0.2, 0.2, 0.2, 0.2, 0.2]; np = length(wvec); fm = 10; tm = 1/fm; t = linspace(0, 1, 128); for i=1:length(f) s=sin(2*pi*f(i)*t); s1 = zeros(1,128); for j=np:128 idx1 = j-np+1; idx2 = j; s1(j) = s(idx1:idx2) * wvec'; end h = figure; plot(t,s, 'b-'); hold on; plot(t, s1, 'r--'); ylim([-1, 1]); legend('Original signal', 'Signal after processing'); title(['Moving average for frequency ', num2str(f(i))]); print(h, '-dpng', ['mavg_freq_', num2str(f(i)), '.png']); end
Cum ar trebui să arate:
În acest exercițiu vom experimenta subeșantionarea, metodă care reduce frecvența de eșantionare, necesară pentru a obține întreg spectru al semnalului.
Un semnal real cu o frecvență purtătoare (centrată) la 3kHz este eşantionată la 8 kHz. Lăţimea de bandă a semnalului este 1 kHz, cum puteţi vedea mai jos:
Task-uri/întrebări:
b) $f_c \pm f_s$
c) putem să folosim $fs = 4KHz$ ⇒ replici la -1Khz şi 1Khz de exemplu. Sub 2B obţinem superpoziţia spectrului ⇒ erori în recuperarea semnalului.
d)
fs = 8000; f1 = 3000; ts = 1/fs; xi = 0:ts:100*ts; x1 = cos(2*pi*f1*xi); % Plot x1 figure stem(xi, x1, 'ro'); % Show FFT of x1 N = 64; k = fs/N; % Fundamental frequency X1 = fft(x1, N); xf = 0:k:fs/2; figure stem(xf, abs(X1(1:N/2+1))); xlabel('Frequency [Hz]'); ylabel('Amplitude'); title('Spectrum of x1');
Pentru reconstruirea unui semnal ideea este: - dacă se face sampling pe un semnal cu $f_s > 2 \cdot W$ (unde $W$ este frecvenţă maximă a semnalului, i.e. respectiv Nyquist), atunci puteţi să reconstruiţi din semnalul digital semnalul analog (exceptând o eroare de cuantizare) pe baza unui low pass filter (cu un sinc).
Vom simula un semnal sinus analog, pe care îl vom eșantiona apoi îl vom reconstrui. Pentru asta ar trebui să faceţi următorii paşi:
%% Demonstration of signal recovery after sampling % Using very large Fs for simulation of analog signal %% Initialise things close all; clear; fs_analog = 1000; N_periods = 5; N_analog = N_periods * fs_analog; fs = 10; N_digital = N_periods*fs; f_sin = 1; t = linspace(0, N_periods, N_analog); % N_periods periods %% Create original sinewave s_analog = cos(2*pi*f_sin*t); % s_analog = cos(2*pi*f_sin*t) + cos(4*pi*f_sin*t); % s_analog = cos(2*pi*f_sin*t) + cos(4*pi*f_sin*t) + cos(6*pi*f_sin*t); figure stem(t, s_analog); title('Original sinewave (approximation of continuous signal)'); %% Create 'sampled' version of sinewave interval = N_analog / N_digital; t_digital = t(1:interval:end); s_digital = s_analog(1:interval:end); figure; stem(t_digital, s_digital); title('Sampled sinewave'); %% Create 'continuous' version of 'sampled' sinewave s_cont = zeros(1, N_analog); for i=1:N_digital s_cont((i-1)*interval+1:i*interval) = [s_digital(i), zeros(1,interval-1)]; end figure; stem(t, s_cont); title('Continuous version of sampled sinewave'); %% Low-pass filter the 'continuous' version of 'sampled' sinewave % Use the moving average from previous exercise for low pass filtering N_sinc = N_analog; t_sinc = linspace(-0.2, 0.2, N_sinc/10); sincvec = sinc(fs*t_sinc); s_cont_filtered = conv(s_cont, sincvec); N_cont_filtered = length(s_cont_filtered); t_cont_filtered = linspace(0, N_periods, N_cont_filtered); figure; stem(t_cont_filtered, s_cont_filtered); title('Low-pass filtered signal from continous sampled sinewave');