From f018ca93717b0bc2838bd4ca34fe31ac9c8c1524 Mon Sep 17 00:00:00 2001 From: Ichthyostega Date: Sat, 30 Aug 2014 17:53:18 +0200 Subject: [PATCH] Problem genauer untersucht: es ist leider schwieriger als vermutet MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ...wir haben es tatsächlich mit kurzen Skips zu tun; es müssen also Sprünge im Wellenverlauf gefunden werden; und für den Ausgleich versuchen wir eine kurze Kreuzblende mit künstlich fortgesetztem Wellenverlauf. Daher wird auch die Verarbeitungsschleife komplexer, denn wir brauchen stets einen Suchpuffer von 200 Samples Länge. --- sauSynKlick/.gitignore | 1 + sauSynKlick/SynKlick.cc | 9 ++++--- sauSynKlick/SynKlick.txt | 52 +++++++++++++++++++++++++------------- sauSynKlick/testSau/INHALT | 3 +++ 4 files changed, 45 insertions(+), 20 deletions(-) create mode 100644 sauSynKlick/testSau/INHALT diff --git a/sauSynKlick/.gitignore b/sauSynKlick/.gitignore index 9ae76bd..38c87ed 100644 --- a/sauSynKlick/.gitignore +++ b/sauSynKlick/.gitignore @@ -1 +1,2 @@ SynKlick +*.wav diff --git a/sauSynKlick/SynKlick.cc b/sauSynKlick/SynKlick.cc index c1b6c34..527b170 100644 --- a/sauSynKlick/SynKlick.cc +++ b/sauSynKlick/SynKlick.cc @@ -127,9 +127,12 @@ int main (int argc, char* argv[]) { if (argc < 3 || string("-h") == argv[1]) { - cerr << "SynKlick [ ...] " - << "\n\nRepair a very special kind of defects in sound recordings:" - << "\nsynchronous drop-outs in a set of input sound files." + cerr << "SynKlick [ ...] \n" + << "\nRepair a very special kind of defects in sound recordings:\n" + << "synchronous skips in a set of input sound files. Possible events\n" + << "will be detected by scanning the deltas between neighbouring samples\n" + << "and confirmed by jumps at the same position in all files.\n" + << "The jump will be amended by a short cross-blend of about 4.5ms.\n" << "\nA fixed copy of each file will be written to \n\n"; return EXIT_FAILURE; diff --git a/sauSynKlick/SynKlick.txt b/sauSynKlick/SynKlick.txt index 536b1c0..4efbdc4 100644 --- a/sauSynKlick/SynKlick.txt +++ b/sauSynKlick/SynKlick.txt @@ -11,29 +11,35 @@ rein mechanische Reparatur, für die ich hier ein dediziertes Hilfsprogramm schr Lösungsansatz ------------- -An allen untersuchten Defekt-Stellen habe ich ein einziges Null-Sample gefunden, das einen ansonsten -glatt aussehenden Kurvenverlauf unterbricht. Dieser Null-Wert tritt offensichtlich auf allen Spuren -synchron auf. Da ich keinen XRun von Jack bekommen habe, vermute ich einen Defekt in Ardour beim -Wegschreiben der Puffer -- möglicherweise als Wechselwirkung mit dem re-Draw der Wellenformen; ich -hatte nämlich während der Aufnahme das Editorfenster in Anzeige, bei relativ hoher Auflösung, so daß -ich zur Kontrolle die Wellenform permanent sehen konnte. Wackelkontakte an den 3.5-Miniklinken traten -immer wieder auf. +An allen untersuchten Defekt-Stellen habe ich einen Sprung in der Wellenform gefunden, welcher +offensichtlich auf allen Spuren synchron auftritt. Den untersuchten Wellenformen nach zu urteilen +fehlen jeweils ca. 50 bis 100 Sampleworte. Da ich keinen XRun von Jack bekommen habe, vermute ich +einen Defekt in Ardour beim Wegschreiben der Puffer -- möglicherweise als Wechselwirkung mit dem +re-Draw der Wellenformen; ich hatte nämlich während der Aufnahme das Editorfenster in Anzeige, +bei relativ hoher Auflösung, so daß ich zur Kontrolle die Wellenform permanent sehen konnte. +Wackelkontakte an den 3.5-Miniklinken waren immer wieder aufgetreten. Es geht also darum, einen Satz von Rohdateien Wort für Wort synchron zu prüfen; wenn ein bestimmtes Muster auf allen Spuren auftritt, muß die Korrektur ausgelöst werden -- das Muster definiere ich als _ein einziges_ Null-Wort umgeben von normalen Sample-Werten auf einer - Seite (positiv oder negativ), so daß es sich wahrscheinlich nicht um einen Null-Durchgang des Signales - handelt. -- die Korrektur besteht darin, das Null-Wort durch den Mittelwert der Nachbar-Samples zu ersetzen. +- das Muster definiere ich als _einen Sprung in den Deltas_ zwischen benachbarten Samples. Hierfür + muß ich noch eine passende Triggerschwelle herausfinden. +- die Korrektur besteht darin, die Kurvenverläufe beidseits des Sprunges künstlich fortzusetzen + und dann zwischen diesen beiden synthetisierten Verläufen zu überblenden, mit einer Überblendedauer + von 200 Samples. Als künstliche Fortsetzung wähle ich den invertierten und rückwärts abgespielten + Ablauf des existierenden Materials. Es könnte zu ``false positives'' kommen, speziell bei leisem Rauschen. Die Kombination mehrerer -Kanäle senkt jedoch die Wahrscheinlichkeit solcher Fehl-Korrekturen. Auch ist die Korrektur als Solche -nicht gefährlich, denn ein Mittelwert ist in den meisten Fällen ungefähr richtig; ich vermute daß -die verbleibende Störung meist nicht wahrnehmbar ist. Obwohl ich nicht untersucht habe, ob diese -Null-Samples nun _ausgefallene_ Samples oder _zusätzlich eingeschobene_ Samples sind, entscheide -ich mich für eine Ersetzung durch einen besser eingepaßten Sample-Wert, und nicht für eine -Verkürzung der Aufnahme -- einfach um den Eingriff möglichst unproblematisch zu halten. +Kanäle senkt jedoch die Wahrscheinlichkeit solcher Fehl-Korrekturen. Leider ist die Korrektur selber +durchaus gefährlich; jedoch stellen die Defekte eine so deutlich hörbare Tonstörung dar, daß jede, +auch nur graduelle Verbesserung wünschenswert ist. Die Methode der künstlichen Fortsetzung wähle +ich, weil es der einfachste Ansatz ist, der direkt an der Sprungstelle stetig und einigermaßen +kohärent, sowie zur Sprungstelle symmetrisch ist. Typischerweise wird es zu einer partiellen +Auslöschung kommen, also einer kurzen, geräuschhaften Störung. Um den Eingriff möglichst +unproblematisch zu halten, entscheide ich mich, keine Änderung der Sample-Längen +zu machen. Es geht hier um Schadensbegrenzung (denn egal, was meine Auftraggeber +sagen, letztlich bleibt doch ein Eindruck der Unprofessionalität) + Anmerkungen zur Implementierung ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -61,3 +67,15 @@ Nach Analyse beschließe ich, eine Reparatur zu versuchen. Dies ist auch ein Anl Nach Rückkehr von meiner üblichen Ende-August-FrOSCon-Reise wird diese Aufgabe nun dringend. + Lege einen Projektrahmen an und implementiere des Öffnen der Dateien via `libsndfile` +.30.8.2014 +_Leider_ ist die Aufgabe nicht so einfach wie vermutet. Habe mir nun die Wellenformen im Detail angeschaut +und drei Probe-Schnipsel zur Entwicklung und für Tests extrahiert. Es handelt sich nicht wie anfangs vermutet, +um punktuell auf allen Spuren auftretende Null-Werte. Sondern vielmehr um einen ganz gewöhnlichen *Verlust von +Samples*. Das heißt, es fehlt -- synchron auf allen Spuren -- ein Stück Tonaufzeichnung unbekannter Länge, so +daß an der betreffenden Stelle ein Sprung in allen Wellenformen auftritt. + +Damit ändert sich das Konzept. Ich muß wohl einen Sprung in den Deltas zwischen benachbarten Samples erkennen, +und dies, zur Sicherheit, auf mehreren Spuren parallel. Und die Korrektur ist wesentlich mühsamer, wenn nicht +sogar unmöglich. In Anlehnung an mein altes `streckDich`-Skript mache ich eine kurze Kreuzblende, mit der damals +als optimal ausgeknobelten Länge von 4.5ms (200 Samples). Das große Problem ist bloß: _woher bekomme ich das +zusätzliche Material für die Kreuzblende?_ + diff --git a/sauSynKlick/testSau/INHALT b/sauSynKlick/testSau/INHALT new file mode 100644 index 0000000..f27c7f7 --- /dev/null +++ b/sauSynKlick/testSau/INHALT @@ -0,0 +1,3 @@ +Beispieldaten zum Entwickeln und Testen des "SynKlick"-Tools: +Auszüge aus den Mycel-Performances (4 und 3), sie enthalten jeweils +ein "klick"-Event, wobei aber einige Spuren stumm sein können.