Laboratorul 05.

Shiftarea în fază/timp şi modularea în amplitudine

În acest laborator vom încerca să experimentăm câteva dintre proprietăţile Transformatei Fourier, care ne permite să shiftăm/întârziem într-un domeniu şi să observăm un anumit efect în alt domeniu. De exemplu, la curs, am arătat că o întârziere în domeniul “Timp” înseamnă o shiftare de frecvenţă în domeniul “Frecvenţă”.

Materiale ajutătoare:

    1. Secțiunea 4.8 (vezi tabelul 4.2 în particular)

Exercițiul 1 -- shiftarea în frecvență [4p]

În acest exerciţiu vrem să întârziem un semnal în timp, prin modificarea spectrului său (vezi proprietăţile Transformatei Fourier). Vom folosi un semnal pe care l-am mai folosit şi anume, semnalul dreptunghiular cu amplitudinea $A$ pe intervalul $[0, \frac{T}{2}]$ şi cu amplitudinea $-A$ pe intervalul $[\frac{T}{2}, T]$ care are binecunoscutul spectru dat de:

\begin{equation} c_{k} = \left\lbrace \begin{array}{} \frac{2}{j \pi k}A \qquad k \quad impar \\0 \qquad \quad k \quad par \end{array} \right. \end{equation}

Pentru acest task va trebui să urmaţi următorii paşi:

  • Reprezentaţi grafic semnalul original
  • Calculaţi câţiva coeficienţi Fourier $c_k$. Faceţi asta, similar cu ce am făcut în laboratoarele precedente, folosind $k\in\{-81,\ldots,81\}$.
  • Plotaţi coeficienţii
  • Modificaţi spectrul pentru a obţine un semnal în timp întârziat cu $\tau = \frac{T}{4}$ (vezi tabelul 4.2 din carte).
  • Plotaţi coeficienţii după modificare. Vedeţi vreo diferenţă? De ce?
  • Reconstruiți semnalul din spectrul modificat, similar cu ce-am făcut în laboratorul 3. Ar trebui să vedeți semnalul shiftat cu $\tau$, față de cel original (dacă totul a mers cum trebuie).

O soluție posibilă:

ex1.m
A = 1;
T = 100;
x = 1:T;
s = -A*ones(1, T);
s(1:(T/2)) = A;
 
h = figure;
plot(x,s);
ylabel('Amplitude');
xlabel('Time');
ylim([-A-0.5, A+0.5]);
title('Original signal s(t)');
print(h, '-dpng', 'original_signal.png');
 
%% Compute some of the Fourier coefficients
% These will be used also for reconstruction
cmax = 81;
kv = -cmax:cmax;
N = length(kv);
coef = zeros(N,1);
for i=1:N
    k = kv(i);
    if mod(k,2) ~= 0
        coef(i) = (2*A) / (j*pi*k);
    end
end
 
%% Plot  coefficients
h = figure;
stem(kv, abs(coef));
xlabel('Frequency component (k)');
ylabel('Magnitude of component');
title('Fourier coefficients before phase shift');
print(h, '-dpng', 'coefficients_before_pshift.png');
 
%% Shift spectrum in frequency
tshift = T/4;
scoef = zeros(N, 1);
for i=1:N
    scoef(i) = coef(i) * exp(-j*2*pi*kv(i)*tshift/T);
end    
 
%% Plot  coefficients
h = figure;
stem(kv, abs(scoef));
xlabel('Frequency component (k)');
ylabel('Magnitude of component');
title('Fourier coefficients after phase shift');
print(h, '-dpng', 'coefficients_after_pshift.png');
 
 
%% Reconstruct signal after phase shift
sr = zeros(1, T);
for t=1:T
    for i=1:N
        sr(t) = sr(t) + scoef(i)*exp(j*2*pi*kv(i)*t/T);
    end
end
 
h=figure;
plot(1:T, sr);
ylim([-A-0.5, A+0.5]);
title('Reconstructed signal s(t) after phase shift');
ylabel('Amplitude');
xlabel('Time');
print(h, '-dpng', 'reconstructed_signal_after_pshift.png');

Exercițiul 2 – modularea în amplitudine [4p]

În acest exercițiu va trebui să încercați să efectuați modularea în amplitudine asupra următorului semnal exponențial (eng. exponential decay signal) : $s(t) = e^{-at}u(t)$, unde $a>0$ și $u(t)$ este treapta unitară (i.e. egală cu 1 pentru $t\ge0$, 0 altfel).

Obiectivul vostru

Folosiți o frecvență purtătoare $f_c = \frac{20}{T}$, unde $T$ este numărul eșantioanelor (samples).

Pentru asta va trebui să urmăriți acești pași:

  • Creați semnalul $s(t)$, similar cu exercițiul precedent, pentru $t\in\{1,\ldots,T=128\}$, folosind $a=0.05$.
  • Calculați și plotați spectrul folosind DFT (Transformata Fourier Discretă). Nu am făcut încă la curs, dar vom face în următoarele cursuri. Acum, doar folosiți acest cod:
    h = figure;
    fx = zeros(1, T);
    findex = T/2*linspace(0,1,T/2);
    fx((T/2)+1:end) = findex;
    fx(1:T/2) = [-T/2, -findex(end:-1:2)];
    fs = fft(s);
    stem(fx, abs(fftshift(fs)));
    xlabel('Frequency component (k)');
    ylabel('Magnitude of component');
    title('Fourier coefficients before amplitude modulation');
    print(h, '-dpng', 'coefficients_before_amod.png'); % doar daca vreti sa salvati ca png graficul
  • Modulați semnalul în amplitudine folosind frecvența purtătoare $f_c = \frac{20}{T}$, i.e. face 20 de perioade complete în $T=128$ eșantioane ale semnalului $s(t)$. O varianta simpla de modulare este sa calculati: $x(t) = (1+s(t)) \cdot \cos(2\pi f_c t)$.
  • Calculați și plotați (cum am făcut mai devreme) spectrul semalului modulat în amplitudine. Comparați cu spectrul semnalului original. Este ceea ce v-ați așteptat?

O soluție posibilă:

ex2.m
a = 0.05;
T = 128;
x = 1:T;
s = exp(-a*x);
 
h = figure;
plot(x,s);
ylabel('Amplitude');
xlabel('Time');
% ylim([-A-0.5, A+0.5]);
title('Original signal s(t)');
print(h, '-dpng', 'unmodulated_signal.png');
 
%% Plot DFT of initial signal
h = figure;
fx = zeros(1, T);
findex = T/2*linspace(0,1,T/2);
fx((T/2)+1:end) = findex;
fx(1:T/2) = [-T/2, -findex(end:-1:2)];
fs = fft(s);
stem(fx, abs(fftshift(fs)));
xlabel('Frequency component (k)');
ylabel('Magnitude of component');
title('Fourier coefficients before amplitude modulation');
print(h, '-dpng', 'coefficients_before_amod.png');
 
%% Modulate the signal in amplitude
fc = 20/T; %% X times larger than fundamental frequency
ams = zeros(1, T);
for i=1:T
    ams(i) = (1+s(i)) * cos(2*pi*fc*i);
end
 
%% Plot DFT of amplitude modulated signal
h = figure;
fx = zeros(1, T);
findex = T/2*linspace(0,1,T/2);
fx((T/2)+1:end) = findex;
fx(1:T/2) = [-T/2, -findex(end:-1:2)];
fams = fft(ams);
stem(fx, abs(fftshift(fams)));
xlabel('Frequency component (k)');
ylabel('Magnitude of component');
title('Fourier coefficients after amplitude modulation');
print(h, '-dpng', 'coefficients_after_amod.png');

Exercițiul 3 – modularea în amplitudine [2p]

În acest exercițiu veți încerca să refaceți un semnal modulat în amplitudine (click aici). Urmați următorii pași:

  • Descărcați semnalul modulat și încărcați-l în Matlab folosind functia load('lab05_modulated_sound.mat'). Se va încarca semnalul precum și Fs frecvența de eșantionare.
  • Semnalul modulat provine dintr-un semnal original $s(t)$ care a fost înmulțit cu un semnal cosinus de frecventa $fc$, cos($2 \pi \cdot fc \cdot t$), unde t=0:1/Fs:timp_maxim. Precum ați observat și în exercițiul anterior spectrul semnalului modulat conține semnaul semnalului original shiftat la frecvența fc și -fc. Plotați spectrul pentru a vedea acest lucru.
  • Dacă înmulțim (din nou) semnalul primit cu acelasi semnal cosinus ar trebui să putem recupera semnalul original după aplicarea unui filtru lowpass. Folositi fc = Fs / 8
  • Pentru a realiza efectul unui filtru lowpass vom egala cu zero coeficienții corespunzatori frecvențelor peste un prag.
  • Având noii coeficienți putem reface semnalul în timp folosind inversa Fourier. Realizați acest lucru folosind funcția ifft.
  • Puteti asculta semnalul rezultat folosind functia Matlab sound(semnal).

Atenție: Vom învăța la curs că spectrul obținut prin transformata Fourier discretă este periodic. Funcțiile fft / ifft consideră primii jumătate plus unu coeficienții pentru frecventele pozitive apoi următoarea jumătate corespunzătoare coeficienților negativi. Pentru a obține un spectru centrat în zero (doar ca să îl vizualizăm precum ne-am obișnuit) vom folosi funcția fftshift.

O soluție posibilă:

lab05_ex3.m
clear all
close all
 
load('lab05_modulated_sound.mat')
 
 
fc = Fs / 8 ;
max_time = size(y0_modulated,1) / Fs;
t = 0:1 / Fs:max_time;
t = t(1:end-1)';
 
% inmultim cu acceasi sinusoida cu care a fost modulat semnalul
y0_demod = y0_modulated .* cos(2*pi*fc*t);
 
% aflam coeficientii fourier si ii plotam
fams_mod = fft(y0_modulated);
figure , stem(abs(fftshift(fams_mod)));
title('spectru semnal modulat')
 
fams_demod = fft(y0_demod);
figure, stem(abs(fftshift(fams_demod)));
title('spectru semnal demodulat')
 
sp_low = fams_demod;
 
% eliminam frecventele inalte
N = round(size(fams_demod,1) / 10);
sp_low(N:end-(N-2)) = 0;
figure, stem(abs(fftshift(sp_low)));
title('spectru semnal demodulat filtrat')
 
% reconstrum semnalul in timp
reconstructed_signal = real(ifft(sp_low));
sound(reconstructed_signal,Fs)

  • Data publicării: 29.10.2018
ps/laboratoare/05.txt · Last modified: 2018/11/17 13:45 by ionut.gorgos
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0