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