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
Exemple #2
0
    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
Exemple #3
0
    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()
Exemple #5
0
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
Exemple #6
0
    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
Exemple #7
0
    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
Exemple #9
0
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"
#)
Exemple #11
0
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)
Exemple #13
0
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()
Exemple #14
0
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)



Exemple #15
0
#     .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)
Exemple #17
0
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)
Exemple #18
0
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()\