PreEmphasis in PCM-Aufnahmen entfernen
#1
Hallo zusammen,

das Thema ist schon mal hier im Forum aufgetaucht, jedoch der Thread im Nichts versandet. Auch ich habe das Thema lange vor mir hergeschoben, da ich nur wenige CDs mit PreEmphasis habe.
Nun aber sollten einige Lieder von einer CD mit PreEmphasis in einen Sampler, der auch am PC und im Auto wiedergegeben werden soll. Deshalb mußte nun eine Lösung her.

Mit diesem Thread möchte ich auf der einen Seite einen Lösungsweg vorstellen, sowie etwas über die von anderen verwendeten Lösungen erfahren.
Kritik an diesem Lösungsweg und alternative Vorschläge sind willkommen.

Zusammenfassung des Problems:
In der Anfangszeit der digitalen Audiotechnik hatte man die Idee, mit einer Höhenanhebung vor der Digitalisierung und einer Höhenabsenkung nach der Rückwandlung, den Rauschabstand zu verbessern. Damalige Wandler hatten oft nur 14 Bit und waren bei den unteren Bits ungenau. Dies führte zu einem deutlichen Quantisierungsrauschen, besonders wenn man die vorgeschlagenen 12 dB Headroom nutzen wollte.
Diese Emphasis von 50/15 µs erzeugt vor der Digitalisierung eine Höhenanhebung von bis zu 10 dB. Solche Aufzeichnungen sind im Subcode entsprechend gekennzeichnet und es erfolgt eine Korrektur im Abspielgerät bei der analogen Ausgabe.
Leider können einige neuere Geräte (z.B. CD-Player) und Soundkarten diese Korrektur nicht mehr vornehmen, bzw. findet sich im Header von Wave-Dateien kein Flag für die Kennzeichnung dieser Aufzeichnungen.
Der richtige Weg wäre nun, die Höhenanhebung aus der digitalen Aufzeichnung zu entfernen.

Für den Player "foobar2000" habe ich zwei Filter gefunden. Der erste Filter (Namen habe ich vergessen) korrigierte zuviel und erzeugte damit einen dumpfen Klang.
Der zweite Filter (foo_dsp_effect.fb2k-component) zerreißt die Stereoabbildung und erzeugt einen sehr welligen Frequenzgang.

Auf der Seite "https://www.radonmaster.de/robernd/tAPCM.html" beschreibt der Autor, wie er mit 3 parametrischen Filtern die DeEmphasis in Software emuliert.
Da sich das auf der o.g. Seite verwendete CoolEdit in den Filtern wohl doch von Adobe Audition unterscheidet, landete ich bei meinen Versuchen bei abweichenden Filterwerten:

   


Als Grundlage für meine Versuche habe ich die von o.g. Webseite zur Verfügung gestellte Datei mit PreEmphasis verwendet.

   


Das Ergebnis sieht dann so aus:

   


Der Frequenzgang nach der DeEmphasis mit Audition in Zahlen:
1 kHz -0.04 dB
2 kHz +0.13 dB
3 kHz +0.15 dB
4 kHz +0.09 dB
5 kHz +0.02 dB
6 kHz +0.15 dB
7 kHz +0.28 dB
8 kHz +0.39 dB
9 kHz +0.48 dB
10 kHz +0.54 dB
11 kHz +0.59 dB
12 kHz +0.60 dB
13 kHz +0.61 dB
14 kHz +0.60 dB
15 kHz +0.58 dB
16 kHz +0.55 dB
17 kHz +0.53 dB
18 kHz +0.52 dB
19 kHz +0.54 dB
20 kHz +0.62 dB

Genauer bekomme ich es nicht hin, da sich die Filter gegenseitig beeinflussen.


Ich habe dann eine Test-CD erstellt mit 2 x 3 Aufzeichnungen. 2 Titel, die je 3 mal auf der CD vorhanden sind. Erst der Titel mit PreEmphasis und PreEmphasis-Flag als Referenz, dann zwei Umrechnungen in Software ohne PreEmpasis-Flag.
Ich habe den Test nun auf einigen Geräten durchgeführt und muß ziemlich ernüchtert feststellen, daß ich mir um die o.g. Abweichungen der Filterung in Audition keine Gedanken machen muß. Die originalen Aufzeichnungen mit PreEmphasis klingen auf allen bisher getesteten Geräten (mit DeEmphasis) unterschiedlich.

Hat noch jemand einen A/D-Wander (z.B. DAT) mit PreEmphasis und kann die auf der o.g. Seite auch vorhandene Testdatei ohne PreEmphasis mal durch den Wandler schicken?

Wie oben geschrieben, sind Kritik und Anregungen willkommen.


Grüße

96k
Zitieren
#2
Hallo,

das richtige Filter zur Beseitigung der Preemphasis wäre ein Shelf-Tiefpaß erster Ordnung. Mit drei parametrischen Filtern , womit meist Bandpass-ähnliche Strukturen zweiter Ordnung gemeint sind, eierst du zwangslâufig um den richtigen Frequenzgang herum. Man müßte nur noch wissen, ob mit 50/15 usec das equivalente Analogfilter gemeint ist oder schon direkt die digitale Form bei 44.1 kHz Samplerate (hab ich vergessen). Das macht einen kleinen Unterschied. Wenn du das ganze sowieso analog übertrâgst, kannst du es auch mit einem einfachen RCR-Lagfilter erledigen. Damit ist gemeint ein Serienwiderstand zwischen Quelle und Aufnahmegerät und vor letzterem ein RC nach Masse.
Das müsste man auch korrekt in Audacity oder einem anderen WAV-Editor implementiert bekommen. Rein rechnerisch könnte man es mit Programmen wie MATLAB, Octave, Scilab machen. Es gab vor Jahren mal eine Goldwave-Version, in der man digitale Filter implementieren konnte (hab ich mal benutzt). Wurde leider in einer späteren Version rausgenommen mit der Begründung, es hätten sich zu wenige Kunden dafür interessiert. Es ist auch möglich, sowas mit VST-Plugins oder WinAmp-Plugins zu tun. Nachteilig ist nur, daß die meisten dieser Tools nur eine Art Geschmscksschieber oder simulierte Drehknöpfe haben, statt mathematisch präzise Parameter-Einsteller.
Wenn ich sowas bräuchte, würde ich ein kleines Konsolenprogramm schreiben, das genau das richtige wegrechnet und alle WAV-Files in einem Directory damit verarztet. Hab ich bloß noch nicht gebraucht. Könnte aber kommen, wenn mir jemand hilft, einen Schuhkarton voller DAT- Bänder digital auszulesen oder durch Spende oder Leihgabe eines dazu fähigen DAT-Players. Ich habe nämlich nach meiner Tonbandphase den kleinen Casio DAT-Recorder für Musikaufnahmen benutzt, bis die PCs gut genug für diesen Zweck wurden.
Der Casio verwendet(e) auch eine Preemphasis aus dem gleichen Grund. Digitalen Uberspielungen, die ein Kollege mal vor vielen Jahren probeweise auf seinem DAT mit Digital-Ausgang anfertigte, fehlte auch die Deemphasis. Weiß garnicht mehr, was ich damals dagegen gemacht habe.

MfG Kai
Zitieren
#3
kaimex,'index.php?page=Thread&postID=200962#post200962 schrieb:das richtige Filter zur Beseitigung der Preemphasis wäre ein Shelf-Tiefpaß erster Ordnung. ... Man müßte nur noch wissen, ob mit 50/15 usec das equivalente Analogfilter gemeint ist oder schon direkt die digitale Form bei 44.1 kHz Samplerate (hab ich vergessen).

Die Anhebung wurde damals vor dem AD-Wandler vorgenommen, die Absenkung nach dm DA-Wandler, also mit analogen Filtergliedern.
Zweck war die Verminderung des Quantisierungsrauschens der ersten AD-Wandlergenerationen (also nach ähnlichen Grundgedanken wie bei der analogen Magnetbandaufzeichnung).

Hier die Filterkurve aus ebs' Audioseiten:

[Bild: Emphasis-Pre-De.gif]

Die zugehörige Webseite:

http://www.sengpielaudio.com/Rechner-zeitkonstante.htm



In Magix "Samplitude" wird seit jeher zum FFT-Filtermodul eine Pre-/Deemphasiskurve mitgeliefert:

[Bild: 50_15_s_2.jpg]


Mit dem in "Samplitude Pro X" mitgelieferten parametrischen Entzerrer und zusätzlich in einem Plugin Filter mit der Bezeichnung "EQ116" habe ich auf die Schnelle - shelving (auf Deutsch passend als "Kuhschwanz" bezeichnet) mit 6 dB Flankensteilheit - diese beiden Entzerrungskurven produziert:

[Bild: 50_15_s_1.jpg]



Grüße, Peter
Grüße
Peter


_____________________

Ich bin, wie ich bin.
Die einen kennen mich, die anderen können mich.
(Konrad Adenauer)
Zitieren
#4
Moin moin Peter,

danke für die Klarstellung.
Hätte ich mit etwas Nachdenken eigentlich auch selbst drauf kommen müssen Huh .
Das "minimalste" Filter wäre ein IIR-Filter, das nur zwei aufeinanderfolgende Samples geeignet verküpft. Hab ich vor Jahren mal für die bei unserem UKW übliche DeEmphasis mit 50 µs berechnet, bzw. optimiert. Muß es nur wiederfinden... Hier soll die Absenkung ab ca. 3.18 kHz dann bei ca. 10.5 kHz wieder aufhören. Das kriegt man darin wohl auch noch unter. Ein "Kuhschwanz" mit Ende ist vermutlich ein Shelf 1.Ordnung. Man kann es auch mit den öfter zu findenden Shelfs 2.Ordnung versuchen, wenn die einen auf niedrige Werte einstellbare Güten-Parameter haben. Dann sind eigentlich auch ausreichend gute (oder gar exakte) Approximationen von Shelfs 1.Ordnung möglich/enthalten.

MfG Kai
Noch eine Anekdote zu dieser Thematik: Vor vielen Jahren, als ich noch gelegentlich HiFi-Zeitschriften durchstöberte, gab es mal einen Bericht über (u.a.?) einen Philips-CD-Player. Die Tester prüften auch die implementierte DeEmphasis. Die war (in dBs) doppelt so groß wie erforderlich. Der Programmierer hatte offenbar (alter Nachrichtentechniker Scherz: ) Spannungs- und Leistungs-dBs verwechselt.
Zitieren
#5
Hallo,

als einfache Alternative zum selbstprogrammierten Filter: Das Audiotool SoX bringt den passenden Filter schon mit: http://sox.sourceforge.net/Main/HomePage. Gibt es für alle gängigen Plattformen. Die passende Umwandlung einer Datei ist damit ein Einzeiler.

Viele Grüße
Andreas
Zitieren
#6
Gut, daß du mal drauf hinweist und mich dran erinnerst.
Das gibt es schon viele Jahre, aber aus unerfindlichen Gründen hab ich es noch nie nâher in Augenschein genommen.
War vielleicht früherem Mißtrauen gegüber der fremden Unix-Welt geschuldet, wo ich es erstmals bemerkt habe.

MfG Kai
Zitieren
#7
Hallo zusammen,

danke für die Rückmeldungen.

SoX wollte ich auf Grund der Erfahrungsberichte vieler dafür nicht verwenden. Ich habe auch auf die Schnelle in den Changelogs nicht gefunden, ob die Fehler (Kanalungleichheiten u. a.) bei der DeEmphasis behoben wurden.

Mit dem FFT-Filter in Audition müsste ich das auch genauer nachbauen können, jedoch wollte ich eigentlich IIR-Filter dafür verwenden, damit die bei der PreEmphasis entstandenen Fehler wieder kompensiert werden. Oder bin ich da zu paranoid? ;-)
Aber vermutlich ist durch das "Gebastel" mit den 3 Filtern sowieso der Phasengang weit von den originalen Filtern weg.

@Peter: Könntest Du die auf der o.g. Website liegenden Beispiele mal durch die Filter jagen?
Also einmal das Beispiel mit PreEmphasis durch den DeEmphasis-Filter und das lineare Beispiel durch einen PreEmphasis-Filter (der vorhandene FFT-Filter nur umgedreht in den Parametern).


Danke und Grüße

96k
Zitieren
#8
96k,'index.php?page=Thread&postID=201020#post201020 schrieb:Also einmal das Beispiel mit PreEmphasis durch den DeEmphasis-Filter und das lineare Beispiel durch einen PreEmphasis-Filter (der vorhandene FFT-Filter nur umgedreht in den Parametern).
Bitte sehr!
V.l.n.r.: Original, "EQ116" VST-Plugin, Sam-eigener Entzerrer, Sam FFT Filter (2048 Punkte)

Deemphasis.
Die Pegelabweichung der drei Frequenztreppen beträgt max. ± 0,2 dB.

[Bild: Pre_Deemphasis.jpg]



Preemphasis.
Pegelangaben für diese Beispiele kann ich gerne nachliefern, jetzt ist es mir dafür zu spät ...

[Bild: Premphasis.jpg]


Grüße, Peter
Grüße
Peter


_____________________

Ich bin, wie ich bin.
Die einen kennen mich, die anderen können mich.
(Konrad Adenauer)
Zitieren
#9
Wenn es dir auch auf Phasengang und Impulstreue ankommt, bist du am besten mit dem IIR-Analogon des klassischen Analogfilters bedient.
Mit einem FFT-Filter kannst du tolle Betragsfrequenzgänge erzeugen, aber Phasengang und Impulsverhalten hängen von weiteren Interna (Window-Funktion) ab und sind meistens ziemlich entfernt von "treuem" Verhalten.

Macht Sox nicht reproduzierbare Fehler ?
Hast du einen Link dazu ?

MfG Kai
Zitieren
#10
Hallo,

ich habe keine Aktien darin - aber vielleicht hilft es ja trotzdem:

In der SoX-FAQ steht unter 6., dass es da 2006 mal einen Bug gab, aber die jetzige Version sehr präzise sei. Ich kann es auch gerne ausprobieren, wen ich übermorgen wieder an meinem Rechner bin.

Viele Grüße
Andreas
Zitieren
#11
Falls noch von Interesse hier eine näherungsweise Implementation der DeEmphasis als IIR Filter erster Ordnung:
   

ha (rot) ist die analoge Übertragungsfunktion, hd (blau) die digitale, oben in braun die Differenz 5-fach aufgerissen.
Linke Skala in dB, unten die entnormierte Frequenz.
Berechnet mit einem alten MathCad-7 Script.
Die Koeffizenten sind per Augenmaß hingefummelt, aber auch so liegen die Abweichungen bei max ~0,12 dB.
Per Optimizer läßt sich das vielleicht noch geringfügig verbessern.

MfG Kai
Zitieren
#12
Hallo,

kaimex,'index.php?page=Thread&postID=201070#post201070 schrieb:Falls noch von Interesse hier eine näherungsweise Implementation der DeEmphasis als IIR Filter erster Ordnung:

da ich noch zu wenig Ahnung von digitalen Filtern habe, war das ein willkommener Anlass, etwas herumzuspielen.

Also habe ich mich auf die Reise durch die Wikipedia begeben. Mit einem Umweg über "Filter mit unendlicher Impulsantwort" kam ich schließlich beim Artikel "Digital biquad filter" raus, und fand dort folgende Transferfunktion:


.png   biquad.png (Größe: 1.75 KB / Downloads: 213)

Eine Ordnung mehr als Kais Filter, und mit anderen Buchstaben, aber erkennbar:

Code:
b0 := a1
b1 := a2
b2 := 0
a1 := -c
a2 := 0

Hoffentlich ohne Vorzeichenfehler (und auf einer Abkürzung, siehe Schlussbemerkung) komme ich damit auf folgenden Frequenzgang:

   

Damit kann ich nun den Plot reproduzieren (mit der Annahme von Fs=44100 Hz):

   

kaimex,'index.php?page=Thread&postID=201070#post201070 schrieb:Die Koeffizenten sind per Augenmaß hingefummelt, aber auch so liegen die Abweichungen bei max ~0,12 dB.
Per Optimizer läßt sich das vielleicht noch geringfügig verbessern.

Das wollte ich noch kurz versuchen. Zunächst habe ich den analogen Filter in eine Tabelle von 100 Werten übersetzt - und zwar so (Python):

Code:
from math import pi, sqrt, log10

def ha(f, T1=50e-6, T2=15e-6):
    Ha = sqrt(1 + (2 * pi * f * T2)**2) / sqrt(1 + (2 * pi * f * T1)**2)
    return 20*log10(Ha)

def freq(f_min=20, f_max=20000, N=100):
    for i in range(N):
        yield f_min + ((f_max - f_min)**(1./N))**i

if __name__ == '__main__':
    for f in freq():
        print f, ha(f)

Danach habe ich ganz naiv in Gnuplot die Fit-Funktion benutzt, um den Digitalfilter durch Variation von a1 und a2 and die Punktmenge anzupassen. Heraus kommt:

Code:
Final set of parameters            Asymptotic Standard Error
=======================            ==========================

a1              = 0.461774         +/- 0.0001818    (0.03937%)
a2              = -0.0942553       +/- 0.0003858    (0.4093%)

Als Plot, mitsamt Punkten:

   

Kai hat also von Hand das Optimum ziemlich gut getroffen, viel besser wird es nicht. Die Differenz bei 10 kHz verringert sich von ~0.12 dB auf ~0.04 dB.

Interessant finde ich aber: Damit kann man eigentlich jeden gewünschten Frequenzgang aufschreiben, die angegebene Funktion fitten und bekommt die Koeffizienten des Digitalfilters...

Schlussbemerkung zu SoX: Dort ist fast alles als "Biquad"-Filter, also wie oben gezeigt als Filter zweiter Ordnung implementiert, so auch der De-Emphasis-Filter. Mit der Option "--plot gnuplot" spuckt er Koeffizienten und Funktion für den Amplitudenfrequenzgang als Text aus - letztere habe ich oben als "Abkürzung" verwendet.

Viele Grüße
Andreas
Zitieren
#13
Das Hinfummeln war etwas einfach, weil ich eine alte Lösung erster und zweiter Ordnung für die FM-DeEmphasis (nur die 50 µs Zeitkonstante) hatte. Beim Betrachten der Ergebnisse kam ich aber zum Schluß, daß die Filter 1.Ordnung für diese Anwendungen gut genug sind.
Das Biquad beinhaltet natürlich auch die Filter erster Ordnung mittels a2=b2=0.
Für den Filter-Entwurf gibt es (mehrere) direkte Methoden. Ich greife aber auch meist zu einem Optimizer.
Wenn man noch am Anfang der Lernkurve steht, besteht damit aber die Gefahr, daß durch "unvorteilhafte" Anfangsbedingungen unkausale Lösungen produziert werden mit "falsch-rummem" Phasengang und wahrscheinlich unstabilem Verhalten im Zeitbereich.
Besser ist meist, mit einer klassische Entwurfsmethode (aus diversen Lehrbüchern) zu beginnen und dann eventuell noch nach nach eigenem Gusto (vornehmer ausgedrückt: mit persönlich abweichender Zielvorstellung) nach zu optimieren.

MfG Kai
Zitieren
#14
Hallo,

Sagt bitte bescheid, wenn ich Euch auf die Nerven gehe... vorsichtshalber ein weniger theoretischer Beitrag:

Ich habe die Beispielfiles auch nochmal durch die verschiedenen Filter laufen lassen und die Abweichungen geplottet:

       

Zu sehen sind die beiden oben diskutierten IIS-Filter sowie der deemph-Effekt aus SoX 14.3.2 (in meinem Ubuntu von 2012 enthalten). Alle Abweichungen sind kleiner als 0.2 dB. Meiner Meinung nach kann man also SoX in aktuellen Versionen problemlos verwenden:

Code:
sox pcm_pre.wav deemph-sox-14.3.2.wav deemph

Wie gesagt - ein Einzeiler.

96k,'index.php?page=Thread&postID=201020#post201020 schrieb:SoX wollte ich auf Grund der Erfahrungsberichte vieler dafür nicht verwenden. Ich habe auch auf die Schnelle in den Changelogs nicht gefunden, ob die Fehler (Kanalungleichheiten u. a.) bei der DeEmphasis behoben wurden.

Dem wollte ich nochmal nachgehen: Auf der verlinkten Seite ist die SoX-Version 12.17.9 genannt. In der SoX-FAQ steht, dass der Bug in 12.18.2 gefixt wurde. Ich habe mir das Quellcode-Archiv geholt, die Version 12.18.1 (die älteste darin) kompiliert und ausprobiert - und das sieht dann so aus:

       

Den würde ich wirklich nicht verwenden. Das eine Problem (mit den ungleichen Kanälen) wurde mit einem Einzeiler abgestellt:

   

Die Abweichungen sind aber ziemlich groß. Am 18.03.2007 gibt es noch einen Commit mit der Notiz "Changed deemph to be a true biquad for better accuracy." - ich habs zwar nicht ausprobiert, aber damit sollte ab Version 14.0.0 alles in Ordnung sein. Edit: Jetzt habe ich es ausprobiert. Schon 12.18.2, also die Version nach dem Kanal-Bugfix, ist fast genauso präzise wie die aktuelle, alle Abweichungen unter 0.1 dB:

       

kaimex,'index.php?page=Thread&postID=201120#post201120 schrieb:Das Biquad beinhaltet natürlich auch die Filter erster Ordnung mittels a2=b2=0.

Klar - was mir auch die Implementierung erspart hat: SoX hat auch einen biquad-Effekt, in dem man einfach alle Koeffizienten direkt angeben kann. Die beiden Beispiele konnte ich also ganz einfach so erfiltern:

Code:
sox pcm_pre.wav deemph-iis-1.wav biquad 0.45836 -0.09541 0 1 -0.63705 0
sox pcm_pre.wav deemph-iis-2.wav biquad 0.461774 -0.0942553 0 1 -0.6324813 0

Zumindest für mich ein interessantes Feature!

kaimex,'index.php?page=Thread&postID=201120#post201120 schrieb:Wenn man noch am Anfang der Lernkurve steht, besteht damit aber die Gefahr, daß durch "unvorteilhafte" Anfangsbedingungen unkausale Lösungen produziert werden mit "falsch-rummem" Phasengang und wahrscheinlich unstabilem Verhalten im Zeitbereich.
Besser ist meist, mit einer klassische Entwurfsmethode (aus diversen Lehrbüchern) zu beginnen und dann eventuell noch nach nach eigenem Gusto (vornehmer ausgedrückt: mit persönlich abweichender Zielvorstellung) nach zu optimieren.

Danke für die Mahnung - wie bei jedem Fit, der über eine einfache Regressionsgerade hinausgeht, braucht man natürlich sinnvolle Startwerte, sonst landet man ganz schnell im Wald. Ich werde es (hoffentlich) beherzigen...

Viele Grüße
Andreas
Zitieren
#15
Die Koeffizienten in den Funktionen sind zwar alle reell, aber die Übertragungsfunktionen sind komplexe Funktionen in der Gaußschen Zahlenebene. Da gibt es immer auch eine konjugiert-komplexe Lösung mit gleichem Betragsfrequenzgang aber entgegengesetztem Phasengang. Da man in der Regel nur den Betragsfrequenzgang vom Optimizer hinziehen läßt, kann man ungewollt in Feindesland gelangen. Den Koeffizienten sieht man es nicht auf den ersten Blick an. Deshalb sollte man hinterher immer mal den Phasengang prüfen oder in einem Simulator per Transienten-Analyse im Zeitbereich prüfen, ob das Filter stabil ist.

Bei dieser digitalen offline-Filterung hat man übrigens die Möglichkeit, auch recht komplexe Entzerrungen ganz ohne Phasengang/Gruppenlaufzeit zu erzeugen, ohne gegen Kausalitätsregeln oder Stabilitätsbedingungen zu verstoßen. Dazu muß man die Wurzel aus dem gewünschten Betragsfrequenzgang mit einer geeigneten Filterstruktur approximieren und dann den WAV-File einmal vorwärts und einmal rückwärts da durch schicken.

MfG Kai
Zitieren
#16
Hallo Kai,

kaimex,'index.php?page=Thread&postID=201132#post201132 schrieb:Deshalb sollte man hinterher immer mal den Phasengang prüfen

ist es dazu möglich, ähnlich wie die Amplitude auch die Phase als Funktion der Frequenz als geschlossene Form hinzuschreiben? Sollte ja eigentlich kein Hexenwerk sein, wahrscheinlich der Imaginärteil der H(z)-Funktion? Leider steigen die meisten Artikel so schnell in die Tiefe der Rechnungen ab, dass mir doch das E-Technik-Studium fehlt, um lässig mit z-Transformationen etc. hantieren zu können...

Viele Grüße
Andreas
Zitieren
#17
Einen letzten praktischen Hinweis habe ich heute noch zu dem Thema:

Auch das verbreitete Programm Audacity hat einen Equalizer, den wohl auf einer FFT beruht, und den man mit eigenen Kurven versorgen kann. Eine Anleitung dazu gibt es hier: http://wiki.audacityteam.org/wiki/EQCurvesDownload

Den passenden xml-Code für unseren Anwendungsfall kann man mit dem Python-Beispiel oben erzeugen - er sieht (verkürzt) so aus:

Code:
<equalizationeffect>
  <curve name="deemphasis">
    <point f="20.000000000000" d="-0.000156000000"/>
    <point f="25.178508000000" d="-0.000247000000"/>
...
    <point f="158865.646944999986" d="-10.439989000000"/>
    <point f="200000.000000000000" d="-10.446469000000"/>
    <point f="251785.082358999993" d="-10.450564000000"/>
  </curve>
</equalizationeffect>

In der Anwendung:

   

Die Abweichungen in der Amplitude sind tendentiell noch kleiner als oben gezeigt. Den Phasengang habe ich aber nicht geprüft...

Hier noch die komplette Kurve (mit fremder .txt-Endung, dass sie hier akzeptiert wird):
.txt   EQCurves.xml.txt (Größe: 2.34 KB / Downloads: 2)

Viele Grüße
Andreas
Zitieren
#18
Der Phasengang ist nichts anderes als ATAN2(Real(H(z)),Imag(H(z))) und unter MATALB, Octave & SciLab auch so einfach zu ermitteln. Teils gibt es sogar "Unwrap"-Funktionen für den Fall, daß die Phase um einige 2 Pi dreht. Da gibt es keinen prinzipiellen Unterschied zu dem, was "man" von der Laplace-Transformation kennt.

Filter-Realisierung per FFT ist ein ganz andere "Schnack". Sicher extrem flexibel, aber auch mit großer Vorsicht zu genießen, wil Phasengang und Impulstreue (Einschwingverhalten) für die meisten viel weniger transparent sind als bei den klassischen Filtern und ihren digitalen Entsprechungen.
Wenn du einen Betragsfrequenzgang einfach per Gewichtung aus den Frequenzbins einer hinreichend aufgelösten FFT erzeugst, ohne eine Window -Funktion zu verwenden, erzeugt jeder isolierte Bin im Zeitbereich einen sin(x)/x Einschwingvorgang. Was insgesamt durch die Überlagerung aller gewichteten Bins "hinten" rauskommt , ist schwer überschaubar.
Überdies geht Filterung per FFT mit Blockverarbeitung. Die Mathematik der FFT ist äquivalent einer Eingangsfunktion, die unendlich periodisch das Analyse-Zeitfenster wiederholt. Das hat natürlich mit der Realität fast immer nichts zu tun. Deshalb muß man, um Artefakte an den Blockgrenzen zu vermeiden, immer überlappende Blöcke (zB 50% Überlapp) verarbeiten und dann mit einer Überblend-Funktion mischend aneinander anfügen, so daß die unbrauchbaren Enden jedes Blocks mit Gewicht 0 eingehen.
Das wäre für die Realisierung einer DeEmphasis ein maßloser Overkill mit möglicherweise sehr fragwürdigem Phasengang und Impulsverhalten.
Nötig bzw. die Methode der Wahl wäre es allerdings z.B. für die dynamische Rausch-Unterdrückung historischer Aufnahmen.

MfG Kai
Zitieren
#19
andreas42,'index.php?page=Thread&postID=201126#post201126 schrieb:Hallo,

Sagt bitte bescheid, wenn ich Euch auf die Nerven gehe... vorsichtshalber ein weniger theoretischer Beitrag:

Ich habe die Beispielfiles auch nochmal durch die verschiedenen Filter laufen lassen und die Abweichungen geplottet:

[attachment=14304][attachment=14305]

Zu sehen sind die beiden oben diskutierten IIS-Filter sowie der deemph-Effekt aus SoX 14.3.2 (in meinem Ubuntu von 2012 enthalten). Alle Abweichungen sind kleiner als 0.2 dB. Meiner Meinung nach kann man also SoX in aktuellen Versionen problemlos verwenden:

Code:
sox pcm_pre.wav deemph-sox-14.3.2.wav deemph
Hallo Andreas,

ich habe mir SoX nach Deinem Bericht mal auf den Rechner geholt und das o.g. Beispiel umgerechnet. Der Frequenzgang sieht gut aus und auch die Überschwinger sind vorhanden.
Ich nutze für Korrekturen in Audiomaterial zwar auch FFT-Filter, aber für diese Aufgabe wehrt sich etwas in mir. Allerdings verstehe ich auch nur einen Bruchteil (hust!) von dem, was da alles passiert.

Da ich die Erfahrung gemacht habe, daß die Art des Dithers (zumindest gefühlt) den Klang beeinflussen kann, habe ich SoX meine Musikbeispiele mit PreEmphasis in 32 Bit umrechnen lassen und die Reduktion auf 16 Bit dann mit Audition durchgeführt.

Code:
sox Beispiel__PreEmphasis.wav -e float -b 32 Beispiel__SoX_Deemph.wav

Dieser Aufruf müsste doch eine Berechnung ohne Dither zur Folge haben. Richtig?
BTW: Gibt es eine GUI für SoX unter Windows, die auch mehrere Dateien bearbeiten kann?

Ich werde die von SoX berechnete Datei mal gegen die anderen o.g. Umrechnungsbeispiele testen und dann berichten, was aber noch ein paar Tage dauern kann. Ich melde mich dann hier wieder.
Danke schon mal an alle für die Rückmeldungen!


Grüße

96k
Zitieren
#20
Hallo 96k,

96k,'index.php?page=Thread&postID=201151#post201151 schrieb:Dieser Aufruf müsste doch eine Berechnung ohne Dither zur Folge haben. Richtig?

darum habe ich mich noch nicht gesorgt. Die Anleitung (Abschnitt "Dithering") verstehe ich so, dass unter bestimmten Umständen (z.B. explizite oder implizite Reduktion der Bit-Breite) automatisch Dithering hinzugefügt wird. Hilfreich fand ich diesen Hinweis:

Zitat:Use the −V option to see what processing SoX has automatically added. The −D option may be given to override automatic dithering.

Du kannst also mit "-V3" (Descriptions of SoX’s processing phases are also shown. Useful for seeing exactly how SoX is processing your audio.) sehen, ob er Dithering hinzufügt, und es mit "−D" oder "−−no−dither" explizit abschalten.

96k,'index.php?page=Thread&postID=201151#post201151 schrieb:BTW: Gibt es eine GUI für SoX unter Windows, die auch mehrere Dateien bearbeiten kann?

Da habe ich keine Ahnung, weil ich auf der Kommandozeile (und auch nicht unter Windows) unterwegs bin. Auf einer Linux-Shell würde ich eine einfache Schleife machen:

Code:
for i in *wav; do sox $i out-$i deemph; done

Bestimmt geht in der Windows-Shell etwas ähnliches.

Viele Grüße
Andreas
Zitieren
#21
Im Cmd-Tool von Windows/DOS lautet ein entsprechender Befehl zB

for %%x in (*.wav) do wavcheck3 %%x

Den schreibt man entweder direkt ins Cmd-Window oder in einen Batch-File namens zB checkall.bat
und ruft den im Cmd-Window auf oder macht im Explorer einen Doppelclick darauf.

%%x ist eine File-Variable, die nacheinander die Namen aller Files annimmt, die dem Muster *.wav entsprechen.
wavcheck3 %%x ist hier der auszuführende Befehl., der müßte durch den gewünschten Sox-Befehl ersetzt werden.
Der Befehl wird also in diesem Fall auf allen wav-Files in einem Directory ausgeführt.

MfG Kai
Zitieren
#22
Hallo zusammen,

eine weitere Möglichkeit ist mir noch eingefallen. Ob es so funktionieren würde, müssten die Kundigeren unter Euch beantworten.

Meine Soundkarte (M-Audio Delta 1010) bietet einen SPDIF-Eingang, bei dem man im Software Mixer die Emphasis zwischen 'not indicated' und '50/15 usec' umstellen kann.

Also müsste man ja - einen CD-Player mit Digitalausgang voraussetzend - die CD mit Emphasis über die Soundkarte digital aufnehmen können, und hätte dann eine prakisch verlustfreie Kopie, die dann wieder als WAV-Datei (jetzt ja ohne Emphasis) weiter verarbeitet werden kann...

Denke ich richtig?

Gruß,
Klaus

(Edit: Tippfehler)
Zitieren
#23
Hallo Klaus,

das könnte so richtig sein.
Du müßtest aber noch mal nachprüfen, ob da De-Emphasis oder Pre-Emphasis gemeint ist, oder anhand eines Beispiels testen, ob das richtige getan wird.
De-Empasis heißt wieder die Höhen absenken, während Pre-Emphasis meint Höhen anheben.
Eigentlich sollen CD-Player automatisch richtig auf das im Datenstrom enthaltene Indikator -Bit reagieren, also wenn anzeigt wird, daß Pre-Emphasis vorliegt, mit De-Emphasis wiedergeben. Das scheint aber in vielen Geräten schlampig oder garnicht implementiert zu sein, weil nach der Anfangsphase dieser Geräte die Anwendung von Pre-Emphasis und die Notwendigkeit zur De-Emphaisis verschwanden.
Ich hatte bislang noch nicht gehört, daß es eine De-Emphasis Option für S/PDIF Eingänge gibt.

MfG Kai
Zitieren
#24
Hallo Kai,

hier ein Auszug aus der Anleitung (aus dem Englischen per Google übersetzt):
Zitat:

Zitat:CONSUMER FORMAT ADVANCED SETTINGS (Hervorhebung): Dieses Statusbit wird verwendet
Geben Sie an, ob eine Vorbetonung auf das ausgehende digitale Audiosignal angewendet wurde. Die Voreinstellung ist
"Keine" und selten wird jeder Benutzer den Wert auf "50 / 15uSec" setzen, es sei denn, der übertragene
Audio wurde mit 50 / 15uSec Pre-Hervorhebung codiert.

Im Original:
Zitat:CONSUMER FORMAT ADVANCED SETTINGS (Emphasis): This status bit is used to
indicate if pre-emphasis has been applied to the outgoing digital audio signal. The default is
"None" and rarely will any user want to set the value to "50/15uSec" unless the transmitted
audio has been encoded with 50/15uSec pre-emphasis.

Die Soundkarte hat auch einen SPDIF-Ausgang.
Wenn ich das Zitat richtig deute, wird also bei der Ausspielung einer Aufnahme mit Pre-Emphasis über den SPDIF-Ausgang und aktivierter Emphasis '50/15 uSec' das Signal korrigiert ausgegeben, oder?

Ich selbst habe keine Notwendigkeit, mich interessiert nur, ob meine Überlegungen so zutreffen Wink ?(

Gruß,
Klaus
Zitieren
#25
Hallo Klaus,

es gibt im S/PDIF-Protokoll ein Statusbit für Pre-Emphasis, siehe z.B. hier: https://en.wikipedia.org/wiki/S/PDIF (leider ist es im deutschen Artikel nicht erwähnt). Wenn ich es richtig verstehe, dient es dazu, dem empfangenden Gerät anzuzeigen, wie die digitalen Daten denn bei der D/A-Wandlung interpretiert werden sollen. Diese Korrektur ist aber Sache des Empfängers - deswegen muss es ihm ja angezeigt werden, sonst könnte es ja auch der Sender vorher erledigen.

Fast zufällig habe ich herausgefunden, dass es unter Linux das Tool "iecset" gibt, um die Statusbits des S/PDIF-Ausgangs abzufragen und zu setzen. An meiner Onboard-Soundkarte (mit optischem Ausgang) ausprobiert, kommt folgendes zurück:

Code:
Mode: consumer
Data: audio
Rate: 44100 Hz
Copyright: permitted
Emphasis: none
Category: general
Original: original
Clock: 1000 ppm

Nun kann ich es auch mit "iecset emphasis 1" einschalten - was mit "Emphasis: 50/15us" quittiert wird. Auch die anderen Statusbits kann man damit ändern.

Zum Test habe ich meinen DAT-Recorder mit dem Ausgang verbunden und ohne Band auf Aufnahme gedrückt. Er arbeitet dann einfach als D/A-Wandler. Zunächst kann ich vermelden, dass die Emphasis-Anzeige im Display aufleuchtet, wenn ich es setze - also funktioniert die Einstellung. Hier schonmal die Bilder (Display leider nicht ganz scharf, aber erkennbar):

       

Man sieht im rechten Bild die Orange "EMPHASIS"-Anzeige. Beide Bilder zeigen das Abspielen eines 10kHz-Sinus - die digitale Pegelanzeige ändert sich aber nicht. Das ist für mich ein Hinweis darauf, dass das Digitalsignal wie erwartet nicht verändert wird. Ein kurzer Hörtest hat jedoch ergeben, dass auf der analogen Seite offenbar das De-Emphasis stattfindet. Mit weißem Rauschen war das sehr deutlich wahrzunehmen.

Ausgemessen habe ich den Frequenzgang nicht - ein ander Mal vielleicht, und dann auch mit dem Test, ob mein CD-Player das Bit kennt und behandelt. Bei CDs kann man es ja auch je Track setzen.

Die Beschreibung Deiner Soundkarte passt zu genau dem gleichen Verhalten: Man kann das Status-Bit am Ausgang setzen, sollte das aber nur machen, wenn das abgespielte Material vom Empfänger im Falle einer D/A-Wandlung entzerrt werden soll.

Viele Grüße
Andreas
Zitieren
#26
Hallo Klaus,

ich interpretiere die Beschreibung, mehr noch das englische Original als die automatische Übersetzung, so , daß genau das Richtige zumindest beabsichtigt ist. Ob auch wirklich das Richtige getan wird, sollte man (nach den negativen Erfahrungen in früheren Gerätetests) vielleicht noch mal verifizieren.
Ich war bis jetzt allerdings immer der Meinung, daß es Aufgabe eines Abspiel-Gerätes sei, sich erforderlichenfalls um die De-Emphasis zu kümmern. und nicht des Endpunktes einer digitalen Übertragungskette. Es ist aber zweifellos nützlich, daß es diese Option gibt, um "Versäumtes nachzuholen".

MfG Kai
Zitieren
#27
Hallo zusammen,

weil wir gerade beim Thema sind, habe ich mich erinnert, vor längerer Zeit schonmal nach dem Sinn von Pre-Emphasis gefragt zu haben: Pre-Emphasis bei CD und DAT?. Gerade habe ich mich wieder mit Freuden durch die sachkundigen Antworten von damals gelesen - vielleicht interessiert es Euch ja ebenfalls.

Gute Nacht
Andreas
Zitieren
#28
"96k" hatte ein paar Beispiele zusammengestellt, bestehend aus dem Ausgangs-File mit PreEmphasis und drei verschiedenen DeEmphasis-Versuchen. Ich hab eines von den 2 Beispielen mal spektral analysiert.
Es handelt sich um die Files
Al1 = Al_Stewart_-_On_The_Border__DeEmphasis_Audition__16Bit.wav
Al2 = Al_Stewart_-_On_The_Border__DeEmphasisi_Foobar_IIR-DSP__16Bit.wav
Al3 = Al_Stewart_-_On_The_Border__PreEmphasis.wav
Al4 = Al_Stewart_-_On_The_Border__SoX_Deemph_Audition_Dither16Bit.wav
Hier zunächst mal die über die gesamte File-Länge gemittelten rms- und peak-Werte der FFTs:
    Rot: Peak, Blau: rms
   
    Dies ist der Ausgangs-File mit PreEmphasis
   

Wenn man das dritte Bild von den drei anderen abzieht, kommt dies raus:
1. Peak-Values :
   

2. Rms-values :
   

Rot ist der mit SoX bearbeitete Fall.
Er liegt am dichtesten bei der idealen DeEmphasis (schwarz gestrichelte Kurve).

MfG Kai
Zitieren
#29
kaimex,'index.php?page=Thread&postID=201231#post201231 schrieb:2. Rms-values :
[attachment=14335]

Rot ist der mit SoX bearbeitete Fall.
Er liegt am dichtesten bei der idealen DeEmphasis (schwarz gestrichelte Kurve).
Interessant. Es stellt sich hier ein etwas anderes Ergebnis dar als bei der Frequenzgangmessung mit den Sinustönen.
Sind das die Fehler im PreEmpasis-Filter der Aufnahme?


Danke und Grüße

96k
Zitieren
#30
Die Frage kann ich nicht beantworten, weil ich nicht weiß, welche Messung mit welchen Daten du meinst und wie groß die Abweichungen waren.
Dazu müßte man dann auch noch wissen, welchen Frequenzgang-Ripple der ADC bei Aufnahme hat.
Bei meiner Bewertung im vorigen Beitrag ist vorausgesetzt, daß die zusätzliche Dither-Prozedur nicht von weiteren Frequenzgängen begleitet war, bzw. es ist eine Aussage über jeweils den ganzen Wiegergabe-Prozess.

MfG Kai

Nachtrag:
Man kann aus den Audio-Daten in den Files mit DeEmphasis und dem mit PreEmphasis auch direkt die benutzten Filter-Koeffizienten berechnen/schätzen, wenn man über ein passendes Modell verfügt. Das hab ich mal gemacht auf Basis eines 8192 Sample langen File-Ausschnittes.
Mit dem Modell eines IIR-Filters 1.Ordnung : H(z) = (a1 + a2 z) / (1 - c z), (z steht hier in vereinfachter Schreibweise ohne ^-1 für den Verzögerungs-Operator) bekommt man für die drei Fälle diese Werte:
Rote Kurve : SoX : a1 ~ 0.460599 , a2 ~ -0.090282 , c ~ 0.629285
Grüne Kurve: Foobar IIR-Plugin : a1 ~ 0.457843 , a2 ~ -0.0803988 , c ~ 0.6234286
Blaue Kurve : 96k-spezial : a1 ~ 0.485614 , a2 ~ -0.1351422 , c ~ 0.6488056
Dies ist jedoch eigentlich ein dreifaches parametrisches Filter 2. Ordnung, worauf das IIR-Modell 1.Ordnung natürlich nur grob paßt, aber der Frequenzverlauf bis 20 kHz wird doch einigermaßen richtig modelliert.
Zitieren


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste