Class Hub
Lab · 6 of 6·~35 min

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) από ένα διαμορφωμένο σήμα:

  1. Πολλαπλασιάζουμε με ένα τοπικό συνημίτονο ίδιας συχνότητας και φάσης με το φέρον.
  2. Περνάμε από χαμηλοπερατό φίλτρο για να κρατήσουμε μόνο τους όρους χαμηλής συχνότητας.
% Δεδομένο: το 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).

Τελείωσες αυτή τη σελίδα;

Φόρτωση σχολίων…
Lab 6 — AM modulation στο MATLAB · Signal Processing Class Hub