ich habe folgendes Problem, dass ich der Kürze halber in Code ausdrücke. Wo liegt mein Denkfehler?
Code: Alles auswählen
import numpy as np
Tau = 2*np.pi
iseq = np.arange(44100)
def osc(freq, phase):
return np.sin(
Tau * (iseq * freq / iseq.size + phase/360)
)
signal = osc(440, 40)
sinphasor = osc(440, 0)
cosphasor = osc(440, 90)
def segments(array, resolution=100):
samples_per_segment = int(iseq.size / resolution + 0.5)
out = list()
position = 0
for i in range(resolution):
segment_sum = sum(array[
position:position+samples_per_segment
])
out.append(segment_sum / samples_per_segment)
position += samples_per_segment
return np.array(out)
sinprobe = segments(signal * sinphasor)
cosprobe = segments(signal * cosphasor)
print("Mittlere Phase ist {}, aber ich hätte {} erwartet".format(np.mean(np.arctan2(sinprobe, cosprobe)) / Tau * 360, 40))
print("Ditto beim ersten Element des Eingangssignals: {} != {}".format(np.arctan2(np.sin(signal[0]), np.cos(signal[0])) / Tau * 360, 40))
print("Aber warum geht dann das? {} == {}".format(np.arctan2(np.sin(Tau * 40/360), np.cos(Tau * 40/360)) / Tau * 360, 40))
Falls Kontext interessiert:
Ich betreibe Soundanalyse, nachdem die Soundsynthese¹, bewusst weder modular noch plugin/filter-basiert (die Natur funktioniert auch nicht so), aber nicht in Echtzeit (obwohl in der Natur das in Echtzeit abläuft), schon recht gut funktioniert.
Üblicherweise verwendet man dazu Fast-Fourier-Transformation und, wenn die zeitliche Klangentwicklung wichtig ist, Wavelet-Spektrogramme. Ist mir zu ungenau, um motiviert zu sein, das nachzunutzen oder so nachzuprogrammieren, dass mir Werte ausgegeben werden statt Farbcodierungen.
Lieber will ich das ganze eh von Grund auf verstehen, indem ich das selber mache. Ich suche nach Wegen, die Soundanalyse detaillierter aufzuziehen. So stell ich mir das vor: Dem Analysetool in spe gebe ich also eine Sounddatei und eine Instrumentendefinition in Verbindung mit den Eigenschaften der zu spielenden Note. Das Programm gibt dann eine 3D-Säulen-Graphik aus, der die Unterschiede zwischen dem Klang, der gemäß der Definition und der Noteneigenschaften gerendert würde, und dem Vergleichsklang visuell interpretierbar macht und es somit ermöglicht, die Instrumentendefinition an ein gegebenes Soll anzugleichen und mich dabei nicht allein auf meine Ohren zu verlassen. Wenn ich mit der angepassten Instrumentendefinition und bestimmten Noteneigenschaften Audiodaten generiere, und diese Audiodaten wiederum als Eingangssignal und dieselbe Instrumentdefinition und die Noteneigenschaften als Parameter an das fragliche Analysetool verfüttere, muss es, wenn es richtig funktioniert, einen rechteckigen Wald gleich hoher, einfarbiger Säulen ausgeben. Eine Seite des Rechtecks ist die Frequenzdomäne, die andere die Zeitdomäne, die Höhe der Säulen ist die Amplitude, die durch die Amplitude der Sollhüllkurve des jeweiligen Teiltons geteilt wird, also ideal =1. Entspricht der Sound nicht exakt dem Sollzustand, haben die Säulen zum Beispiel einen andersfarbigen Anteil, der über die momentane Abweichung von der mittleren Phase Auskunft gibt. Da ich also die Phase verfolgen muss, komme ich mit imaginären Zahlen, die sie wegabstrahieren würden, nicht weiter.
_________
Off-Topic:
¹) Programmierer und (sehr) nerdige Musiker könnten an meinem OSS-Projekt Sompyler oder an der Mitarbeit daran interessiert sein.