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:35] cnaumann |
ws1314:audio [2016/05/10 14:46] (aktuell) |
||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
- | ====== Töne selbst erzeugen ====== | + | ====== Audio ====== |
- | Bei uns geht es darum Töne/Geräusche zu erzeugen, was hauptsächlich über die Erzeugung von Sinuskurven mit verschiedenen Frequenzen und Amplituden realisierbar ist. | + | ===== 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. | ||
+ | ==== 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> | ||
def erzeuge_sinus(f,T): | def erzeuge_sinus(f,T): | ||
- | |||
global RATE | global RATE | ||
- | |||
yy=np.zeros(int(T*RATE)) | yy=np.zeros(int(T*RATE)) | ||
- | |||
for i in range(0,len(yy)): | for i in range(0,len(yy)): | ||
- | |||
yy[i]=np.sin(2*np.pi*f*i/float(RATE)) | yy[i]=np.sin(2*np.pi*f*i/float(RATE)) | ||
- | |||
return yy | return yy | ||
</code> | </code> | ||
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 31: | 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 41: | 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 66: | 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 93: | 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. |
- | ''Code Text'' | + | |
- | Da wir hier leider auf Speicher Probleme stießen, mussten wir doch auf den in Numpy vorhandenen Fast-Fourier-Transformation Code zurückgreifen: | + | ==== Diskret ==== |
- | ''Code Text'' | + | Zunächst haben wir probiert selbst einen Code für die Diskrete Fourier Transformation zu implementieren. Dieser sieht folgendermaßen aus: |
+ | <code python> | ||
+ | </code> | ||
- | __**KRASSER SHIT ODER!?**__ | + | ==== Fast ==== |
+ | 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> |