Rowan-Classes/7th-Semester-Fall-2024/ECOMMS/labs/lab2/am.py
2024-11-20 14:49:04 -05:00

81 lines
2.0 KiB
Python

import numpy as np
import matplotlib.pyplot as plt
import scipy as sp
def add_noise_snr_db(s, SNR):
var_s = np.cov(s)
var_noise = var_s/(10**(SNR/10))
noise = var_noise**0.5 * np.random.randn(len(s))
return s + noise
def add_noise_db(s, noise_db):
var_noise = 10**(noise_db/10)
noise = var_noise**0.5 * np.random.randn(len(s))
return s + noise
def lowpass(data, f_cutoff, f_s):
nyq = 0.5*f_s
normal_cutoff = f_cutoff/nyq
b, a = sp.signal.butter(1, normal_cutoff, btype="low", analog=False)
y = sp.signal.lfilter(b, a, data)
return y
def dsb_am(m, f_c, t):
omega_c = 2*np.pi*f_c
return (1 + m)*np.cos(omega_c*t)
def dsb_sc(m, f_c, t):
omega_c = 2*np.pi*f_c
c = np.cos(omega_c*t)
return m*c
def product_demod(s, f_baseband, f_c, f_s, t):
omega_c = 2*np.pi*f_c
mixed = s*np.cos(omega_c*t)
return lowpass(mixed, f_baseband, f_s)
def main():
T_s = 0.0005
f_s = 1/T_s
f_m = 10
omega_m = 2*np.pi*f_m
f_c = 100
t = np.arange(0,1,T_s)
f = np.linspace(0,f_s,len(t))
m = 0.5*(np.sin(omega_m*t) + np.sin(omega_m/2*t))
s_am = dsb_am(m, f_c, t)
s_sc = dsb_sc(m, f_c, t)
plt.subplot(311)
plt.plot(t, m, label="Message Signal")
plt.subplot(312)
plt.plot(t, s_am, label="DSB-AM Modulated Signal")
plt.subplot(313)
plt.plot(t, s_sc, label="DSB-SC Modulated Signal")
plt.show()
m_am_demod = product_demod(s_am, f_m, f_c, f_s, t)
m_sc_demod = product_demod(s_sc, f_m, f_c, f_s, t)
plt.plot(t, m, label="Original Message Signal")
plt.plot(t, m_am_demod, label="Demodulated DSB-AM Signal")
plt.plot(t, m_sc_demod, label="Demodulated DSB-SC Signal")
plt.legend(loc="upper right")
plt.show()
m_am_noisy_demod = product_demod(add_noise_snr_db(s_am, 3), f_m, f_c, f_s, t)
m_sc_noisy_demod = product_demod(add_noise_snr_db(s_sc, 3), f_m, f_c, f_s, t)
plt.plot(t, m)
plt.plot(t, m_am_noisy_demod)
plt.plot(t, m_sc_noisy_demod)
plt.show()
if __name__ == "__main__":
main()