Lab 6 — AM modulation στο MATLAB
Από τη θεωρία ξέρουμε ότι διαμόρφωση σημαίνει να αλλάζουμε ένα χαρακτηριστικό (πλάτος, φάση, ή συχνότητα) ενός φέροντος σήματος c(t) σύμφωνα με ένα σήμα πληροφορίας m(t). Εδώ θα δούμε αυτά τα διαμορφωμένα σήματα πραγματικά στο MATLAB — και θα δούμε ότι το φάσμα είναι αυτό που τα ξεχωρίζει.
Conventional AM — με φέρον
Από τη θεωρία:
για ένα ημίτονο σήμα διαμόρφωσης. Η περιβάλλουσα είναι:
Ac = 2; % πλάτος φέροντος
mu = 0.7; % συντελεστής διαμόρφωσης (modulation index)
fc = 25; % συχνότητα φέροντος (kHz)
fm = 2; % συχνότητα μηνύματος (kHz)
t = 0:0.001:1;
s = Ac * (1 + mu*cos(2*pi*fm*t)) .* cos(2*pi*fc*t);
env = abs(Ac * (1 + mu*cos(2*pi*fm*t)));
plot(t, s, '-', t, env, 'm--');
xlabel('time (ms)'), ylabel('Amplitude')
legend('AM signal', 'Envelope')
title('Tone-modulated AM, \mu = 0.7')
grid on
Πολλαπλοί τόνοι στο μήνυμα
Ac = 4.648;
fc = 10;
fm1 = 1;
fm2 = 2;
t = 0:0.001:2;
% Μήνυμα με 2 τόνους
m = 3*cos(2*pi*fm1*t - pi/6) + 2*sin(2*pi*fm2*t);
% AM με «added» μήνυμα (όχι ka·m, αλλά απευθείας s = (Ac + m)·cos(2πfc·t))
s = (Ac + m) .* cos(2*pi*fc*t);
env = abs(Ac + m);
subplot(2,1,1);
plot(t, m), grid on, title('m(t)')
subplot(2,1,2);
plot(t, s, '-', t, env, 'm--')
title('AM signal + envelope')
legend('AM', 'Envelope'), grid on
DSB-SC — Καταπιεσμένο φέρον (χωρίς φέρον)
Από τη θεωρία: αν αφαιρέσεις το «1 + μ» τμήμα και αφήσεις απλά m(t)·c(t), παίρνεις DSB-SC, που χρησιμοποιεί όλη την ισχύ μετάδοσης για πληροφορία.
fs = 2000; % συχνότητα δειγματοληψίας
t = -0.5:1/fs:0.5;
% Μήνυμα
fm = 0.5;
m = cos(2*pi*fm*t) - 0.25;
% Φέρον
fc = 20;
c = cos(2*pi*fc*t);
% DSB-SC: απλό γινόμενο (προσοχή στο .* !)
u = m .* c;
subplot(3,1,1), plot(t, m), title('Message m(t)')
subplot(3,1,2), plot(t, c), title('Carrier c(t)')
subplot(3,1,3), plot(t, u), title('DSB-SC: u(t) = m(t) c(t)')
Φάσμα ενός διαμορφωμένου σήματος — fft
Από τη θεωρία ξέρουμε ότι το φάσμα της u = m·c έχει τη μορφή του φάσματος του m, αλλά μετατοπισμένο στις ±fc. Επιβεβαιώνουμε αυτό αριθμητικά.
% Συνάρτηση για φάσμα ενός σήματος
function X = am_spectrum(x)
X = abs(fftshift(fft(x))); % fftshift κεντράρει το DC στο 0
end
M = am_spectrum(m);
C = am_spectrum(c);
U = am_spectrum(u);
% Άξονας συχνότητας — από -fs/2 ως +fs/2
N = length(u);
f = (-fs/2) : (fs/N) : (fs/2 - fs/N);
subplot(3,1,1), plot(f, M), title('|M(f)|'), xlim([-fs/2 fs/2])
subplot(3,1,2), plot(f, C), title('|C(f)|'), xlim([-fs/2 fs/2])
subplot(3,1,3), plot(f, U), title('|U(f)|'), xlim([-fs/2 fs/2])
Τι θα δεις: Το |M(f)| έχει αιχμή στο f = 0.5 (η συχνότητα του μηνύματος). Το |C(f)| έχει αιχμές στις ±20. Το |U(f)| έχει αιχμές στις ±19.5 και ±20.5 — δηλαδή το φάσμα του μηνύματος μετατοπισμένο εκατέρωθεν του φέροντος.
SSB — Διαμόρφωση μίας πλευρικής ζώνης
Από τη θεωρία: η DSB-SC έχει συμμετρικές πλευρικές ζώνες (η ίδια πληροφορία στις δύο πλευρές του φέροντος). Άρα μπορούμε να κρατήσουμε μόνο τη μία και να ξανακερδίσουμε όλη την πληροφορία — εξοικονομώντας μισό εύρος ζώνης. Αυτό είναι το SSB.
Μέθοδος 1 — Φιλτράρισμα
Παίρνουμε το DSB-SC και τρέχουμε ένα υψηπερατό φίλτρο για να κρατήσουμε την άνω πλευρική ζώνη (USB), ή χαμηλοπερατό για την κάτω (LSB).
% Φτιάχνουμε πρώτα μια helper για το βήμα
function u = us(t)
u = 1 * (t >= 0);
end
% Σήμα: τετραγωνικός παλμός
t = 0:0.001:0.1;
x = us(t) - us(t - 0.05) - 2 * (us(t - 0.05) - us(t - 0.1));
% Διαμόρφωση
fc = 350;
fo = 1000; % "συχνότητα αναφοράς" του fft window
x_am = x .* cos(2*pi*fc*t);
% FFT
X = fft(x_am, 128);
freq = -fo/2 : (fo/128) : (fo/2 - fo/128);
% Υψηπερατό για την άνω ζώνη
filter_hp = us(freq - fc) + us(-(freq + fc)); % 1 στις ζώνες έξω από |freq| < fc
X_shifted = abs(fftshift(X));
X_upper = X_shifted .* filter_hp;
% Πίσω στο χρόνο
x_usb = real(ifft(X_upper));
subplot(2,1,1), plot(freq, X_upper), title('USB στο φάσμα')
subplot(2,1,2), plot(x_usb), title('USB στο χρόνο')
Για την κάτω πλευρική ζώνη αλλάζεις σε χαμηλοπερατό:
filter_lp = us(freq + fc) - us(freq - fc); % 1 μόνο στο |freq| < fc
Μέθοδος 2 — Hilbert transform
Πιο κομψά, χρησιμοποιώντας τη φόρμουλα:
όπου m̂(t) είναι ο μετασχηματισμός Hilbert του μηνύματος. Το αρνητικό πρόσημο δίνει άνω πλευρική ζώνη, το θετικό δίνει κάτω.
m_hat = imag(hilbert(m)); % Hilbert transform — το imag() γιατί η hilbert επιστρέφει αναλυτικό σήμα
x_USB = 0.5 * m .* cos(2*pi*fc*t) - 0.5 * m_hat .* sin(2*pi*fc*t);
x_LSB = 0.5 * m .* cos(2*pi*fc*t) + 0.5 * m_hat .* sin(2*pi*fc*t);
Σύγχρονη φώραση (coherent detection)
Για να ανακτήσουμε το m(t) από ένα διαμορφωμένο σήμα:
- Πολλαπλασιάζουμε με ένα τοπικό συνημίτονο ίδιας συχνότητας και φάσης με το φέρον.
- Περνάμε από χαμηλοπερατό φίλτρο για να κρατήσουμε μόνο τους όρους χαμηλής συχνότητας.
% Δεδομένο: το DSB-SC από νωρίτερα (s = m * cos(2πfc·t))
s = m .* cos(2*pi*fc*t);
% Πολλαπλασιάζω ξανά με τον φέροντα
v = s .* cos(2*pi*fc*t);
% v = m * cos²(2πfc·t) = (m/2) + (m/2)·cos(4πfc·t)
% Φιλτράρισμα — χαμηλοπερατό
[b, a] = butter(6, 0.05); % Butterworth τάξης 6, fc-norm = 0.05
m_recovered = 2 * filter(b, a, v); % πολλαπλασιάζω με 2 για να ξανακερδίσω την αρχική κλίμακα
plot(t, m_recovered)
hold on
plot(t, m, 'r--')
legend('Ανακτημένο', 'Αρχικό')
title('Coherent demodulation — σύγκριση')
Bonus — FM στο MATLAB
Από θεωρία FM:
για ημίτονο μήνυμα, όπου β = Δf / fm είναι ο modulation index.
fc = 400;
fm = 25;
beta = 10; % βαθιά FM
t = 0:0.0001:0.1;
s_fm = cos(2*pi*fc*t + beta*sin(2*pi*fm*t));
subplot(3,1,1), plot(t, cos(2*pi*fm*t)), title('Μήνυμα m(t)')
subplot(3,1,2), plot(t, cos(2*pi*fc*t)), title('Φέρον c(t)')
subplot(3,1,3), plot(t, s_fm), title('FM signal')
Αν δοκιμάσεις beta = 0.5, βλέπεις στο φάσμα μόνο ένα ζευγάρι sidebands fc ± fm (narrowband FM). Αν δοκιμάσεις beta = 10, βλέπεις πολλές sidebands — αυτό είναι το Bessel spectrum για το wideband FM.
% Φάσμα FM signal
X = abs(fft(s_fm));
N = length(X);
fVals = (1/0.0001) * (-N/2 : N/2-1) / N; % άξονας σε Hz
plot(fVals, fftshift(X))
xlabel('Hz'), title(sprintf('Φάσμα FM, \\beta = %g', beta))
Quick recap
- Conventional AM =
Ac·(1 + μ·m(t))·cos(2πfc·t). Η περιβάλλουσα είναιAc·|1 + μ·m(t)|. - DSB-SC = απλό γινόμενο
m(t)·c(t). Όλη η ισχύς πάει στην πληροφορία. - SSB = είτε με φιλτράρισμα της μίας ζώνης, είτε με τον τύπο Hilbert.
- Coherent demodulation = πολλαπλασιασμός με
cos(2πfc·t)+ χαμηλοπερατό φίλτρο. fft+fftshiftγια να δεις το φάσμα.abs(fftshift(fft(x)))δίνει συμμετρικό φάσμα γύρω από το 0.- FM:
cos(2πfc·t + β·sin(2πfm·t)). Όσο μεγαλώνει το β, εμφανίζονται περισσότερες sidebands.
Lab practice — εξάσκηση για την εξέταση →
Multiple choice ερωτήσεις πάνω σε MATLAB syntax + «γράψε το script» θέματα, από παλιές εξετάσεις (2018-19, 2020-21, 2023, 2024).
Τελείωσες αυτή τη σελίδα;