Frage Dreieckförmige Wellenform in Python


Was ist der effizienteste Weg, um ein Array von 100 Zahlen zu erzeugen, die die Form der darunter liegenden Dreieckswelle bilden, mit einer maximalen Amplitude von 0,5?

Dreiecksform im Auge:

enter image description here


10
2017-09-08 16:17


Ursprung


Antworten:


Benutze einen Generator:

def triangle(length, amplitude):
     section = length // 4
     for direction in (1, -1):
         for i in range(section):
             yield i * (amplitude / section) * direction
         for i in range(section):
             yield (amplitude - (i * (amplitude / section))) * direction

Dies funktioniert gut für eine Länge, die durch 4 teilbar ist. Sie können bis zu 3 Werte für andere Längen verpassen.

>>> list(triangle(100, 0.5))
[0.0, 0.02, 0.04, 0.06, 0.08, 0.1, 0.12, 0.14, 0.16, 0.18, 0.2, 0.22, 0.24, 0.26, 0.28, 0.3, 0.32, 0.34, 0.36, 0.38, 0.4, 0.42, 0.44, 0.46, 0.48, 0.5, 0.48, 0.46, 0.44, 0.42, 0.4, 0.38, 0.36, 0.33999999999999997, 0.32, 0.3, 0.28, 0.26, 0.24, 0.21999999999999997, 0.2, 0.18, 0.15999999999999998, 0.14, 0.12, 0.09999999999999998, 0.08000000000000002, 0.06, 0.03999999999999998, 0.020000000000000018, -0.0, -0.02, -0.04, -0.06, -0.08, -0.1, -0.12, -0.14, -0.16, -0.18, -0.2, -0.22, -0.24, -0.26, -0.28, -0.3, -0.32, -0.34, -0.36, -0.38, -0.4, -0.42, -0.44, -0.46, -0.48, -0.5, -0.48, -0.46, -0.44, -0.42, -0.4, -0.38, -0.36, -0.33999999999999997, -0.32, -0.3, -0.28, -0.26, -0.24, -0.21999999999999997, -0.2, -0.18, -0.15999999999999998, -0.14, -0.12, -0.09999999999999998, -0.08000000000000002, -0.06, -0.03999999999999998, -0.020000000000000018]

8
2017-09-08 16:33



Um numpy zu verwenden:

def triangle2(length, amplitude):
    section = length // 4
    x = np.linspace(0, amplitude, section+1)
    mx = -x
    return np.r_[x, x[-2::-1], mx[1:], mx[-2:0:-1]]

5
2017-09-10 06:35



Der einfachste Weg, um eine Dreieckswelle zu erzeugen, ist die Verwendung von signal.sawtooth. Beachten Sie, dass signal.sawtooth (phi, width) zwei Argumente akzeptiert. Das erste Argument ist die Phase, das nächste Argument gibt die Symmetrie an. width = 1 ergibt einen rechtsseitigen Sägezahn, width = 0 ergibt einen linksseitigen Sägezahn und width = 0.5 ergibt ein symmetrisches Dreieck. Genießen!

from scipy import signal
import numpy as np
import matplotlib.pyplot as plt
t = np.linspace(0, 1, 500)
triangle = signal.sawtooth(2 * np.pi * 5 * t, 0.5)
plt.plot(t, triangle)

4
2018-01-18 21:52



Dreieck ist der absolute Wert von Sägezahn.

from scipy import signal
time=np.arange(0,1,0.001)
freq=3
tri=np.abs(signal.sawtooth(2 * np.pi * freq * time)) 

2
2018-01-11 23:19



Sie können einen Iteratorgenerator zusammen mit der Methode numpy fromiter verwenden.

import numpy

def trigen(n, amp):
    y = 0
    x = 0
    s = amp / (n/4)
    while x < n:
        yield y
        y += s
        if abs(y) > amp:
            s *= -1
        x += 1

a = numpy.fromiter(trigen(100, 0.5), "d")

Jetzt haben Sie ein Array mit der Rechteckwelle.


1
2017-09-08 17:01



Hier ist eine hauseigene Python-Funktion für Dreieckssignale

import matplotlib.pyplot as plt
import numpy as np
phase=-10
length=30 # should be positive
amplitude=10
x=np.arange(0,100,0.1)
def triang(x,phase,length,amplitude):
    alpha=(amplitude)/(length/2)
    return -amplitude/2+amplitude*((x-phase)%length==length/2) \
            +alpha*((x-phase)%(length/2))*((x-phase)%length<=length/2) \
            +(amplitude-alpha*((x-phase)%(length/2)))*((x-phase)%length>length/2)

tr=triang(x,phase,length,amplitude)
plt.plot(tr)

0
2018-03-22 16:47