Hier werden die Unterschiede zwischen zwei Versionen gezeigt.
Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
ws1314:audio [2014/03/04 12:42] cnaumann |
ws1314:audio [2016/05/10 14:46] (aktuell) |
||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
- | ====== Töne selbst erzeugen ====== | + | ====== Audio ====== |
+ | ===== Töne selbst erzeugen ===== | ||
Bei uns ging es zunächst darum Töne zu erzeugen, was hauptsächlich über die Erzeugung von Sinuskurven mit verschiedenen Frequenzen und Amplituden realisierbar ist. | Bei uns ging es zunächst darum Töne zu erzeugen, was hauptsächlich über die Erzeugung von Sinuskurven mit verschiedenen Frequenzen und Amplituden realisierbar ist. | ||
+ | ==== Eigene Variante ==== | ||
Eine Sinuskurve allgemein mit variabler Frequenz und Amplitude zu erzeugen ist mit dem Modul Numpy relativ einfach. | Eine Sinuskurve allgemein mit variabler Frequenz und Amplitude zu erzeugen ist mit dem Modul Numpy relativ einfach. | ||
<code python> | <code python> | ||
Zeile 14: | Zeile 16: | ||
Mit diesem Code kann man einzelne Sinuskurven generieren. | Mit diesem Code kann man einzelne Sinuskurven generieren. | ||
+ | Ebenso kann man die Sinuskurve durch verschiedene periodische Funktionen begrenzen, wodurch sich die Töne ebenfalls modellieren lassen. | ||
+ | Als Beispiel haben wir eine Dreiecksperiode: | ||
+ | <code python> | ||
+ | def erzeuge_dreieckhk(T0,T1,T=2.): | ||
+ | global RATE | ||
+ | yy=np.zeros(int(T*RATE)) | ||
+ | for i in range(0,len(yy)): | ||
+ | t=i/float(RATE) | ||
+ | if 0<=t<=T0: | ||
+ | yy[i]=t/float(T0) | ||
+ | elif T0<t<=T1: | ||
+ | yy[i]=-t/float(T1-T0)+T1/float(T1-T0) | ||
+ | return yy | ||
+ | def erzeuge_dreieckperiode(frq,T=2.): | ||
+ | global RATE | ||
+ | T_periode=1./frq | ||
+ | ya=erzeuge_dreieckhk(T_periode/2.,T_periode/2.,T=T_periode) | ||
+ | y=ya.copy() | ||
+ | for i in range(0,int(T*frq)): | ||
+ | y=np.concatenate((y,ya)) | ||
+ | return y | ||
+ | </code> | ||
+ | |||
+ | |||
+ | ==== Mit Stefans Hilfe ==== | ||
Da wir allerdings mehrere Sinuskurven mit unterschiedlichen Frequenzen und Amplituden aneinanderreihen wollten, mussten wir uns Gedanken machen, wie wir das Umsetzen. Da dies und das erstellen eines Interface über unseren Fähigkeiten lag, hat Stefan uns bei der Lösung dieser Probleme ausgeholfen. | Da wir allerdings mehrere Sinuskurven mit unterschiedlichen Frequenzen und Amplituden aneinanderreihen wollten, mussten wir uns Gedanken machen, wie wir das Umsetzen. Da dies und das erstellen eines Interface über unseren Fähigkeiten lag, hat Stefan uns bei der Lösung dieser Probleme ausgeholfen. | ||
Hierbei entstand folgender krasser Code: | Hierbei entstand folgender krasser Code: | ||
- | |||
<code python> | <code python> | ||
#### Sinusgenerator-Klasse | #### Sinusgenerator-Klasse | ||
- | |||
class sinus_generator(generator): | class sinus_generator(generator): | ||
'''Sinus-Tongenerator''' | '''Sinus-Tongenerator''' | ||
Zeile 26: | Zeile 51: | ||
self.freq=freq | self.freq=freq | ||
self.phaseshift=0.0 | self.phaseshift=0.0 | ||
- | + | ||
- | + | ||
def generate(self,T): | def generate(self,T): | ||
'''Erzeugt einen Sinusklang der Dauer T. | '''Erzeugt einen Sinusklang der Dauer T. | ||
Zeile 36: | Zeile 60: | ||
+self.phaseshift*np.ones(int(T*RATE)) | +self.phaseshift*np.ones(int(T*RATE)) | ||
yy=np.sin(yy) | yy=np.sin(yy) | ||
- | self.phaseshift+=T*2*np.pi*self.freq | + | self.phaseshift+=T*2*np.pi*self.freq |
- | + | ||
return yy.copy() | return yy.copy() | ||
+ | |||
class fm_generator(generator): | class fm_generator(generator): | ||
Zeile 61: | Zeile 85: | ||
return yy.copy() | return yy.copy() | ||
- | |||
- | |||
- | |||
#### Der 'große Generator', der aus Verknüpfung von anderen besteht: | #### Der 'große Generator', der aus Verknüpfung von anderen besteht: | ||
Zeile 88: | Zeile 109: | ||
</code> | </code> | ||
- | __**KRASSER SHIT ODER!?**__ | + | |
===== Fourier Transformation ===== | ===== Fourier Transformation ===== | ||
- | Zunächst haben wir probiert selbst einen Code für die Fourier Transformation zu implementieren. Dieser sieht folgendermaßen aus: | + | Mit der Fourier Transformation lassen sich unter anderem bereits existente Töne analysieren und in Daten umwandeln, sodass man sie modellieren kann. |
+ | |||
+ | ==== Diskret ==== | ||
+ | Zunächst haben wir probiert selbst einen Code für die Diskrete Fourier Transformation zu implementieren. Dieser sieht folgendermaßen aus: | ||
<code python> | <code python> | ||
</code> | </code> | ||
+ | ==== Fast ==== | ||
Da wir hier leider auf Speicher Probleme stießen, mussten wir doch auf den in Numpy vorhandenen Fast-Fourier-Transformation Code zurückgreifen: | Da wir hier leider auf Speicher Probleme stießen, mussten wir doch auf den in Numpy vorhandenen Fast-Fourier-Transformation Code zurückgreifen: | ||
<code python> | <code python> | ||
</code> | </code> | ||
- | |||
- | |||
- | __**KRASSER SHIT ODER!?**__ |