DSP FIR Filter mit Downsampling entwickeln
-
Jetzt mal gerade ne kleine Zwischenfrage worüber ich gerade nachdenke.
Wie bereits gesagt ich habe ein Sample mit der Größe 320byte bei 16kHz also 20ms.
Wende ich den Filter auf dieses Sample auf jedes einzelene Byte an oder auf den gesamten 20ms - Sample?
-
Tachyon schrieb:
~fricky schrieb:
Tachyon schrieb:
Dafür nimmst Du am besten ein FIR-Filter, dass die Bandbreite halbiert, und dann schmeisst Du jedes zweite Sample weg.
oder einfach den mittelwert von 2 benachbarten samples.
Das kannst Du vergessen, wenn Du auch nur einen minimalen Anspruch an die Qualität hast. Dadurch hast Du übelste Artefakte.
ok, ich hab' mir eine saubere sinuswelle vorgestellt. bei 'nem audiosignal, mit vielen frequenzen drin, kann ich mir schon vorstellen, dass sich das mies anhört. da klingt deine 'jedes_2_te_sample_weglösch'-methode sicher besser.
-
CrazyPlaya schrieb:
Jetzt mal gerade ne kleine Zwischenfrage worüber ich gerade nachdenke.
Wie bereits gesagt ich habe ein Sample mit der Größe 320byte bei 16kHz also 20ms.
Wende ich den Filter auf dieses Sample auf jedes einzelene Byte an oder auf den gesamten 20ms - Sample?Du musst für jedes Sample, das Du haben willst, filtern.
Wenn Du z.B. ein Filter mit 16 Koeffizienten hast, dann rechnest Du s1*c1+s2*c2+...+s16*c16 (s sind die Samples, c die Koeffizienten).
Danach bekommst Du genau ein neues Sample, nämlich die Summe der ganzen Produkte. Dann gehst Du ein Sample weiter und wiederholst das Ganze, also
-
Also mal für ganz dumme wie mich:D
Ich habe einen 20ms langen Sample
jetzt benötige ich einen Filter mit 320 Koeffizienten?
Und dann muss ich alle einzelnen Werte mit allen einzelnen Koeffs Multipliziern und addieren und dieser Wert ergibt dann meinen neuen Sample. Woher weiß ich welchen Wert die einzelnen Koeffs haben müssen?
Ich sag ja ich tue mich da gerade echt schwer mit.
Und schmeiß ich vorher jeden 2.ten Sample raus oder nach der Berechnung?
-
Nein, Du benötigst so viele Koeffizienten, dass Du die gewünschte Flankensteilheit für Dein Filter erreichst. Je höher die Ordung des Filters, desto schneller geht dein Filter vom Durchlassband ins Stopband über.
Noch mal für Deine 320 Werte und ein Filter mit 16 Koeffizienten:
Du fängest beim ersten Sample an und gehst das bis zum 16. Dann Fängst Du beim zweiten Sample an und gehst bis zum 17. Dann das 3. bis zum 18. usw.
Die Koeffiziententabelle läuft dabei immer nur von 1..16.Und lösch die Tabelle bitte wieder raus.
-
Tachyon schrieb:
Tim schrieb:
Was soll das Filter erreichen? Warum überhaupt ein FIR-Filter? Wie sollen wir konkrete Antworten geben wenn du keine konkreten Fragen stellst?
Hat er doch.
Hat er nicht. Er schrieb etwas von einem Filter _und_ von der Abtastratenreduktion. Dass gescheite Abtastratenreduktion einen Filter impliziert hat damit nichts zu tun.
-
Ok Tabelle ist wieder gelöscht:D.
Gut soweit hab ich das jetzt verstanden.
Sind noch 2 Fragen offen.
Wie weiß ich welche Werte die Koeffizienten besitzen müssen und
zum runtersamplen erst jeden 2 Sample rausschmeißen und dann Filtern oder umgekehrt?
-
CrazyPlaya schrieb:
Ok Tabelle ist wieder gelöscht:D.
Gut soweit hab ich das jetzt verstanden.
Sind noch 2 Fragen offen.
Wie weiß ich welche Werte die Koeffizienten besitzen müssen und
zum runtersamplen erst jeden 2 Sample rausschmeißen und dann Filtern oder umgekehrt?Erst filtern, dann wegschmeissen. Das geht auch in einem Schritt, aber das ist etwas komplizierter.
Die Koeffizienten hängen von der Zielbandbreite ab. Wenn Du von 16 kHz auf 8 kHz runtertasten willst, muss Dein Filter das Band auf 4 kHz begrenzen.Hier gibt es ein Tool zur Berechnung von Filterkoeffizienten. Leider ist die Abtastfrequenz fix auf 8 kHz gesetzt. Aber man kann das über den Dreisatz ganz leicht für alle Abtastfrequenzen benutzen:
(8 kHz / Abtastfrequenz) * gewünschte Bandbreite = Eingabe in Feld.
Dabei ist "Abtastfrequenz" Deine Abtastfrequenz (also 16 kHz) und "gewünschte Bandbreite" Deine Zielbandbreite alse 4 kHz. Das Ergebnis musst Du dann bei Passband to eintragen (den ersten Wert auf 0 lassen).
-
Der Volldummie muss noch mal etwas genauer nachhaken:D
Wegen der Koeffizienten. Kannst du das noch etwas genauer erläutern?
EDIT: Hat sich überschnitten, danke ich schau mal rein und stell dann evtl. noch mal dumme Fragen ok?:D
-
Wegen Koeffizienten siehe oben. Das Formal zu erklären, ist mir hier zu umständlich, weil der Latex-Kram nicht richtig geht.
-
Mist das Applet läuft hier nicht
-
Java installieren.
-
Aber grob sähe das ganze dann doch ungefähr so aus oder?
for(int i = 0; i < sampleSize; i++) { for(int y = 0; y < coeffSize; y++) { out_sample[i] = (sample[i] * coeff[y]); } }
-
So ist es besser.
for(int i = 0; i < (sampleSize - coeffSize); i++) { out_sample[i] = 0.0; for(int y = 0; y < coeffSize; y++) { out_sample[i] += (sample[i + y] * coeff[y]); // += und i+y } }
-
Aber was ist wenn i + y > 320???
-
So groß kann i nicht werden.
-
Sag mal gerade was geb ich bei dem Applet denn noch alles ein?
LP, BP oder HP?
Window Type?
Minimum Plot Gain?
-
Oh ok hab in deiner Schleife das -coeffSize übersehen. Dann hast du natürlich recht.
-
CrazyPlaya schrieb:
Sag mal gerade was geb ich bei dem Applet denn noch alles ein?
LP, BP oder HP?
Window Type?
Minimum Plot Gain?LP
Window Type: Hamming (dann hast Du ca. 60 dB Dämpfung)
Minimum Plot Gain: egal, das ist nur für die GrafikAlso Ordnung würde ich so einen Wert um 32 nehmen.
-
Also lieber 32 Koeffizienten als 16?