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.
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.
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
"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.
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
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.
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.
Ups link vergessen: https://github.com/YetAnotherElectronicsChannel/FPGA-Class-D-Amplifier/blob/master/UpSampler.vhd
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?
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
Wie sehen den die Parameter bei diesem Schlangenoel Filter aus? Soviel wollte ich nicht ausgeben, etwas brauche ich zum Leben.
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
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.
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
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.
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
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.
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
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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.