def csvToSignal(data, field): while len(data["x-axis"]) > len(data[field]): data["x-axis"].pop() senial = Senial.Senial(data["x-axis"], data[field]) return senial
def addCSVQuotient(self, filename, name, color, fieldX, fieldA, fieldB, mode=DB): # get k such that kFieldA=fieldB data = read_csv.read_csv_bode(filename) signal1 = csvToSignal(data, fieldA, fieldX) signal2 = csvToSignal(data, fieldB, fieldX) if mode == DB: yvarFinal = [ signal2.values[i] - signal1.values[i] for i in range(len(signal1.values)) ] else: yvarFinal = [ signal2.values[i] / signal1.values[i] for i in range(len(signal1.values)) ] self.plotCount.append({ "signal": Senial.Senial(signal1.xvar, yvarFinal), "color": color, "name": name }) return self
def addSpiceBodePlot(self, filename, name, color, mode, color2=None, name2=None): spiceData = self.getSpiceData(filename) suma = 0 for i in range(len(spiceData["pha"])): if i > 0 and spiceData["pha"][i] + suma > 100 and spiceData["pha"][ i - 1] < -100: suma += -360 spiceData["pha"][i] += suma if mode == MAG: xdata = spiceData["f"] ydata = spiceData["abs"] elif mode == PHA: xdata = spiceData["f"] ydata = spiceData["pha"] elif mode == BOTH: xdata = spiceData["f"] ydata2 = spiceData["abs"] ydata = spiceData["pha"] else: raise Exception("Invalid mode ", mode, " selected") signal = Senial.Senial(xdata, ydata) if mode != BOTH: self.plotCount.append({ "signal": signal, "color": color, "name": name }) else: signal2 = Senial.Senial(xdata, ydata2) self.plotCount.append({ "signal": signal, "signal2": signal2, "color": color2, "name": name2, "color2": color, "name2": name }) return self
def joaco_spectrum2(): fmuestra = 30000 dmuestra = 1 / fmuestra xvar = arange(0, 2, dmuestra) print(xvar) # print(len(xvar)) periodSegundos = 0.2 period = periodSegundos / dmuestra fc = 1000 fm = 200 yvar = np.zeros(len(xvar)) for i in range(len(yvar)): if i % period <= period * 0.25: yvar[i] = 1 #*np.sin(2*np.pi*fc)*np.sin(2*np.pi*fm) else: yvar[i] = 0 s1 = Senial.Senial(xvar, yvar) s1f = FourierTransform.fourierTransform(s1) xaux = s1f.xvar tau = period * 0.25 print(1 / periodSegundos) yaux = [abs(np.sinc(it * 0.25)) for it in xaux] lxvar = len(s1f.xvar) / 2 lxvar2 = len(xaux) / 2 ExpressPlot.CombinedPlot()\ .setTitle("Espectro")\ .setXTitle("Frecuencia (Hz)")\ .setYTitle("Ampltiud (%)")\ .addSignalPlot( signal=Senial.Senial(s1f.xvar, s1f.values), color="blue",name="espectro1")\ .addSignalPlot( signal=Senial.Senial(xaux, yaux), color="orange", name="sinc" )\ .plotAndSave("testjoaco.png") # plt.plot(xaux,yaux,color="orange") plt.show()
def csvToSignal(data, fieldY, fieldX="x_axis"): try: while len(data[fieldX]) > len(data[fieldY]): data[fieldX].pop() except KeyError: pass senial = Senial.Senial(data[fieldX], data[fieldY]) return senial
def addExcelPlot(self, filename, fieldX, fieldY, color, name): info = pd.read_excel(filename) self.plotCount.append({ "signal": Senial.Senial(info[fieldX], info[fieldY]), "color": color, "name": name }) return self
def addSpiceBodePlot(self, filename, name, color, mode): spiceData = self.getSpiceData(filename) if mode == MAG: xdata = spiceData["f"] ydata = spiceData["abs"] elif mode == PHA: xdata = spiceData["f"] ydata = spiceData["abs"] else: raise Exception("Invalid mode ", mode, " selected") signal = Senial.Senial(xdata, ydata) self.plotCount.append({"signal": signal, "color": color, "name": name}) return self
def fourierTransform(senial): # Hacemos una aproximacion discreta muy buena de la transformada de fourier bilateral de la senial frecuencyStep = 1 / ( (len(senial.xvar) - 1) * senial.separation ) #la senial debe estar mostrada de manera equiespaciada fftOutput = 1 / len(senial.values) * abs(fft(senial.values)) iValsPositive = [] ampPositive = [] iValsNegative = [] ampNegative = [] for i in range(len(fftOutput) // 4): iValsPositive.append(i) ampPositive.append(fftOutput[i]) i = -1 while len(iValsNegative) + len(iValsPositive) < len(fftOutput) // 2: iValsNegative.append(i) ampNegative.append(fftOutput[i]) i = i - 1 iValsNegative.reverse() ampNegative.reverse() iVals = iValsNegative + iValsPositive amplitud = ampNegative + ampPositive frecuencies = [frecuencyStep * i for i in iVals] final_freq = [] final_amp = [] for i in range(len(frecuencies)): if abs(frecuencies[i]) < 10 * 1e3: final_freq.append(frecuencies[i]) final_amp.append(amplitud[i]) senial = Senial.Senial(final_freq, final_amp) return senial
def makeBodes(): config.GetConfigData().FAAfreq = 1600 f = logspace(2.3, 3.5, 200000) wrange = [fi * 2 * pi for fi in f] w, mag, pha = FiltroLP.getFiltroLP().getBode(wrange) frange = [wi / 2 / pi for wi in w] senialTeorica = Senial.Senial(frange, mag) ExpressPlot.CombinedPlot()\ .setTitle("Respuesta en frecuencia")\ .setXTitle("Frecuencia (Hz)")\ .setYTitle("Amplitud (dB)")\ .setLogarithmic()\ .addSignalPlot( signal=senialTeorica, color="blue", name="Teórica" )\ .addSpiceBodePlot( filename="ExpressInput/SimulacionV2/bode_Modulo_Sim.txt", color="red", name="Simulación", mode=ExpressPlot.MAG )\ .addCSVQuotient( filename="ExpressInput/Mediciones/Filtro FAA/bode_moduloFAA.csv", fieldX="Frequency (Hz)", fieldA="Channel 1 Magnitude (dB)", fieldB="Channel 2 Magnitude (dB)", color="green", name="Medición FR", )\ .plotAndSave(filename="ExpressOutput/bodeFiltrosCaso3.png") plt.show()
from math import cos, pi import numpy as np from util_python import Senial # 0.0022 # 0.00002 ok f = 440 xvar = np.linspace(0, 2, 100000) yvar = [cos(2 * pi * f * x) for x in xvar] Senial.Senial(xvar, yvar).writeCSV("Signals/cos_f_440.csv") #s2 = Senial.Senial().loadFromCSV( # "Signals/cos_f_440.csv" #)
from util_python import Senial from Systems import Ej5SystemC from ExpressPlot import ExpressPlot from numpy import pi fs = 44100 sys = Ej5SystemC.getSystem(rl=1, fc=250, fs=fs) w, H = sys.freqresp() w = w / 2 / pi * fs ExpressPlot.CombinedPlot()\ .setXTitle("Frecuencia (Hz)")\ .setYTitle("Amplitud (veces)")\ .addSignalPlot( signal=Senial.Senial(w, abs(H)), color="blue", name="Amplitud" )\ .plot()\ .show()
def calcularPlotMatchedZ(f0, fs, mode="butter", n=4, filename="out.png", title="noTitle"): w0 = 2 * pi * f0 if mode == "butter": b, a = signal.butter(n, w0, 'low', analog=True) elif mode == "cheby": b, a = signal.cheby1(n, 1, w0, 'low', analog=True) sys = signal.lti(b, a) w_range = linspace(0, fs, 100000) * 2 * pi w, h = signal.freqresp(sys, w_range) # signal.freqs(b, a, 100000) w_m2 = -1 for i in range(len(w)): if 20 * log10(abs(h[i])) <= -2 and w_m2 == -1: w_m2 = w[i] if mode == "butter": b, a = signal.butter(n, w0 * (w0 / w_m2), 'low', analog=True) elif mode == "cheby": b, a = signal.cheby1(n, 1, w0 * (w0 / w_m2), 'low', analog=True) sys = signal.lti(b, a) w, h = signal.freqresp(sys, w_range) f = w / 2 / pi poles = sys.poles zeros = sys.zeros new_poles = exp(poles / fs) new_zeros = exp(zeros / fs) new_zeros = np.hstack([new_zeros, [-1] * n]) # print(new_poles, new_zeros) sys = signal.dlti(new_zeros, new_poles, 1) w2, h2 = signal.dfreqresp(sys, w_range / fs) f = w / 2 / pi factor = h[0] / h2[0] f2 = w2 / 2 / pi * fs CombinedPlot() \ .setTitle(title) \ .setXTitle("Frecuencia (hz)") \ .setYTitle("Amplitud (Db)") \ .addSignalPlot( signal=Senial.Senial( f, 20 * log10(abs(h)) ), color="red", name="Analógica" ) \ .addSignalPlot( signal=Senial.Senial( f2, 20 * log10(abs(h2) * factor) ), color="blue", name="Digital método invariante al impulso" ).plot().save("output/" + filename)
def spectra_plot(medcsv, simxml, out, fmax=None): fmed = [] pmed = [] with open(medcsv, 'rt') as csvfile: reader = list(csv.reader(csvfile)) # hola = csv.reader(csvfile) reader.pop(0) # saco el header, me quedo solo con las mediciones if fmax is None: fmax = float(reader[-1][0]) for row in reader: f = float(row[0]) if f > fmax: break fmed.append(f) pmed.append((10**(float(row[1]) / 20))**2) #plt.plot(fmed, pmed) #plt.show() s1 = Senial.Senial(fmed, pmed) s_xml = SignalsReadWrite.readSignal(simxml) s2 = FourierTransform.fourierTransform(s_xml) fsim = [] psim = [] for f in s2.xvar: if f < 0: continue if f > fmax: break fsim.append(f) psim.append(s2.values[s2.xvar.index(f)]) s2.xvar = fsim s2.values = psim psum = sum(s2.values) s2.values = [v / psum * 100 for v in s2.values] psum = sum(pmed) s1.values = [v / psum * 100 for v in s1.values] ExpressPlot.CombinedPlot()\ .setTitle(" ")\ .setXTitle("Frecuencia (Hz)")\ .setYTitle("Potencia (% de total)")\ .addSignalPlot( signal=s1, color="orange", name="Medido" )\ .addSignalPlot( signal=s2, color="blue", name="Simulado" )\ .plotAndSave( filename=out ) plt.show()
w_range = linspace(0, fs, 100000) * 2 * pi w, h = signal.freqresp(tf, w_range) w2, h2 = signal.dfreqresp(tf2, w_range / fs) f = w / 2 / pi f2 = w2 / 2 / pi CombinedPlot() \ .setTitle("Legendre") \ .setXTitle("Frecuencia (hz)") \ .setYTitle("Amplitud (Db)") \ .addSignalPlot( signal=Senial.Senial( f, 20 * log10(abs(h)) ), color="red", name="Analógica" ) \ .addSignalPlot( signal=Senial.Senial( f2, 20 * log10(abs(h2)) ), color="blue", name="Digital método invariante al impulso" ).plot().show()#save("output/" + filename)
# .setFs(44100)\ # .plotAndSave( # "Output/polosSysA.png" # ) w, H = sys.freqresp() w = w/2/np.pi * fs/1000 ExpressPlot.CombinedPlot()\ .addSignalPlot( Senial.Senial(w, H), color="blue", name="Magnitud" )\ .setTitle("Respuesta en frecuencia")\ .setXTitle("Frecuencia (kHz)")\ .setYTitle("Amplitud (veces)")\ .plotAndSave( "Output/rtaFreq.png" ) sys = Ej5SystemA.getSystem( rl = 1, l = 100 )
def calcularPlotImpinvar(f0, fs, mode="butter", n=4, filename="out.png", title="noTitle"): w0 = 2 * pi * f0 print("f0 = ", f0) if mode == "butter": b, a = signal.butter(n, w0, 'low', analog=True) elif mode == "cheby": b, a = signal.cheby1(n, 1, w0, 'low', analog=True) sys = signal.lti(b, a) w_range = linspace(0, fs, 100000) * 2 * pi w, h = signal.freqresp(sys, w_range) # signal.freqs(b, a, 100000) w_m2 = -1 for i in range(len(w)): if 20 * log10(abs(h[i])) <= -2 and w_m2 == -1: w_m2 = w[i] if mode == "butter": b, a = signal.butter(n, w0 * (w0 / w_m2), 'low', analog=True) elif mode == "cheby": b, a = signal.cheby1(n, 1, w0 * (w0 / w_m2), 'low', analog=True) sys = signal.lti(b, a) sys_original = sys w, h = signal.freqresp(sys, w_range) f = w / 2 / pi b2, a2 = impinvar_causal(b, a, fs=fs, tol=0.0001) sys = signal.dlti(b2, a2) w2, h2 = signal.dfreqresp(sys, w_range / fs) factor = h[0] / h2[0] sys = signal.dlti(b2 / factor, a2) f2 = w2 / 2 / pi * fs CombinedPlot() \ .setTitle(title) \ .setXTitle("Frecuencia (hz)") \ .setYTitle("Amplitud (Db)") \ .addSignalPlot( signal=Senial.Senial( f, 20 * log10(abs(h)) ), color="red", name="Analógica" ).addSignalPlot( signal=Senial.Senial( f2, 20 * log10(abs(h2) * factor) ), color="blue", name="Digital método invariante al impulso" ).plot().save("output/" + filename)
l = 50 t = np.arange(0, 1, 1 / fs) noise = np.random.normal(0, 1, l) #2 * np.random.random_sample(l) - 1 empty = [0] * (len(t) - len(noise)) input = np.hstack([noise, empty]) rl = 1 y = Ej5SystemB.processSystemB(input, rl, l, b=0.5) t *= 1000 ExpressPlot.CombinedPlot()\ .addSignalPlot( Senial.Senial(t, y), color="blue", name="Rta a ruido uniforme" )\ .setTitle( "Respuesta a ruido uniforme longitud L=50" )\ .setXTitle("Tiempo (ms)")\ .setYTitle("Amplitud")\ .plotAndSave( "Output/rtaRuidoGauss2.png" )\ y = np.array(y) #PlaySound.playSound(y)
from util_python import Senial from ExpressPlot import ExpressPlot import matplotlib.pyplot as plt import mido from IPython.display import Audio import numpy as np from numpy import cos, sin, pi import simpleaudio as sa def synthetize(fs, wavetable, nsamples): samples = [] current_sample = 0 s1 = Senial.Senial().loadFromCSV( filename="Signals/cos_f_440.csv" ) do = 261.626 dob = 277.1826 re = 293.665 reb = 311.1270 mi = 329.628 fa = 349.228 fab = 369.9944 sol = 391.99 solb = 415.3047 la = 440.000 si = 493.883 ExpressPlot.CombinedPlot()\