Entwickler-Ecke
Multimedia / Grafik - sound dämpfen
Andreas Pfau - Do 20.03.03 21:59
Titel: sound dämpfen
Hallo,
wie geht das, dass ich sounds dämpfe? Ich erstelle die PCM-Signale zur Laufzeit, und will, dass ich per Button eine Dämpfung von z.b. 10db zuschalten kann. Um wieviel % muss ich den Spitzenwert des Signals verringern? Oder wie berechnet man das?
MathiasH - Fr 21.03.03 16:06
Hallo Andreas
db ist keine lineare einteilung, d.h., dass es in den oberen frequenzbereichen viel und in den unteren wenig ausmacht.
Auch die berechnung dürfte schwierig sein, da du ja nicht weist, welche Lautsprecher der User hat, wie nah er dran sitzt usw. prinzipiel musste halt das a von a*sin(x*d) verringern um vielleicht 10% oder so
IO-sys/MathiasH
Andreas Pfau - Fr 21.03.03 19:34
:oops: Das hätte ich dazusagen müssen: Die Signale sollen als eine Art "Digitaler Funktionsgenerator" verwendet werden, also von der Soundkarte abgegriffen werden. Es dürfte keine Rolle spielen, welche Boxen der User hat (OK, die Soundhardware kann auch etwas ausmachen, denke ich).
Deine Formel ist nicht ganz einleuchtend. Könntest du sie mir bitte umformen, also z.B. "EndSpitzenwert=GrundSpitzenwert*DämpfungInDezibel"? Ich will ja nur wissen, wie hoch der Spitzenwert letzendlich ist, nach einer Dämpfung von z.b. 10db. Bzw, es ändert sich doch nur der Spitzenwert, oder? Oder verändert sich etwa auch die Höhe/Tiefe separat?
MathiasH - Sa 22.03.03 10:26
so wie ich mir das vogestellt hatte werden alle amplituden gestaucht, d.h. Höhen und Tiefen werden verkleinert, das a ist bei dir halt dann ein multiplikator für deine funktion: x |-> a* func(x), den höchsten wert kannste ja bei der Generierung der Funktion ermitteln, oder werden die werte nur on demand generiert?
IO-sys/mathiasH
Andreas Pfau - Sa 22.03.03 12:03
Das läuft ungefähr so:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| const Samples = 44100 div 1000 // 1000Hz var Chunk: Pointer; I: Integer; begin GetMem(Chunk, Samples * SizeOf(SmallInt)); For I := 0 To Samples - 1 Do PSmallInt(Integer(Chunk) + I * SizeOf(SmallInt))^ := Round(Sin(I / Samples * 2 * Pi) * $7FFFF); |
Ich hoffe, du verstesht das, wenn du das noch nie gemacht hast (erzeugt ein Sinus-Signal mit maximaler Amplitude).
Also, wenn ich das jetzt dämpfen will, muss ich das ganze (Amplitude) nur mit z.B. 0.9 multiplizieren (... * $7FFFF * 0.9), oder wie? Und wenn ja, welcher Faktor entspricht welchem db-Wert?
Andreas Pfau - Sa 22.03.03 14:02
Juhu! Ich hab's geschafft! Ich habe grade 'ne halbe Stunde gegoogelt, da habe ich die Formel gefunden:
Quelltext
1: 2:
| dB := 20 * Log10(Ursprungsamplitude / Ausgabeamplitude) Ausgabeamplitude := Ursprungsamplitude / power(10, dB / 20) |
Trutzdem vielen Dank für deine Mitarbeit!
MathiasH - Sa 22.03.03 21:24
ich arbeite grad an nem ähnlichen Projekt, ich denke die fomel werde ich gut gebaruachen können, mein Programm soll ton dateien aller art analysieren können, fft usw
IO-sys/MathiasH
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!