14

最大/最小振幅が0.5で、下の三角波の形を形成する100個の数値の配列を生成する最も効率的な方法は何ですか?

三角波を念頭に置いて:

ここに画像の説明を入力してください

4

6 に答える 6

19

三角波を生成する最も簡単な方法は、signal.sawtoothを使用することです。signal.sawtooth(phi、width)が2つの引数を受け入れることに注意してください。最初の引数は位相であり、次の引数は対称性を指定します。width = 1は右側の鋸歯を示し、width = 0は左側の鋸歯を示し、width=0.5は対称三角形を示します。楽しみ!

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)
于 2016-01-18T21:52:10.517 に答える
9

ジェネレーターを使用します。

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

これは、4で割り切れる長さの場合は正常に機能し、他の長さの場合は最大3つの値を見逃す可能性があります。

>>> 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]
于 2012-09-08T16:33:57.580 に答える
6

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]]
于 2012-09-10T06:35:34.570 に答える
5

三角形はのこぎり波の絶対値です。

from scipy import signal
time=np.arange(0,1,0.001)
freq=3
tri=np.abs(signal.sawtooth(2 * np.pi * freq * time)) 
于 2016-01-11T23:19:19.040 に答える
1

numpyfromiterメソッドと一緒にイテレータージェネレーターを使用できます。

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

これで、方形波の配列ができました。

于 2012-09-08T17:01:02.970 に答える
1

これが三角信号用の自家製のPython関数です

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)
于 2018-03-22T16:47:50.307 に答える