Wie funktioniert Silence Detection?
-
Hallo,
ich möchte Silence Detection auf PCM Daten anwenden, um sie an den entsprechenden Stellen trennen zu können. Allerdings fehlt mir momentan etwas der Ansatz.
Zuerst hatte ich versucht die Daten - die ja durch Werte von ca. -32000 bis 32000 repräsentiert werden, wobei ich den Betrag verwende - in 0.2 Sekunden lange Abschnitte einzuteilen und jeweils deren Durchschnittswert als Indikator zu verwenden. Jedoch war der Wert von jedem dieser Abschnitte ca. 14000 +/- ca. 300. Das war unbrauchbar. Erst bei Abschnitten von etwa 0,025 erhielt ich Schwankungen von ca. 4000. Das scheint also nicht das richtige Verfahren zu sein.
Dann habe ich versucht den jeweils höchsten bzw. niedrigsten Wert zu verwenden. Dieser ist aber immer der Maximalwert bzw. 0.
Es muss ja kein "professioneller" Silence Detector werden.
Hat jemand eine Idee, wie man so ein Problem noch angehen könnte?Danke
-
Fourier-Trafo und die Frequenzen anschauen?
-
Jester schrieb:
Fourier-Trafo und die Frequenzen anschauen?
Das ist wohl um einiges zu kompliziert für mein Vorhaben. Gibt es da keine einfacheren Ansätze?
Danke
-
Ich glaube eher nicht, dass es viel einfachere Ansätze gibt, die gut funktionieren. Außerdem ist das garnicht sooo heftig. Nimm einfach eine fertige Bibliothek für die Fourier-Tranfsformation -- etwa fftw für C(++). Damit dürfte das recht schnell erledigt sein.
-
Na ja, wenn man keine Ahnung von diesen Transformationen hat, dann ist das schon recht schwierig. Ich hab keine große mathematische Bildung und deswegen löse ich Problem lieber "intuitiv"
. Ist denn an dem Ansatz, dass man einfach Bereiche nimmt, die mit einem gewissen Abstand um die Nullwert liegen und eine gewisse zeitliche Länge haben, grundsätzlich etwas falsch? Da bleibt dann nur noch die Frage zu klären, wie man den maximalen Abstand vom Nullwert bestimmen sollte.
Danke
-
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?