最有效的方法是生成100个数字的数组,形成下面的三角波形状,最大/最小振幅为0.5?
记住三角波形:
答案 0 :(得分:8)
使用发电机:
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]
答案 1 :(得分:6)
生成三角波的最简单方法是使用signal.sawtooth。请注意,signal.sawtooth(phi,width)接受两个参数。第一个参数是阶段,下一个参数指定对称性。 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)
答案 2 :(得分:2)
三角形是锯齿的绝对值。
from scipy import signal
time=np.arange(0,1,0.001)
freq=3
tri=np.abs(signal.sawtooth(2 * np.pi * freq * time))
答案 3 :(得分:1)
您可以使用迭代器生成器和numpy fromiter方法。
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")
现在你有一个带方波的数组。
答案 4 :(得分:0)
这是一个用于三角形信号的自制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)