Hallo zusammen,
da liest man mal ein paar Tage nicht richtig mit, und schon diskutiert Ihr eines meiner Lieblingsthemen . Viel habe ich nicht hinzuzufügen:
Naja, was ich über digitale Filter weiß, habe ich von Dir gelernt...
In SoX werden eigentlich alle Filter auf einen "Biquad"-Filter, also einen IIR-Filter 2. Ordnung zurückgeführt. Man kann entweder die Koeffizienten direkt angeben, oder eben Effekte wie "highpass", "lowpass", "bass", "treble", ... verwenden, die dann nach Kochbuch-Formel die entsprechenden Koeffizienten setzen.
Wenn ich mich richtig erinnere hatte ich mal ausgeknobelt, wie ich aus zwei Filtern 1. Ordnung korrekt die Biquad-Koeffizienten ausrechnen kann, um sie zu kombinieren. Das ist für Dich bestimme eine leichte Fingerübung, Kai. Deine beiden Shelves würden dann in einen Sox-Aufruf mit 5 oder 6 Zahlen passen. Wenn das nicht reicht, ist es auch nicht so schwierig, die nötigen Filter mit SciPy einfach direkt auf das wav-File anzuwenden. In die Verlegenheit kam ich aber noch nicht.
Nicht ganz - der EQ-Effekt in Audacity erlaubt den Ex- und Import von Filterkurven, früher als XML, inzwischen als Text oder csv. Da kann man recht einfach die gewünschten Punkte der Kurve ganz genau angeben, z.B. so:
Dazu ist folgende XML-Datei nötig:
Einen Knopf zum Invertieren gibt es in dem Effekt auch. Ein Skript, um die Zahlen auszurechnen und das XML-File zu generieren habe ich auch, falls es interessiert
Viele Grüße
Andreas
Nachtrag: besagtes Skript... damit lassen sich für alle "Aufgenommen mit Entzerrung X, abgespielt bei Entzerrung Y" und weitere kreative Kombinationen die passenden EQ-Filterkurven für Audacity erzeugen und danach importieren.
da liest man mal ein paar Tage nicht richtig mit, und schon diskutiert Ihr eines meiner Lieblingsthemen . Viel habe ich nicht hinzuzufügen:
(03.07.2021, 11:01)kaimex schrieb: Die digitale Entzerrung kann man (möglicherweise) mit dem Programm SoX durchführen. Es enthält zumindest Lowpass & Highpass Shelf-Filter 2.Ordnung, mit denen sich auch solche 1.Ordnung approximieren lassen. Andreas(42) weiß da aber besser Bescheid.
Naja, was ich über digitale Filter weiß, habe ich von Dir gelernt...
In SoX werden eigentlich alle Filter auf einen "Biquad"-Filter, also einen IIR-Filter 2. Ordnung zurückgeführt. Man kann entweder die Koeffizienten direkt angeben, oder eben Effekte wie "highpass", "lowpass", "bass", "treble", ... verwenden, die dann nach Kochbuch-Formel die entsprechenden Koeffizienten setzen.
Wenn ich mich richtig erinnere hatte ich mal ausgeknobelt, wie ich aus zwei Filtern 1. Ordnung korrekt die Biquad-Koeffizienten ausrechnen kann, um sie zu kombinieren. Das ist für Dich bestimme eine leichte Fingerübung, Kai. Deine beiden Shelves würden dann in einen Sox-Aufruf mit 5 oder 6 Zahlen passen. Wenn das nicht reicht, ist es auch nicht so schwierig, die nötigen Filter mit SciPy einfach direkt auf das wav-File anzuwenden. In die Verlegenheit kam ich aber noch nicht.
(03.07.2021, 19:02)kaimex schrieb: Bei Audacity fummelt man sich Filter/Entzerrer graphisch zurecht. Da hapert es schon mit der Treffsicherheit und Reproduzierbarkeit.
Nicht ganz - der EQ-Effekt in Audacity erlaubt den Ex- und Import von Filterkurven, früher als XML, inzwischen als Text oder csv. Da kann man recht einfach die gewünschten Punkte der Kurve ganz genau angeben, z.B. so:
Dazu ist folgende XML-Datei nötig:
Code:
<equalizationeffect>
<curve name="120+3180 nach 2x 90+3180">
<point f="10.0" d="3.916536863869566"/>
<point f="12.5" d="3.685498834880333"/>
<point f="16.0" d="3.3245284145264877"/>
<point f="20.0" d="2.889142962392669"/>
<point f="25.0" d="2.352899129167688"/>
<point f="31.5" d="1.7181616971297389"/>
<point f="40.0" d="1.0312854492386927"/>
<point f="50.0" d="0.42047021465463996"/>
<point f="63.0" d="-0.13018070548589877"/>
<point f="80.0" d="-0.5822691645590701"/>
<point f="100.0" d="-0.8933809037103024"/>
<point f="125.0" d="-1.1083419045246155"/>
<point f="160.0" d="-1.2533240827883974"/>
<point f="200.0" d="-1.3155882728308663"/>
<point f="250.0" d="-1.3212222119962853"/>
<point f="315.0" d="-1.2694066817537892"/>
<point f="400.0" d="-1.1499169142507517"/>
<point f="500.0" d="-0.9706598866624607"/>
<point f="630.0" d="-0.7110183522552596"/>
<point f="800.0" d="-0.3684307634475654"/>
<point f="1000.0" d="0.0"/>
<point f="1250.0" d="0.38280040488467093"/>
<point f="1600.0" d="0.779967261010498"/>
<point f="2000.0" d="1.085304292331916"/>
<point f="2500.0" d="1.3270197880910628"/>
<point f="3150.0" d="1.512259645948988"/>
<point f="4000.0" d="1.645557401436329"/>
<point f="5000.0" d="1.729611115310669"/>
<point f="6300.0" d="1.7874442376269724"/>
<point f="8000.0" d="1.8259615384854115"/>
<point f="10000.0" d="1.8490314892250066"/>
<point f="12500.0" d="1.8639679040856987"/>
<point f="16000.0" d="1.8743942435606418"/>
<point f="20000.0" d="1.8803028304992122"/>
<point f="25000.0" d="1.8840953990449425"/>
<point f="31500.0" d="1.8865955970330337"/>
<point f="40000.0" d="1.8882138101308936"/>
<point f="48000.0" d="1.8890216753169125"/>
</curve>
</equalizationeffect>
Einen Knopf zum Invertieren gibt es in dem Effekt auch. Ein Skript, um die Zahlen auszurechnen und das XML-File zu generieren habe ich auch, falls es interessiert
Viele Grüße
Andreas
Nachtrag: besagtes Skript... damit lassen sich für alle "Aufgenommen mit Entzerrung X, abgespielt bei Entzerrung Y" und weitere kreative Kombinationen die passenden EQ-Filterkurven für Audacity erzeugen und danach importieren.
Code:
import numpy as np
def db(x):
return 20. * np.log10(x)
def lpf(f, tau):
return 1. / np.sqrt(1. + (2. * np.pi * f * tau)**2)
def hpf(f, tau):
return (2. * np.pi * f * tau) * lpf(f, tau)
def iec38(f):
return db(lpf(f, 35e-6))
def nab38(f):
return db(lpf(f, 50e-6)) - db(hpf(f, 3180e-6))
def iec19(f):
return db(lpf(f, 70e-6))
nab19 = nab38
def nab9(f):
return db(lpf(f, 90e-6)) - db(hpf(f, 3180e-6))
def nab4(f):
return db(lpf(f, 120e-6)) - db(hpf(f, 3180e-6))
iec9 = nab9
freqs = np.array([ 10., 12.5, 16., 20., 25., 31.5, 40., 50., 63., 80.,
100., 125., 160., 200., 250., 315., 400., 500., 630., 800.,
1000., 1250., 1600., 2000., 2500., 3150., 4000., 5000., 6300., 8000.,
10000., 12500., 16000., 20000., 25000., 31500., 40000., 48000. ])
def write_eq(name, function, out, ref=0.):
print('<curve name="{}">'.format(name), file=out)
for f in freqs:
y = function(f) - ref
print('<point f="{}" d="{}"/>'.format(f, y), file=out)
print('</curve>', file=out)
if __name__ == '__main__':
with open('out.xml', 'w') as eqfile:
print('<equalizationeffect>', file=eqfile)
f = lambda x: nab4(x) - nab9(2*x)
write_eq('120+3180 nach 2x 90+3180', f, eqfile, f(1000))
f = lambda x: nab4(x) - nab19(2*x)
write_eq('120+3180 nach 2x 50+3180', f, eqfile, f(1000))
f = lambda x: nab9(x) - nab19(2*x)
write_eq('90+3180 nach 2x 50+3180', f, eqfile, f(1000))
f = lambda x: iec19(x) - nab19(x)
write_eq('70 nach 50+3180', f, eqfile, f(1000))
f = lambda x: nab19(x)
write_eq('NAB 19 (50+3180)', f, eqfile, f(1000))
f = lambda x: nab9(x)
write_eq('NAB 9.5 (90+3180)', f, eqfile, f(315))
f = lambda x: nab4(x)
write_eq('NAB 4.76 (90+3180)', f, eqfile, f(315))
f = lambda x: nab4(x) - nab9(x)
write_eq('120+3180 nach 90+3180', f, eqfile, f(333))
print('</equalizationeffect>', file=eqfile)