Qual è il modo più efficiente per produrre una matrice di 100 numeri che formano la forma dell'onda triangolare sottostante, con un'ampiezza massima/minima di 0,5?Array triangolare a forma di onda in Python
Triangolo forma d'onda in mente:
Qual è il modo più efficiente per produrre una matrice di 100 numeri che formano la forma dell'onda triangolare sottostante, con un'ampiezza massima/minima di 0,5?Array triangolare a forma di onda in Python
Triangolo forma d'onda in mente:
utilizzare un generatore:
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
Questo sarà il lavoro bene per una lunghezza divisibile per 4, si può perdere fino a 3 valori per altri lunghezze.
>>> 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]
È possibile utilizzare un generatore di iteratore insieme al metodo di 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")
Ora si dispone di un array con l'onda quadra.
Per utilizzare 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]]
Triangolo valore assoluto del dente di sega.
from scipy import signal
time=np.arange(0,1,0.001)
freq=3
tri=np.abs(signal.sawtooth(2 * np.pi * freq * time))
Il modo più semplice per generare un'onda triangolare è utilizzare signal.sawtooth. Si noti che signal.sawtooth (phi, width) accetta due argomenti. Il primo argomento è la fase, l'argomento successivo specifica la simmetria. width = 1 dà un dente di sega a destra, larghezza = 0 dà un dente di sega a sinistra e larghezza = 0,5 dà un triangolo simmetrico. Godere!
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)
hai bisogno solo di organizzare la struttura dei dati o di disegnare anche una rappresentazione grafica? –
Solo bisogno di fare una matrice di 100 voci di dati che prendono quella forma. Rappresentazione grafica non necessaria! – 8765674
Wikipedia ha 3 diverse formule che è possibile utilizzare per calcolare un'onda triangolare: http://en.wikipedia.org/wiki/Triangle_wave#Definitions Ci potrebbero essere modi più rapidi, ma l'implementazione di una di queste equazioni dovrebbe essere un buon punto di partenza. –