Forum: Digitale Signalverarbeitung / DSP / Machine Learning Transienten Filter für 8fs Audio gesucht


von Klaus (Gast)


Lesenswert?

Hallo,
ich habe ein normales 44,1 & 48 KHz I²S Eingangssignal, dann einen ARM 
M7 und dann 2 8fs DA-Wandler.
Warum so? Warum nicht!
Früher gab es dafür fertige ICs und die klangen angeblich besser wie die 
ganzen aktuellen. Heute muss ich halt auf die neuen DA-Wandler zugreifen 
und versuchen das "Beste" raus zuholen.
Technisch funktioniet das auch schon super.

Nur jetzt geht es halt an die ganzen Feinheiten ran.
Und da suche ich einen guten Digital Filter.
Beim suchen bin ich da mehrfach über den Begriff Transienten Filter  und 
Gibbs Filter gestolpert und wollte so etwas mal einbauen.
Da wird meistens von einem asymmetrischen FIR filter mit maximal 32 taps 
geredet.
Fertigen CODE oder einfach die Parameter für den Filter findet man nicht 
und aus denn Informationen werde ich nicht so richtig schlau draus.

Vielleicht kann mir hier jemand etwas helfen.

Viele Grüsse, Klaus

PS.:
Falls jemand nicths mit 8fs anfangen kann:
Das ist ein MONO Signal mit 8-Fach oversampling.

von DSP (Gast)


Lesenswert?

Früher hatte man externe Interpolationsfilter in Form eines eigenen ICs 
auf den Boards gehabt und ist dann mit z.B. 8*fs in den DAC 
reingegangen.

Das Prinzip ist heute immernoch das gleiche, nur dass das 
Interpolationsfilter heutzutage direkt schon in den DAC chips mit 
drinnen ist.

Ich denke früher was das technologisch nicht machbar, das zusammen auf 
einen Die zu bekommen.

Warum brauchst du das unbedingt? Notfalls kann man das easy in einem 
FPGA bauen.

von DSP (Gast)


Lesenswert?

Was die Interpolation angeht denke ich kann man keine Regel fest machen 
wie viele FIR Tabs du wirklich brauchst.

Du musst zu jedem hereinkommenden Sample 7 Samples zusätzlich dazu 
bauen. Das erfolgt durch Stuffen mit null-Werten.
Um den Energieverlust dabei auszugleichen, musst du jedes hineinkommende 
Sample mit Faktor 8 dafür multiplizieren.

Danach einfach durch einen FIR filter mit fs = 8*original_fs. Band-Pass 
bis 20 kHz und danach Band-Stop von 20kHz - fs/2 mit > 100dB

von Klaus (Gast)


Lesenswert?

"Man" kann einen FPGA nehmen, ich aber nicht!
Davon habe ich nahezu NULL Ahnung.

Ich mache zur Zeit eine Lineare interpolation zwischen den Werte.
War auf die  schnelle das einfachste um an die fehlenden Werte zukommen.
Hatte am Anfang aber auch nur ein 8 faches Kopieren gemacht.

Im Specktrum sieht das Interpolierte Signal bei mir besser aus.
Wenn ich da eine Spline Kurve rein mache wird es bestimmt noch besser.
Oder ich schaue mal nach wie die Up/Downsampler arbeiten, dafür gibt es 
zum Glück einige Codebeispiele und sollte nicht so scwer sein das rein 
zu machen.

?  Das habe ich auf die schnelle nicht verstanden.

von Dergute W. (derguteweka)


Lesenswert?

Moin,

Guck' dir mal CIC-Filter an.
Letztendlich interpolieren die mit einem Polynom  Nter Ordnung (also 
z.b. auch eine Gerade mit N=1) zwischen N+1 Samples.

Dieser Tansienten/Gibbsvoodo kommt mir etwas - hm - esotherisch daher.
Manche hier werden deutlicher:
https://www.audiosciencereview.com/forum/index.php?threads/ifis-gibbs-transient-optimized-filter-whitepaper.4662/

Hier hat einer die Impulsantworten aufgezeichnet, damit solltest du die 
Koeffizienten ungefaehr rauskriegen koennen:
https://audiophilestyle.com/forums/topic/55951-ifi-foe-fum/

Gruss
WK

: Bearbeitet durch User
von Tobias (. (Gast)


Lesenswert?

Klaus schrieb:
> Da wird meistens von einem asymmetrischen FIR filter mit maximal 32 taps
> geredet.

Da "redet" wohl jemand was vom Pferd. 32 TAPs bei einem Filter von 48kHz 
reichen nicht mal bis 1kHz herunter. Da kannst du nur den Treble 
prozessieren. Solche Filter als FIR haben eher die 50fache Länge. Mit 
einer Lamba-Viertel-Argumentation und Augezudrücken sind das dann 20Hz 
mit 5Hz roll off. Da kann man denn den Gleichanteil noch so raushauen, 
dass eine akzeptable Bandbreite über bleibt.

Die Vorgehensweise das mit SPAR-Filtern zu bauen, ist der mangelnden 
Rechenleistung geschuldet.

Als Beispiel habe ich vor einiger Zeit einen Time-to-Digital-Filter 
implementiert, der gesampelte Daten von 120MHz auf 10MHz umsetzt. 
Theoretisch eine einfache Dezimation. Brauchte aber auch schon 112TAPs 
für die geforderte Genauigkeit.

Du brauchst wahrscheinlich einen Interpolationsfilter mit 
Rausch-Beaufschlagung zum Dithern. Da sind wenigstens 50-100 Taps/Takte 
in der Quelldomain fällig- also rund 500 in der Zieldomain, sonst gibt 
es zu viele Fehler.

von DSP (Gast)


Lesenswert?

Hier kannst du dir mal eine Beispielimplementierung für einen 
Audio-Upsampler in VHDL anschauen.

In dem Falle war es 96 kHz auf 384 kHz.
Sind in dieser Implementierung ~124 FIR tabs.

Wobei man aber sagen muss, dass die reale Rechenlast deutlich niedriger 
ist, weil 3 von 4 samples ja eh "null" sind und dadurch im voraus 
bekannt ist, dass bei allen Tabs mit samples=0 das ergebnis auch 0 ist.
Daher musst du nur 1/4 an tabs wirklich durchrechnen.

von DSP (Gast)


Lesenswert?


von Klaus (Gast)


Lesenswert?

Voodo und Hexerrei Filter brauche ich nicht, dafür habe ich 
Bergkiristalle auf dem Prozessor und den restlichen ICs.

Also ein CIC-Filter hilft schonmal um die Lücken zu füllen.
Der Einbau ist fast fertig.
Die Frequenzen oberhalb von 28Kz sollten auch raus sein.

Ich muss aber das ganze noch sauber vermessen. In einem der Links hatte 
jemand den Datenstom vor dem DAC abgegriffen. Das ist eingentlich eine 
gute Idee, weil somit habe ich keine Fehler vom DAC oder der OP 
Schaltung dahinter.

Die Filter haben schon eine gewisse Prozessor Last und übertreiben 
sollte ich es nicht auch wenn der intere DSP Kram schon recht schnell 
ist.
Bis jetzt langweilt der Prozessor sich aber noch, wenn die Filter drin 
sind wird dass wohl schon anders aussehen.

Ein Dither auf das Signal werde ich wohl auch noch legen, aber ich denke 
das würde jetzt meine Messwerte zusehr beeinflussen.

Die angegeben 32 TAPs fand ich auch schon etwas wenig, aber da ich nicht 
der super Filter Experte bin habe ich das erstmal so hingenommen.
Hatte mir aber so gedacht das das etwas wenig ist im gegensatz zu 
anderen Filtern die ich vorher immer mal wieder benutzt hatte.


Was ist denn nun genau so ein Transienten / Gibbs Filter?
Wie macht man den am einfachsten?

von Dergute W. (derguteweka)


Lesenswert?

Moin,

Klaus schrieb:
> Was ist denn nun genau so ein Transienten / Gibbs Filter?
Marketingbla+Schlangenoel.

> Wie macht man den am einfachsten?
Gib dem Hersteller all dein Geld.

SCNR,
WK

von Klaus (Gast)


Lesenswert?

Wie sehen den die Parameter bei diesem Schlangenoel Filter aus?

Soviel wollte ich nicht ausgeben, etwas brauche ich zum Leben.

von Dergute W. (derguteweka)


Lesenswert?

Moin,

Aus dem Link mit dem Frequenzgang und den Impulsantworten, den ich oben 
angegeben hab', wuerd' ich mal rauslesen/mutmassen, dass man sowas als 
eine Kombination aus einem IIR und einem FIR hinkriegen koennte.
Die Impulsantwort sieht aus, wie von einem IIR (z.b. Butterworth oder 
sowas) Filter.
Der Frequenzgang hat aber bei 168kHz so eine komische Beule, wo die 
Sperrdaempfung wieder schlechter wird; die Nullstellen liegen aber um 
96kHz herum ziemlich symmetrisch.
Daraus schliess' ich mal, dass da noch ein FIR-Filter nachgeschaltet 
ist, evtl. sowas von dem Kaliber [1,3,3,1]/8 und das IIR Filter nur auf 
der 4fachen, nicht 8fachen Frequenz laeuft, so dass dessen 
Amplitudenverlauf ab der Mitte (96kh) wieder gespiegelt wird. So koennte 
das aussehen...
Sind aber nur alles meine wirren Vermutungen.

Gruss
WK

von Klaus (Gast)


Lesenswert?

So kleines Update.

Ich habe nun einen CIC-Filter eingebaut um die Fehlenden Werte zu 
ergänzen.
Und mehrere Filter habe ich auch getestet für den Stopband Bereich > 
24Khz.
Ich muss nur mal schauen wie ich Bilder zum vorzeigen und Diskutieren 
erstellen kann. Mein Messgerät hat eine GPIB Schnittstelle!

Rechteck, Sweep , Impulse und Sinus sehen noch gut aus.
Kann man aber mit sicherheit noch optimieren.
Besonders die Impulse / Rechtecke, aber das war ja zuerwarten wenn man 
einen Filter einbaut.

Einem IIR und einem FIR Filter hintereinander kann ich machen, ob das 
dann am Ende genauso wird glaube ich nur nicht. Wobei dieser Filter ja 
nicht wirklich so Super aussieht.

Bei weiteren Suchen nach einem Transienten Filter bin ich auf einen HDCD 
Chip gestossen, der neben vielen andern schönen Sachen, so was auch drin 
haben soll. Also doch kein Voodoo?
Habe aber keine Bilder von diesem Filter gefunden.
HDCD kann ich nur nicht gebrauchen, weil ich so ein Matterial nicht 
habe.
Ich denke auch das ein Nachbau meinen ARM Prozessor an seine Grenzen 
bingen würde. Aber der Chip kann einniges was ich geplant hatte 
einzubauen und ist somit als Referenz Info wieder hilfreich.

von Dergute W. (derguteweka)


Lesenswert?

Moin,

Klaus schrieb:
> Einem IIR und einem FIR Filter hintereinander kann ich machen, ob das
> dann am Ende genauso wird glaube ich nur nicht. Wobei dieser Filter ja
> nicht wirklich so Super aussieht.

Musst du ja nicht. Das war bloss ein Versuch von mir, zu erklaeren, wie 
es zu so einem Frequenzgang kommen kann. Dieses Filter scheint ja auf 
einer HW zu laufen, wo nicht unendliche (Rechen)kapazitaeten frei sind.
Da muss/kann man etwas tricksen, damit ueberhaupt was geht. 
Schlangenoelig wirds dann erst, wenn man das per whitepaper als tolle 
Wurst hinstellt.

Bei dir ist halt die Frage: Wo willst du ueberhaupt hin? 
Transientenfilter hab' ich vorher in dem Zusammenhang noch nie gehoert. 
Eher so mit "Blitzschutz".
Ich vermute mal, du willst eigentlich "nur" eine Interpolation machen, 
also aus jeweils 1 Sample (und seinen N Vorgaengern) 7 Samples 
dazu"dichten", damit du dann aus deinem DAC 8 Samples raushauen kannst, 
waehrend nur ein neues Sample bei dir "reinkommt". Das ganze, ohne 
irgendwas im Frequenzbereich < 20kHz hoerbar zu beeinflussen, richtig?

Dass ein "Rechteck/Impuls" nach so einem Filter nicht mehr aussieht, wie 
ein Rechteck/Impuls, ist schon klar. Aber das sah' auch vor dem Filter 
nicht so aus, wie du dachtest. Denn sonst waere es nicht bandbegrenzt 
und damit ein Verstoss gegen das Abtasttheorem.

Gruss
WK

von Klaus (Gast)


Lesenswert?

Digital kann ich schon einen Impuls / Rechteck sauber machen.
Ist ja nur ein Sprung in den Daten.
Analog sieht das da schon anders aus.

Ich gebe ja zu das ich Transientenfilter vorher auch nur aus anderen 
Bereichen kenne.
Aber das klang auf dem Papier halt so gut und da ich nun auch noch das 
bei diesem HDCD Chip gesehen habe bin ich noch neugieriger geworden.

Wo ich hin will? Zu einem guten Klang und sehr guten Messwerten.

Diese Filterkombi werde ich testen.

Das gute bei mir ist das ich nicht blind auf einen zukünftigen Wert 
interpoliere sondern ich fast beliebig viele Werte speichern könnte.
Damit habe ich zwar ein Delay von Eingang zu Ausgang, aber das juckt 
keinen wenn ich zB. 100ms später endlich mal die Daten raus gebe.
Spätestens mit einem Filter habe ich so oder so ein Delay zusätzliches 
drin.

von Dergute W. (derguteweka)


Lesenswert?

Moin,

Klaus schrieb:
> und da ich nun auch noch das
> bei diesem HDCD Chip gesehen habe

Axo, ja bei dem HDCD Chip.

Klaus schrieb:
> Das gute bei mir ist das ich nicht blind auf einen zukünftigen Wert
> interpoliere sondern ich fast beliebig viele Werte speichern könnte.
Naja, wenn du serioes einen zukuenftigen Wert extrapolieren koenntest, 
dann wuerde ich empfehlen, statt Soundsamples Aktienkurse in das Filter 
zu stopfen und entsprechend der Vorhersage aus dem Filter dann zu 
handeln.

> Damit habe ich zwar ein Delay von Eingang zu Ausgang, aber das juckt
> keinen wenn ich zB. 100ms später endlich mal die Daten raus gebe.
Der limitierende Faktor wird wahrscheinlich eher die Anzahl von 
MAC-Operationen (und I/O, Speichergeschiebe, etc.) sein, die deine CPU 
in der Zeit zwischen 2 Samples hinkriegt. Speicher wirste wohl ein paar 
KByte haben, nehm' ich mal an - also eher unproblematisch.

Gruss
WK

von Klaus (Gast)


Lesenswert?

Speicher habe ich im Überfluss, nur wie Du schon richtig sagst nicht 
beliebig Zeit zwischen den Samples.
Auch wenn alles per DMA rein und raus geht hat man wie immer halt nur 
eine gewisse Zeit zur verfügung.
Darum will ich auch keine FIR Filter mit 400 oder mehr TAPs din haben.
Mir ist es lieber der Prozessor langweilt sich noch etwas als das ich 
Abstriche machen darf nur weil der am Anschlag ist.

Ich denke das auch in dem HDCD Chip nur ein zuschaltbarer einfacher 
Filter  ist. Aber ohne Messwerte kann ich nicht mal ansatzweise sagen 
was das wirklich für einer ist. Außer das die den auch Transienten 
Filter nennen.

Dieser Gibbs filter läuft auf einem XMOS, mit dem XMOS hatte ich vor 8 
Jahren mal eine Frequenzweiche gemacht. Der war damals am Anschlag weil 
ich nur einen Kern pro Filter mehmen konnte. Der M7 hat da deutlich mehr 
Luft, weil vieles mit DMA und Hardware erschalgen wird wo der XMOS immer 
gleich einen Kern braucht. Somit dürfe die Analyse mit 2 kleinen Filtern 
hintereinander schon gut passen, muss nur noch sehen wie die Parameter 
aussehen könnten.

Die Glaskugel hätten viele gerne.

von Dergute W. (derguteweka)


Angehängte Dateien:

Lesenswert?

Moin,

Klaus schrieb:
> Die Glaskugel hätten viele gerne.

Die Glaskugel heisst z.b. GNU Octave (oder Matlab, wenns auch was kosten 
darf) und Filter-knowhow. Eben sowas wie erkennen, woher so ein 
komischer Buckel im Sperrbereich wahrscheinlich herkommt, etc.
Klar, mit 'nem langen FIR lassen sich fast alle Probleme erschlagen. Mit 
'nem viel kleineren IIR aber oft auch - dafuer muss man bei IIR halt 
wieder Obacht mit der Rechengenauigkeit und Stabilitaet geben. Und wenn 
die Phase dann noch linear sein so, wird die Koeffizientenrechnerei bei 
IIR richtig unangenehm (brauchts noch einen Haufen Allpaesse). Und der 
spaerere Rechenaufwand steigt dann auch wieder.
In deinem Fall (upsamplen x8) koennt' man z.b. auch mit 3x upsamplen x2 
hintereinander operieren. Dann kann man als FIR Filter jeweils 
Halbbandfilter nehmen, bei denen fast jeder 2. Koeffizient 0 ist. Spart 
Zeit beim Multiplizieren ;-)
Das koennte dann z.b. so aussehen wie auf dem Bild.
Da sinds 3 Filter hintereinander...
1
f1=round(firls(126,[0 20000 / 44100 (44100-20000) / 44100 1],[1 1 0 0])*32768)/32768;
2
f2=round(firls(30, [0 20000/2/44100 (44100-20000/2)/44100 1],[1 1 0 0])*32768)/32768;
3
f3=round(firls(14, [0 20000/4/44100 (44100-20000/4)/44100 1],[1 1 0 0])*32768)/32768;
4
5
ff1=upsample(f1,4,0);
6
ff2=upsample(f2,2,0);
7
ff3=f3;
8
9
freqz(conv(ff1,conv(ff2,ff3)));

Das waeren dann also beim 1. FIR ca. 64 MACs bei 48kHz Samplingfrequenz, 
beim 2. FIR 15 MACs bei 96kHz, beim 3. FIR 7 MACs bei 192kHz...
Sind also ca. 122 MACs pro Eingangssample, um dann jeweils 8 
Ausgangssamples zu erhalten.
Da kannste an den Filterlaengen rumschrauben wie du willst, entsprechend 
aendern sich halt Rechenaufwand, Flankensteilheit und Sperrdaempfung.
Aber es gibt noch zig andere Moeglichkeiten - Eben z.b. IIR Filter oder 
(sharpened) CIC, oder oder...

Gruss
WK

von Tobias (. (Gast)


Lesenswert?

DSP schrieb:
> Wobei man aber sagen muss, dass die reale Rechenlast deutlich niedriger
> ist, weil 3 von 4 samples ja eh "null" sind

Und was bringt es, Nullen zu verwenden und damit den Filter weniger 
trennscharf zu machen?

von Dergute W. (derguteweka)


Lesenswert?

Moin,

Hab' mal in den Link mit dem Upsampler fuer den Class-D-Verstaerker 
geguckt:
Das sieht mir eben eher nach einer "Holzhammer" Implementierung mit 
einem "dicken" FIR aus. Wobei ich natuerlich bei dessen Parametern 
ordentlich was zu maekeln hab:
a.) 2dB Ripple im Durchlass - da wird nicht jeder Audiophile begeistert 
sein.
b.) Tatsaechlich hat das reale Ding dann auch eher 60dB Sperrdaempfung 
statt der gewuenschten 100dB.
c.) Wieso wurde denn als Anfang des Sperrbereichs 30kHz ausgewaehlt?
Das kommt mir so ein bisschen aus der Luft gegriffen vor.
Da wuerd' ich doch entweder  96kHz-20kHz = 76kHz nehmen (und wuerde dann 
bei gleicher Anzahl Taps eine besser Sperrdaempfung oder weniger Ripple 
im Durchlass gewinnen), oder wenn ich Angst hab', dass da noch Reste vom 
evtl. Upsamplen von 48kHz auf 96kHz sind: 48kHz-20kHz=24kHz. Dann waere 
entweder Sperrdaempfung deutlich schlechter oder Ripple im Durchlass 
oder Anzahl Taps muesste hoeher sein.


Tobias N. schrieb:
> Und was bringt es, Nullen zu verwenden und damit den Filter weniger
> trennscharf zu machen?

Ich mein', das bezieht darauf, dass man beim Upsamplen lehrbuchmaessig 
in das Eingangssignal nach jedem "richtigen" Sample eine Anzahl Nullen 
einfuegt, um auf die hoehere Samplerate zu kommen. Und damit dann auf 
das Filter geht.
Klar kann man sich da Rechenaufwand einsparen. Aber im Endeffekt 
brauchts eben fuer jedes Ausgangssample doch grob einmal die 
Filterlaenge als Anzahl von MACs. Rueckgerechnet auf die 
Eingangssamplerate dann halt ensprechend nur einen Bruchteil. "Richtig" 
einsparen kann man erst, wenn bei den Filterkoeffizienten viele 0 sind.

Gruss
WK

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.