¿Cuál es la forma más eficiente de producir una matriz de 100 números que forman la forma de la onda triangular a continuación, con una amplitud máxima/mínima de 0.5?matriz en forma de onda triangular en Python
Triángulo de forma de onda en mente:
¿Cuál es la forma más eficiente de producir una matriz de 100 números que forman la forma de la onda triangular a continuación, con una amplitud máxima/mínima de 0.5?matriz en forma de onda triangular en Python
Triángulo de forma de onda en mente:
uso de un generador:
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
esto funcionará bien para una longitud divisible por 4, puede perder hasta 3 valores para otra longitudes.
>>> 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]
Puede usar un generador de iterador junto con el método numerado 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")
Ahora tiene una matriz con la onda cuadrada.
Para utilizar 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]]
triángulo es valor absoluto de diente de sierra.
from scipy import signal
time=np.arange(0,1,0.001)
freq=3
tri=np.abs(signal.sawtooth(2 * np.pi * freq * time))
La forma más sencilla de generar una onda triangular es mediante el uso de signal.sawtooth. Observe que signal.sawtooth (phi, width) acepta dos argumentos. El primer argumento es la fase, el siguiente argumento especifica la simetría. ancho = 1 da un diente de sierra de lado derecho, ancho = 0 da un diente de sierra de lado izquierdo y ancho = 0.5 da un triángulo simétrico. ¡Disfrutar!
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)
¿Necesita simplemente organizar la estructura de datos o dibujar una representación gráfica también? –
Solo necesita hacer una matriz de 100 entradas de datos que toman esa forma. ¡Representación gráfica no necesaria! – 8765674
Wikipedia tiene 3 fórmulas diferentes que puede usar para calcular una onda triangular: http://en.wikipedia.org/wiki/Triangle_wave#Definitions Puede haber formas más rápidas, pero implementar una de esas ecuaciones debería ser un buen punto de partida. –