2017-12-05 9 views
1

Ich versuche, (Audio) -Signal von Einzelton, Frequenz, die sich im Laufe der Zeit ändert.Liste der Frequenzen in Zeit zu signalisieren in Python

Ich habe Ton als 1D-Array numpy: freq = [100, 102, 103, 100, 115, 113, ..., 430]

Jeden Wert Korrespondenten kein N (beispielsweise 100) Proben. Ich weiß, wie man sicherstellt, dass es jedem Muster entspricht (N = 1). (es kann wachsen und fallen während der Zeit)

Jetzt brauche ich diese Frequenz 'Kurve' konvertieren Sinus-Signal.

Ich weiß über scipy.signal.sweep_poly (und ähnliche) Funktionen, aber ich kann Frequenz nicht als Polynom beschreiben.

Bitte, können Sie mir helfen, wie kann ich ein Signal aus der Frequenzliste erzeugen?

Vielen Dank!

+0

verfügbar. Wenn Sie 'N = 1 'wissen, können Sie diese Lösung nicht einfach auf' freq = np.repeat (freq, N) 'anwenden? –

+0

@PaulPanzer Ja, das weiß ich. Ich muss Sinussignal (als Audiosignal) mit wechselnder Frequenz in der Zeit erzeugen. –

+0

Die Frequenz ist die Ableitung der Phase. Wenn sich die Frequenz im Laufe der Zeit ändert, müssen Sie die aktuelle Phase als Integral über die Frequenz berechnen. Dies ist, was @PaulPanzer in der Antwort unten mit "Cumsum" diskret annähert. – kazemakase

Antwort

0

nicht sicher, ob ich verstehen 100%, was Sie wollen, aber wie wäre es:

freqs = np.random.uniform(100, 400, (20,)) 
times = np.cumsum(np.random.uniform(0.01, 0.02, (20,))) 
# or np.arange(20)/sample_freq if evenly sampled 
grid, dt = np.linspace(0, times[-1], 10000, retstep=True) 
signal = np.sin(2*np.pi*dt*np.cumsum(np.interp(grid, times, freqs))) 

Dieser verwendet eine lineare Interpolation zwischen den abgetasteten Zeitpunkten. Andere Methoden sind in scipy.interpolate

+0

Das ist genau das, was ich brauche. Danke @Paul Panzer! –

Verwandte Themen