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 idee este: - dacă se face sampling pe un semnal cu $f_s > 2 \cdot W$ (unde $W$ este frecvenţa 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).
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');