MP Assignment 6
MP Assignment 6
Solution 1:
import numpy as np
import matplotlib.pyplot as plt
def gen_sig(sr, amp=1,freq = 1):
ts= 1.0/sr
t = np.arange(0,1,ts)
x= amp*np.sin(2*np.pi*freq*t)
return x,t
sr = 100
x,t = gen_sig(100)
freq1, freq2, freq3 = 1, 4, 7
amp1, amp2, amp3 = 3, 1, 0.5
phase = 0
signal1,t = gen_sig(100,3,1)
signal2,t = gen_sig(100,1,4)
signal3,t = gen_sig(100,0.5,7)
resultant_signal = signal1 + signal2 + signal3
plt.figure()
plt.subplot(221)
plt.plot(t, signal1,label= "frequency=1, Amplitude=4")
plt.title('Signal 1: {} Hz, {} Amplitude'.format(freq1, amp1))
plt.ylabel("Amplitude")
plt.legend()
plt.grid()
plt.subplot(2, 2, 2)
plt.plot(t, signal2,label= "frequency=4 , Amplitude=1")
plt.title('Signal 2: {} Hz, {} Amplitude'.format(freq2, amp2))
plt.ylabel("Amplitude")
plt.legend()
plt.grid()
plt.subplot(2, 2, 3)
plt.plot(t, signal3,label= "frequency=4 , Amplitude=1")
plt.title('Signal 3: {} Hz, {} Amplitude'.format(freq3, amp3))
plt.ylabel("Amplitude")
plt.legend()
plt.grid()
plt.subplot(2, 2, 4)
plt.plot(t, resultant_signal, color='red',label="Resuntant wave")
plt.title('Superimposed Signal')
plt.ylabel("Amplitude")
plt.legend()
plt.grid()
plt.tight_layout()
def DFT(h):
N = len(h)
H = np.zeros(N,dtype = "complex_")
for k in range(N):
for i in range(N):
H[k]+= h[i]* np.exp(-2j*np.pi*k*i/N)
return H,N
fre_secp1,N1= DFT(signal1)
fre_secp2,N2= DFT(signal2)
fre_secp3,N3= DFT(signal3)
fre_secp_rest,Nr= DFT(resultant_signal)
plt.figure()
plt.subplot(2,2,1)
plt.stem(np.abs(fre_secp1)/N1,use_line_collection=True,markerfmt=" ")
plt.title("Frequency spectrum of Signal 1")
plt.xlabel("Frequency Bin")
plt.ylabel("Amplitude")
plt.grid()
plt.subplot(2,2,2)
plt.stem(np.abs(fre_secp2)/N2,use_line_collection=True,markerfmt=" ")
plt.title("Frequency spectrum of Signal 2")
plt.xlabel("Frequency Bin")
plt.ylabel("Amplitude")
plt.grid()
plt.subplot(2,2,3)
plt.stem(np.abs(fre_secp3)/N3,use_line_collection=True,markerfmt=" ")
plt.title("Frequency spectrum of Signal 3")
plt.xlabel("Frequency Bin")
plt.ylabel("Amplitude")
plt.grid()
plt.subplot(2,2,4)
plt.stem(np.abs(fre_secp_rest)/Nr,use_line_collection=True,markerfmt=" ")
plt.title("Frequency spectrum of Resultant Signal")
plt.xlabel("Frequency Bin")
plt.ylabel("Amplitude")
plt.grid()
plt.tight_layout()
def IDFT(h):
N = len(h)
H = np.zeros(N,dtype = "complex_")
for k in range(N):
for i in range(N):
H[k]+= h[i]* np.exp(2j*np.pi*k*i/N)
return H,N
reconstructed,NRC = IDFT(resultant_signal)
plt.figure()
plt.subplot(2,1,1)
plt.stem(np.abs(fre_secp_rest)/Nr,use_line_collection=True,markerfmt=" ")
plt.title("Frequency spectrum of Resultant Signal(Frequency Domain)")
plt.xlabel("Frequency Bin")
plt.ylabel("Amplitude")
plt.grid()
plt.subplot(2,1,2)
plt.stem(np.abs(reconstructed)/NRC,use_line_collection=True,basefmt="-b",markerfmt=" ")
plt.title("Frequency spectrum of Resultant Signal(Time Domain)")
plt.xlabel("Frequency Bin")
plt.ylabel("Amplitude")
plt.grid()
plt.tight_layout()
Plots:
Solution 2:
import numpy as np
import matplotlib.pyplot as plt
from scipy.fft import fft, ifft
def gen_sig(sr ,tp):
ts= 1.0/sr
t = np.arange(0,tp,ts)
x= 8 * np.sin(6 * np.pi * t) * np.cos(2 * np.pi * t) + 3 * np.sin(8 * np.pi * t) + 6 * np.sin(4 * np.pi
* t)
return x,t
sampling_rates = [2**i for i in range(0,6,1)]
print(sampling_rates)
plt.figure(figsize=(12,15))
for i in range(0,6):
signal,t = gen_sig(sampling_rates[i],2)
plt.subplot(6, 2, 1*i +1)
plt.plot(t, signal)
plt.title(f'Time Domain Signal (Sampling Rate = {sampling_rates[i]} Hz)')
plt.xlabel('Time (s)')
plt.ylabel('f(t)')
plt.grid()
plt.tight_layout()
plt.figure(figsize=(12,15))
for i in range(0,6):
signal,t = gen_sig(sampling_rates[i],2)
frequency_spectrum= fft(signal)
plt.subplot(6, 2, 1*i +1)
plt.stem(np.abs(frequency_spectrum),markerfmt=" ")
plt.title('Frequency Spectrum')
plt.xlabel('Frequency Bin')
plt.ylabel('Amplitude')
plt.grid()
plt.tight_layout()
print("The Nyquist-Shannon sampling theorem states that the minimum sampling \n rate
should be at least twice the maximum frequency present in the \n signal to avoid aliasing. In
this case, the signal has components \nwith frequencies of 6π, 2π, 8π, and 4π. Therefore, the
minimum ,\n sampling rate should be greater than 2 * 8π (which is the maximum\n frequency")
plt.figure(figsize=(12,15))
for i in range(0,6):
signal,t = gen_sig(sampling_rates[i],2)
frequency_spectrum= fft(signal)
frequency_spectrum_inv = ifft(frequency_spectrum)
plt.subplot(6, 2, 1*i +1)
plt.stem(np.abs(frequency_spectrum_inv),markerfmt=" ")
plt.title('Reconstructed ime Domain SIgnal')
plt.xlabel('Frequency Bin')
plt.ylabel('Reconstructed f(t)')
plt.grid()
plt.tight_layout()
plt.show()
Console Output:
PLOT:
Solution 3:
import numpy as np
def FFT(x):
N = len(x)
if N == 1:
return x
else:
X_even = FFT(x[::2])
X_odd = FFT(x[1::2])
return X
def gen_sig1(sr):
ts = 1.0 / sr
t = np.arange(0, 1, ts)
x = np.cos(10*np.pi*t)
return x, t
def gen_sig2(sr):
ts = 1.0 / sr
t = np.arange(0, 1, ts)
x = np.exp(-4*t)*np.cos(10*np.pi*t)
return x, t
t1,t= gen_sig1(64)
t2,t= gen_sig2(64)
plt.subplot(2,1,1)
plt.xlabel("TIme")
plt.ylabel("Amplitube")
plt.grid()
plt.subplot(2,1,2)
plt.plot(t,t2)
plt.xlabel("TIme")
plt.ylabel("Amplitube")
plt.grid()
plt.tight_layout()
plt.figure()
ft1= FFT(t1)
ft2= FFT(t2)
plt.subplot(211)
plt.stem(np.abs(ft1),markerfmt=" ")
plt.xlabel('Frequency Bin')
plt.ylabel('Amplitude')
plt.grid()
plt.subplot(212)
plt.stem(np.abs(ft1),markerfmt=" ")
plt.xlabel('Frequency Bin')
plt.ylabel('Amplitude')
plt.grid()
plt.tight_layout()
print("The spectrum should show peaks at frequencies corresponding to 10π and 10π - 4.The
magnitude of these peaks represents the amplitudes of the cosine waves.")
Console Output:
The spectrum should show peaks at frequencies corresponding to 10π and 10π - 4.The
magnitude of these peaks represents the amplitudes of the cosine waves.
PLOT:
Solution 4:
import numpy as np
ts= 1.0/sr
t = np.arange(ti,tp+ts,ts)
x=((1/(np.sqrt(2*np.pi*si**2))*np.exp(-(t)**2)/(2*si**2)))
return x,t
ts= 1.0/sr
t = np.arange(ti,tp+ts,ts)
x=((1/(np.sqrt(2*np.pi*si**2))*np.exp(-(t-5)**2)/(2*si**2)))
return x,t
def sine(sr ,ti,tp):
ts= 1.0/sr
t = np.arange(ti,tp+ts,ts)
x= np.sin(10*np.pi*t + (np.pi/6))
return x,t
def rss(sr,ti,tp):
ts= 1.0/sr
t = np.arange(ti,tp+ts,ts)
x= np.abs(np.sin(10*np.pi*t + (np.pi/6)))
return x,t
def rect(sr,ti,tp):
ts= 1.0/sr
t = np.arange(ti,tp+ts,ts)
x = np.zeros(len(t))
return x,t
plt.figure(figsize = (15,10))
plt.subplot(321)
plt.plot(t, s1)
plt.ylabel("Amplitude")
plt.xlabel("Time")
plt.grid()
plt.subplot(323)
plt.plot(t, s2)
plt.ylabel("Amplitude")
plt.xlabel("Time")
plt.grid()
plt.subplot(325)
plt.plot(t, s3)
plt.ylabel("Amplitude")
plt.xlabel("Time")
plt.grid()
plt.subplot(322)
f1= fft(s1)
plt.stem((np.abs(f1))**2/(len(f1)**2),markerfmt=" ")
plt.xlabel('Frequency Bin')
plt.ylabel('Amplitude')
plt.grid()
plt.subplot(324)
f2= fft(s2)
plt.stem((np.abs(f2))**2/(len(f2)**2),markerfmt=" ")
plt.xlabel('Frequency Bin')
plt.ylabel('Amplitude')
plt.grid()
plt.subplot(326)
f3= fft(s3)
plt.stem((np.abs(f3))**2/(len(f3)**2),markerfmt=" ")
plt.xlabel('Frequency Bin')
plt.ylabel('Amplitude')
plt.grid()
plt.tight_layout()
plt.figure()
plt.subplot(211)
plt.plot(t, s21)
plt.ylabel("Amplitude")
plt.xlabel("Time")
plt.grid()
plt.subplot(212)
f21= fft(s21)
plt.stem((np.abs(f21))**2/(len(f21)**2),markerfmt=" ")
plt.xlabel('Frequency Bin')
plt.ylabel('Amplitude')
plt.grid()
plt.tight_layout()
plt.figure()
plt.subplot(211)
s31, t = sine(1000, 0, 1)
plt.plot(t, s31)
plt.ylabel("Amplitude")
plt.xlabel("Time")
plt.grid()
plt.subplot(212)
f31= fft(s31)
plt.stem((np.abs(f31))**2/(len(f31)**2),markerfmt=" ")
plt.xlabel('Frequency Bin')
plt.ylabel('Amplitude')
plt.grid()
plt.tight_layout()
plt.figure()
plt.subplot(211)
s41, t = rss(100, 0, 1)
plt.plot(t, s41)
plt.ylabel("Amplitude")
plt.xlabel("Time")
plt.grid()
plt.subplot(212)
f41= fft(s41)
plt.stem((np.abs(f41))**2/(len(f41)**2),markerfmt=" ")
plt.xlabel('Frequency Bin')
plt.ylabel('Amplitude')
plt.grid()
plt.tight_layout()
plt.figure()
plt.subplot(211)
s51, t = rect(1000, 0, 1)
plt.plot(t, s51)
plt.ylabel("Amplitude")
plt.xlabel("Time")
plt.grid()
plt.subplot(212)
f51= fft(s51)
plt.stem((np.abs(f51))**2/(len(f51)**2),markerfmt=" ")
plt.xlabel('Frequency Bin')
plt.ylabel('Amplitude')
plt.grid()
plt.tight_layout()
PLOT: