Problem genauer untersucht: es ist leider schwieriger als vermutet
...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.
This commit is contained in:
parent
efb776f239
commit
f018ca9371
4 changed files with 45 additions and 20 deletions
1
sauSynKlick/.gitignore
vendored
1
sauSynKlick/.gitignore
vendored
|
|
@ -1 +1,2 @@
|
|||
SynKlick
|
||||
*.wav
|
||||
|
|
|
|||
|
|
@ -127,9 +127,12 @@ int
|
|||
main (int argc, char* argv[]) {
|
||||
if (argc < 3 || string("-h") == argv[1])
|
||||
{
|
||||
cerr << "SynKlick <INPUTFILE> [<INPUTFILE2> ...] <TARGETDIR>"
|
||||
<< "\n\nRepair a very special kind of defects in sound recordings:"
|
||||
<< "\nsynchronous drop-outs in a set of input sound files."
|
||||
cerr << "SynKlick <INPUTFILE> [<INPUTFILE2> ...] <TARGETDIR>\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 <TARGETDIR>\n\n";
|
||||
|
||||
return EXIT_FAILURE;
|
||||
|
|
|
|||
|
|
@ -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?_
|
||||
|
||||
|
|
|
|||
3
sauSynKlick/testSau/INHALT
Normal file
3
sauSynKlick/testSau/INHALT
Normal file
|
|
@ -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.
|
||||
Loading…
Reference in a new issue