Triangle wave shaped array in Python

前端 未结 6 1195
生来不讨喜
生来不讨喜 2021-02-08 04:22

What is the most efficient way to produce an array of 100 numbers that form the shape of the triangle wave below, with a max/min amplitude of 0.5?

Triangle waveform in m

相关标签:
6条回答
  • 2021-02-08 04:31

    Here is a home-made python function for triangular signals

    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 讨论(0)
  • 2021-02-08 04:33

    To use numpy:

    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]]
    
    0 讨论(0)
  • 2021-02-08 04:36

    You can use an iterator generator along with the numpy fromiter method.

    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")
    

    Now you have an array with the square wave.

    0 讨论(0)
  • 2021-02-08 04:38

    Triangle is absolute value of sawtooth.

    from scipy import signal
    time=np.arange(0,1,0.001)
    freq=3
    tri=np.abs(signal.sawtooth(2 * np.pi * freq * time)) 
    
    0 讨论(0)
  • 2021-02-08 04:48

    Use a 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
    

    This'll work fine for a length divisible by 4, you may miss up to 3 values for other lengths.

    >>> 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]
    
    0 讨论(0)
  • 2021-02-08 04:50

    The simplest way to generate a triangle wave is by using signal.sawtooth. Notice that signal.sawtooth(phi, width) accepts two arguments. The first argument is the phase, the next argument specifies the symmetry. width = 1 gives a right-sided sawtooth, width = 0 gives a left-sided sawtooth and width = 0.5 gives a symmetric triangle. Enjoy!

    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)
    
    0 讨论(0)
提交回复
热议问题