diff --git a/src/SimNDT/core/signal.py b/src/SimNDT/core/signal.py new file mode 100644 index 0000000..3e65a66 --- /dev/null +++ b/src/SimNDT/core/signal.py @@ -0,0 +1,91 @@ +import numpy as np +from math import pi, cos, sin +import matplotlib.pyplot as plt + +def RaisedCosinePulse(t, Freq, Amplitude): + """ + Raised-Cosine Pulse + + """ + N = np.size(t,0) + P = np.zeros((N,),dtype=np.float32) + for m in range(0,N): + if t[m] <= 2.0/Freq: + P[m] = Amplitude *(1-cos(pi*Freq*t[m]))*cos(2*pi*Freq*t[m]) + + return P + + +def PulseUTsin(t,fc,NT, Amp): + """ + Gaussian Pulse + + Code inspired by + see http://www.k-wave.org/ + """ + def gaussian_func(x,mean,variance): + return np.exp(-((x - mean)**2)/(2*variance)) + + + Ts = t[1]-t[0] + Fs = 1.0/Ts + tone_length = ( NT/(fc*1.0) ) + tone_t = np.arange(0,tone_length,Ts) + tone_burst_t = np.sin(2*pi*fc*tone_t) + + x_lim = 3 + window_x = np.arange(-x_lim,x_lim, 2.0*x_lim/(np.size(tone_burst_t)-1) ) + window = gaussian_func(window_x,0, 1) + + ind = np.min([ np.size(window_x), np.size(tone_burst_t)]) + tone_burst=np.zeros((ind,)) + tone_burst[0:ind] = window[0:ind]*tone_burst_t[0:ind] + + y = np.zeros((np.size(t),)) + + + #plt.figure() + #plt.plot(tone_burst) + #plt.show() + try: + y[0:np.size(tone_burst)] = Amp*tone_burst[:] + return y + except: + raise Exception("Signal does not fit in the Configured Time, Increase the Simulation Time to solve this issue") + + + +class Signals(): + + def __init__(self, Name="RaisedCosine", Amplitud=1, Frequency=1, N_Cycles=1): + + self.Name = Name + self.Amplitude = Amplitud + self.Frequency = Frequency + self.N_Cycles = N_Cycles + + + def __str__(self): + return "Signal: Name={}, Amplitude={}, Frequency={}, N_Cycles={}".format( + self.Name, self.Amplitude, self.Frequency, self.N_Cycles + ).encode('utf-8') + + def __repr__(self): + return "Signals(Name='{}', Amplitude={}, Frequency={}, N_Cycles={})".format( + self.Name, self.Amplitude, self.Frequency, self.N_Cycles + ).encode('utf-8') + + + def generate(self, t): + if self.Name == "RaisedCosine": + return RaisedCosinePulse(t, self.Frequency, self.Amplitude) + elif self.Name == "GaussianSine": + return PulseUTsin(t,self.Frequency,self.N_Cycles,self.Amplitude) + + def save(self,t): + self.time_signal = self.generate(t) + + + + +