Hallo in die DSP-Runde
Ich habe zwischenzeitlich mit sox -> brutefir -> sox herumgespielt und habe einige Erfahrungen gemacht.
Allgemein:
1. Dithern mittels Sox hat praktisch keinerlei Einfluss. In keiner Variante, auch nicht. Wenn überhaupt was an einem Ende gewonnen wird, dann wird am anderen Ende verloren ...
2. Wenn möglich soll mit/bei einer Bittiefe von 64Bit verarbeitet werden.
3. Der Samplerate-Converter von SOX arbeitet mit max. 24Bit. Das ist eine Limite für die Genauigkeit. Bei jedem Up- resp. Downsampling gehen in etwa 10dB Dynamikreserve verloren. Deshalb lohnt es sich nicht, fürs Convolving höher zu Upsamplen, als am Schluss nötig ist. Das erfordert lediglich wieder eine zusätzliche Rückrechnung, welche die Dynamikreserve zusätzlich noch etwas einschränkt.
4. Für das Convolving mittels Brutefir soll das Upsampling zuvor, und nicht erst nach Brutefir erfolgen.
5. Bei einer 16Bit/44.1kHz Eingangsdatei macht es praktisch keinen Unterschied, ob zu 16/44 oder 24/96 hin gerechnet wird. Möglicherweise gewinnt man mit 24/96 das, was beim Upsampling verloren geht ...
Im Speziellen:
Eine 16Bit/44.1kHz *.wav wurde mit cptoshm und shmcat eingelesen und mit einer ersten Instanz von Sox nach 32Bit float oder 64 float konvertiert. Danach wurde mit einer zweiten Instanz von Sox der Pegel 0dB (blau), -80dB (braun), -100dB (grün) und -120dB (rot) heruntergerechnet. Im Falle von 24/96 out wurde danach und an dieser Stelle das Upsampling von 44.1kHz nach 96kHz vorgenommen (sox - rate -v -I). Danach erfolgte mittels Brutefir eine Faltung mit einem bei -15dB abgeschnittenen C-Weighting-Filter, danach die Aufteilung auf eine 5-Weg-NT2-Weiche, die 5 Ausgänge der Weichenfilter wurden wieder zusammengefasst und zuletzt mit einem Filter verrechnet, welcher dem Inversen des C-Weighting-Eingangsfilter entsprach. Per stdout wurde die Pipe weiter an Sox gegeben, wo in einer ersten Stufe der Pegel wieder auf -1dB hochgerechnet wurde (incl +14dB für die Absenkung durch das C-Weighting-Filter und dessen Inverse). Am Schluss erfolgte, nochmals mittels sox, die Rückwandlung von 32Bit/64Bit float nach 16Bit oder 24Bit integer.
Input als 16Bit/44.1kHz-wav, mittels Acourate synthetisiert. Die beiden kleinen Störspitzen bei ca. 8kHz und 13kHz sind Artefakte und zeigen sich teilweise in den unteren Graphen wieder.
Resultate:
1644-3244-1644 (32Bit Pegelmanipulationen und Convolving)
Eingangspegel 0dB (blau), -80dB (braun), -100dB (grün - fett), -120dB (rot)
Mit Dither und/oder ohne Dither praktisch identisch (kein Bild mit Dither hier eingestellt, ist aber so)
DR > 70dB (DR von 40dB bei einer Störung @ ca. 18kHz) für Signale > -100dB Absenkung (grüner Teppich)
DR > 80dB für Signale > -80dB
1644-6444-1644 (64Bit Pegelmanipulationen und Convolving)
Eingangspegel 0dB (blau), -80dB (braun), -100dB (grün - fett), -120dB (rot)
Mit Dither und/oder ohne Dither praktisch identisch.
DR >90dB für Signale > -100dB
DR >100dB für Signale > -80dB
1644-6496-2496 (64Bit Pegelmanipulationen, Upsampling 44.1kHz -> 96.kHz und Convolving, Ausgabe als 24Bit/96kHz-wav)
Eingangspegel 0dB (blau), -80dB (braun), -100dB (grün - fett), -120dB (rot)
Mit Dither und/oder ohne Dither praktisch identisch.
DR >90dB für Signale > -100dB
DR >100dB für Signale > -80dB
2496-6496-2496
Eingangspegel 0dB (blau), -80dB (braun), -100dB (grün - fett), -120dB (rot)
Die untere Kurvenschar habe ich mehrmals gefenstert, damit die Unterschiede sichtbar wurden. Die obere Graphik zeigt den "Originalzustand" nach dem unmittelbaren Einlesen der Ausgangsdateien.
Mein Fazit daraus:
sox-brutefir-sox ist ganz ok, könnte aber besser sein - (Setup-, Berechnungs- und Interpretationsirrtum vorbehalten). Kennt jemand ein wirklich gutes Linux-Progrämmchen, welches in einer Pipe das Upsampling mit 64Bit-Tiefe und parametrisierbarer Präzision erledigen kann?
Partialerhellt-buntkurvige Grüsse
Simon