Wie funktioniert Silence Detection?
-
1. Ansatz: Ich nehme einfach den Durchschnitt.
Wenn Leise ist, ists leise. Gut.
AAber: Wenn nur alle 20ms ein peek gen max ist, hat Du ein fettes quäkiges 50Hz-Brummen. Aber im Durdchschitt gehts unter.2. Ansatz: Fourier-Transformation
Nix Aber. Aber lesen selber. Ist verdammt viel Theorie und viele neue Begriffe. Ist aber wohl echt am besten, Du kämpfst Dich da mal durch.
Zusamenfassung: Statt des Signals selber schaust Du an, was die Lampenleisten vom Equalizer anzeigen. Wenn da keine Leiste hochspringtm war silence. Wie die Lampenleisten aber anzeigen, mußt Du per Fourier-Transformation schnell berechnen, weil Du keine Lampenleiste bist.Edit: Mist, Du hast eine Lampenleiste im Ohr. Da hst Du einen geilen Fourier-Transformierer und Equalizer-Lampen-Apparat drin. Das ist auch bestimmt der Grund, warum man das Signal erst transformieren muß, um es "menschlich" zum Beispiel als silecne zu bewerten.
-
Eine sehr knappe Einführung in die diskreten Fourier Transformationen: http://www.dspdimension.com/admin/dft-a-pied/
-
volkard schrieb:
2. Ansatz: Fourier-Transformation
Nix Aber. Aber lesen selber.Das ist nicht schaffbar ohne mathematische/physikalische Vorbildung. Das einzige, das mir jetzt einfiele wäre die PCM-Daten einfach an die fftw zu übergeben. Aber da bin ich schon mit dem Output (wozu brauch ich da komplexe Zahlen?) überfordert.
Trotzdem danke.
-
Wikipedia offenbart Dir, daß eine komplexe Zahl entweder Real-/Imaginärteil oder Betrag/Richtung hat. In letzterem Fall ist der Betrag Deine "Lautstärke".
-
Gut, vllt. sollte man nicht so früh aufgeben.
rüdiger schrieb:
Eine sehr knappe Einführung in die diskreten Fourier Transformationen: http://www.dspdimension.com/admin/dft-a-pied/
Wenn ich das richtig verstanden habe, dann können bei PCM Daten mit 44100Hz Sampling-Rate 44100 verschiedene Frequenzen enthalten sein. Also muss ich doch von jeder dieser Frequenzen die Amplitude bestimmen und dann schauen, ob die Summe aller Amplituden unter einem Grenzwert bleibt, oder?
Aber wieviele/welche Daten muss ich dann an die fftw übergeben? Sind das dann 44100 Integer aus meiner .wav Datei und ich erhalte 44100 Frequenzen mit deren Amplitude zurück? Kann ich mir irgendwie nicht so richtig vorstellen...Danke
-
farw schrieb:
und dann schauen, ob die Summe aller Amplituden unter einem Grenzwert bleibt, oder?
Oder das Maximum der Amplituden. Oder die Summe der Qudrate der Logaritmen der Amplituden. Oder da http://de.wikipedia.org/wiki/Lautstärke schauen bei "Isophone" und erstmal die Amplituden je nach Frequenz gewichten. Großes Feld für unterhaltsame Spielereien.
-
Gut, gut, das war ja auch nur mal ein erster Gedanke. Wichtiger ist eher wie die Daten eigentlich zu behandeln bzw. zu übergeben sind.
Danke
-
farw schrieb:
rüdiger schrieb:
Eine sehr knappe Einführung in die diskreten Fourier Transformationen: http://www.dspdimension.com/admin/dft-a-pied/
Wenn ich das richtig verstanden habe, dann können bei PCM Daten mit 44100Hz Sampling-Rate 44100 verschiedene Frequenzen enthalten sein. Also muss ich doch von jeder dieser Frequenzen die Amplitude bestimmen und dann schauen, ob die Summe aller Amplituden unter einem Grenzwert bleibt, oder?
das ist vielleicht etwas zu kompliziert. ein anderer trick: du könntest dein signal stärker quantisieren, z.b. mit: http://en.wikipedia.org/wiki/Μ-law dann durch'n tiefpass jagen und danach die anzahl negativer und positiver samples innerhalb eines fensters zählen. je nach verhältnis entscheideste dann zwischen 'da ist was' und 'da ist nix'. so ähnlich arbeiten manchmal 'noise gates' in irgendwelchen telefonsystemen usw.
-
erst durch nen hochpass jagen, und dann einfach den RMS wert eines abschnittes berechnen. fourier transformation sollte hier keine nötig sein.
wenn man sicher sein kann dass das signal keinen DC anteil hat, kann man den hochpass auch weglassen.
-
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.