Wie funktioniert Silence Detection?
-
hustbaer schrieb:
fourier transformation sollte hier keine nötig sein.
finde ich auch. 'ne fft spuckt ihm ja ein frequenzspektrum in form von komplexen zahlen aus und daraus müsste dann wieder die amplitude mit sqrt(re2+im2) ausrechnen, um lautstärkeunterschiede festzustellen. geht bestimmt, aber ist übertrieben.
-
Also was jetzt, Hochpass oder Tiefpass?
Ist das quadratische Mittel so viel genauer als das arithmetische? Mit dem bin ich ja bereits auf die Schnauze geflogen.
Woher kann ich wissen, ob mein Signal einen DC Anteil enthält bzw. wie müsste ich es quantisieren?Danke
-
farw schrieb:
Also was jetzt, Hochpass oder Tiefpass?
Ist das quadratische Mittel so viel genauer als das arithmetische? Mit dem bin ich ja bereits auf die Schnauze geflogen.Das arithmetische Mittel ist der Mittelwert. Das quadratische Mittel (minus den quadrierten Mittelwert) ist die Standardabweichung. Und die willst du haben, denn du willst ja wissen, wie stark das Signal um den Mittelwert schwankt.
-
farw schrieb:
Also was jetzt, Hochpass oder Tiefpass?
Hochpass.
Wenn du den DC Offset vorher entfernst, dann brauchst du den allerdings nicht unbedingt.Ist das quadratische Mittel so viel genauer als das arithmetische? Mit dem bin ich ja bereits auf die Schnauze geflogen.
Der RMS Wert ist nicht genauer, aber "richtiger".
Es geht um "Silence Detection", also um die Lautstärke.
Die empfundene Lautstärke ist (grob) analog zum Logarithmus der Schall-Leistung.
Die Schall-Leistung ist analog zur Leistung die der Lautsprecher aufnimmt.
Die Leistung die der Lautsprecher aufnimmt ist (grob) analog zum Quadrat der Spannung die der Lautsprecher bekommt.
Und die Spannung die der Lautsprecher bekommt ist analog zu dem Audio-Signal welches du analysierst.Aber bleiben wir bei der Leistung die der Lautsprecher aufnimmt. Um die durchschnittliche Leistung zu ermitteln, brauchst du die Effektivspannung. Und die Effektivspannung ist nunmal der RMS Wert.
Du bildest also den RMS-Wert des Audio-Signals. Und dann den Zehnerlogarithmus vom Quadrat dieses RMS-Werts. Wenn du diesen Logarithmus mit 10 Multiplizierst, hast du Dezibel.
(Natürlich kannst du dir das Quadrieren sparen, und stattdessen einfach mit 20 statt 10 multiplizieren)Wenn du dann den Dezibel-Wert hast, kannst du den einfach mit einem bestimmten Schwellwert vergleichen. Alles was kleiner ist, ist "silence", alles was grösser ist, nicht.
So weit so gut.
Was den DC Offset angeht: da jeder Lautsprecher einen Hochpass darstellt (genauer einen Bandpass, aber um die sehr hohen Frequenzen kümmern wir uns mal nicht), kann er sehr niedrige Frequenzen nicht darstellen. Je niedriger, desto leiser wird er einfach. Einen DC Offset ("0 Hz") kann ein Lautsprecher schliesslich garnicht darstellen. Ganz abgesehen davon dass sogut wie jeder Verstärker einen Hochpass eingebaut hat. Da aber viele Signale einen leichten DC Offset haben, würde es das Ergebnis verfälschen, wenn man den vorher nicht entfernt.
Dazu kannst du entweder das ganze Signal Hochpass-Filtern, also das simulieren was der Lautsprecher machen würde.
Oder du kannst gezielt den DC-Offset eines Teil-Stücks ausrechnen, und den von den Werte abziehen, bevor du den RMS-Wert berechnest.
Und schliesslich: dass du mit dem Mittelwert auf die Nauze gefallen bist, liegt vermutlich daran, dass du irgendwas anderes falsch gemacht hast
Woher kann ich wissen, ob mein Signal einen DC Anteil enthält bzw. wie müsste ich es quantisieren?
Du musst garnix quantisieren.
Und ob es einen DC-Offset gibt, kannst du einfach dadurch feststellen, indem du ihn ausrechnest. Der DC-Offset ist schliesslich nur der Mittelwert des Signals (NICHT über die Beträge sondern über die unveränderten, nicht-quadrierten Samplewerte).
p.S.: das sind alles grundlegendste Grundlagen. Vielleicht solltest du dich allgemein etwas in das Thema einlesen, bevor du versuchst irgendwas mit Audio-Signalverarbeitung zu machen.
-
hustbaer schrieb:
Einen DC Offset ("0 Hz") kann ein Lautsprecher schliesslich garnicht darstellen.
Aha
-
Lolzebub schrieb:
hustbaer schrieb:
Einen DC Offset ("0 Hz") kann ein Lautsprecher schliesslich garnicht darstellen.
Aha
aha was?
-
op: http://www.ee.columbia.edu/~eleft/mmsp/papers/mmsj97-sj.pdf
(ist zwar speziell für kontinuierliche signale, sprache in telefonsystemen und so, aber vielleicht gibts dir denkanstösse).
-
Erst einmal danke für die ausführlichen Erklärungen.
hustbaer schrieb:
Und schliesslich: dass du mit dem Mittelwert auf die Nauze gefallen bist, liegt vermutlich daran, dass du irgendwas anderes falsch gemacht hast
Ich habe einfach 0,2 Sekunden lange Abschnitte genommen, den Betrag aller Samples addiert und daraus den Durchschnitt gebildet. Dass das nicht funktioniert habe ich ja bereits gemerkt, nur was meinst du mit "etwas anderes falsch gemacht"?
Danke
-
hustbaer schrieb:
Oder du kannst gezielt den DC-Offset eines Teil-Stücks ausrechnen, und den von den Werte abziehen, bevor du den RMS-Wert berechnest.
Gibt es eine Mindestlänge des Teilstücks oder ist das beliebig? Sind eher kleinere oder eher längere Abschnitte zu bevorzugen?
Danke
-
farw schrieb:
Gibt es eine Mindestlänge des Teilstücks oder ist das beliebig? Sind eher kleinere oder eher längere Abschnitte zu bevorzugen?
möglichst viele. du sollst ja den arithmetischen mittelwert berechnen, wie husti schon erzählt hat. stell dir z.b. 'ne ganze sinusschwingung vor, die bei 0 beginnt und in 1000 samples zerhackt ist. nimmste (sample[1]+sample[2]+...+sample[1000])/1000, dann kommt 0 raus. schiebst du die welle nach oben, indem zu z.b. auf jeden samplewert 199 addierst, dann spuckt dir der mittelwert diese 199 aus. nimmst du dagegen nur die ersten 250 werte, dann wird das ergenis sehr ungenau d.h. unbrauchbar. bei 20099 werten aber (also mehrere ganze perioden + irgendeine angefangene) ist das ergebnis trotzdem noch ziemlich gut.
btw, für echtzeitverarbeitung taugt sowas aber nix. wenn du z.b. einfach nur einen offset von der nullinie entfernen willst, dannn nimm einen einfachen hochpassfilter wie: out(n) = in(n)-in(n-1)+c*out(n-1), wobei out==output sample, in==input sample, c ist ein wert zwischen 0.9 und 0.999 und bestimmt die grenzfrequenz (ausprobieren, was am besten passt)
-
Gute Erklärung, vielen Dank dafür.
;fricky schrieb:
btw, für echtzeitverarbeitung taugt sowas aber nix.
Zum Glück habe ich es auch nicht mit Echtzeitverarbeitung zu tun.