Frage

Ich habe einen 44 kHz-Audio-Stream von einer CD bekommt, als ein Array von 16-Bit-PCM-Samples repräsentiert. Ich möchte es zu einem 11KHz Strom sparen. Wie mache ich das? viele Jahre aus meiner Zeit des Ingenieure Klasse vor, ich weiß, dass der Strom nicht in der Lage sein wird, etwas über 5500Hz zu beschreiben genau mehr, so dass ich nehme an, ich will auch alles darüber heraus schneiden. Irgendwelche Ideen? Danke.

Update: Es gibt einige Code auf dieser Seite dass wandelt von 48 KHz bis 8kHz einen einfachen Algorithmus und einen Koeffizienten-Array verwenden, das aussieht wie {1, 4, 12, 12, 4, 1}. Ich denke, das ist das, was ich brauche, aber ich brauche es für den Faktor 4x statt 6x. Jede Idee, wie diese Konstanten berechnet werden? Auch ich am Ende der 16-Byte-Proben Umwandlung sowieso schwimmt, so dass ich das Downsampling mit Schwimmern tun kann, anstatt Shorts, wenn dies die Qualität überhaupt hilft.

War es hilfreich?

Lösung

Lesen Sie auf FIR und IIR-Filter. Dies sind die Filter, die eine coefficent Array.

Wenn Sie eine Google-Suche auf „FIR oder IIR-Filter Designer“ Sie werden viele Software und Online-Applets finden, die die harte Arbeit erledigt (die Koeffizienten bekommen) für Sie.

EDIT:

Diese Seite hier ( http: //www-users.cs. york.ac.uk/~fisher/mkfilter/ ) können Sie die Parameter des Filters eingeben und ausspucken bereit C-Code verwenden ...

Andere Tipps

Sie haben Recht, dass Sie Tiefpaßfilterung auf das Signal anwenden müssen. Jedes Signal über 5500 Hz wird in Ihrem unterabgetasteten Signal vorhanden sein, sondern ‚aliased‘ als eine andere Frequenz, so dass Sie die entfernen, zu werden, bevor Abwärtsabtastens.

Es ist eine gute Idee, um die Filterung mit Schwimmern zu tun. Es gibt festen Punkt Filteralgorithmen auch, aber diejenigen, haben in der Regel Qualität Kompromisse zu arbeiten. Wenn Sie schwimmt dann verwenden sie haben!

Mit DFT zum Filtern im Allgemeinen viel des Guten ist, und es macht die Dinge komplizierter, weil dft ist kein contiuous Prozess sind aber die Arbeit an Puffer.

Digitale Filter in zwei Geschmacksrichtungen im Allgemeinen kommen. FIR und IIR. Hause genauso geschaffen Allgemeinen die gleiche Idee, aber IIF-Filter verwenden Rückkopplung eine steilere Reaktion mit weit weniger Koeffizienten zu erzielen Schleifen. Dies könnte eine gute Idee für Abwärtsabtastens sein, weil Sie eine sehr steile Filterflanke brauchen es.

Downsampling ist eine Art Sonderfall. Weil du gehst 3 von 4 Proben wegzuwerfen gibt es keine Notwendigkeit, sie zu berechnen. Es gibt eine spezielle Klasse von Filtern für diese genannten Phasenfilter.

Versuchen Sie, für Mehrphasen-IIR oder mehrphasigen FIR für weitere Informationen googeln.

Hinweis (in Ergänzungen zu den anderen Kommentaren), dass die einfach einfach intuitiver Ansatz „ um einen Faktor von 4 Downsampling durch jede Gruppe von vier aufeinander folgenden Proben durch den Mittelwert ersetzt “, ist nicht optimal ist aber dennoch nicht falsch, noch praktisch noch konzeptionell. Da die Mittelung beträgt exakt auf einen Tiefpassfilter (ein rechteckiges Fenster, das auf eine sinc in Frequenz entspricht). Was wäre konzeptionell falsch sein, nur um das Downsampling von einer jeweils 4 Proben unter:., Die definitiv Aliasing einführen würde

Übrigens: praktisch jede Software, die etwas Resampling der Fall ist. (Audio, Bild oder was auch immer, beispielsweise für die Audio Fall: SOX) berücksichtigt dies, und häufig können Sie die darunter liegende Tiefpassfilter wählen

Sie benötigen einen Tiefpassfilter anwenden, bevor Sie das Signal zu vermeiden „Aliasing“ Downsampling. Die Grenzfrequenz des Tiefpaßfilters sollte kleiner als die Nyquist-Frequenz, die die Hälfte der Abtastfrequenz ist.

Der Prozess Sie nach „Dezimierung“ bezeichnet. Es gibt zwei Schritte:

  1. Die Anwendung Low Pass auf den Datenfilter (In Ihrem Fall LPF mit bei Pi Cut Off / 4).
  2. Downsampling (In Ihrem Fall unter 1 aus 4 Proben).

Es gibt viele Methoden, um die Tiefpassfilter zu entwerfen und anzuwenden.

Sie können hier beginnen:

http://en.wikipedia.org/wiki/Filter_design

Sie könnten die Verwendung von libsamplerate machen, das schweren Heben zu tun. Libsamplerate ist eine C-API, und kümmert sich um die Filterkoeffizienten zu berechnen. Sie wählen aus verschiedenen Qualitätsfilter, so dass Sie die Qualität für Geschwindigkeit abwägen kann.

Wenn Sie keinen Code schreiben bevorzugen, könnten Sie einfach benutzen Audacity die Samplerate-Konvertierung zu tun . Es bietet eine leistungsfähige GUI und nutzt libsamplerate dafür Sample Rate Conversion ist.

Ich würde versuchen, DFT Anwendung, Hacken 3/4 des Ergebnisses und die Anwendung inverse DFT. Ich kann nicht sagen, ob es gut klingen wird, ohne tatsächlich zu versuchen, hart.

Die „beste“ Lösung möglich ist in der Tat eine DFT, die oberen 3/4 der Frequenzen zu verwerfen, und eine inverse DFT durchgeführt wird, mit der Domäne an die Unterseite 1 / 4. beschränkt. Verwerfen der Top 3 / 4ths ist ein Tiefpassfilter in diesem Fall. Padding zu einer Leistung von 2 Anzahl der Proben wird Ihnen wahrscheinlich einen Geschwindigkeitsvorteil. Beachten Sie, wie Sie Ihre FFT-Paket speichert obwohl Proben. Wenn es sich um eine komplexe FFT ist (was viel einfacher zu analysieren ist, und hat in der Regel schöner Objekte), wird entweder die Frequenzen von -22 bis 22 gehen, oder 0 bis 44. Im ersten Fall, können Sie die Mitte 1 / 4th wollen. In letzterem ist die äußerste 1 / 4th.

Sie können durch Mittelwert Probe zusammen eine angemessene Arbeit tun. Die naive Art und Weise Proben vier von vier Grabbing und ein gleiches gewichteten durchschnittlichen Werke zu tun, ist aber nicht zu groß. Stattdessen wollen Sie eine „Kern“ -Funktion, die im Durchschnitt sie zusammen in einer nicht-intuitiven Art und Weise nutzen.

Mathwise, alles außerhalb des Niederfrequenzbandes zu verwerfen ist Multiplikation mit einer Box-Funktion im Frequenzraum. Die (inverse) Fourier-Transformation wendet punktweise Multiplikation in eine Faltung der (inversen) Fourier-Transformationen der Funktionen, und umgekehrt. Wenn wir also in der Zeitdomäne arbeiten wollen, brauchen wir eine Faltung mit dem (inversen) Fourier-Transformation durchführen von Box-Funktion. Dies erweist sich zum „sinc“ Funktion proportional zu (sin at) / at, wobei a die Breite der Box in den Frequenzraum ist. So bei jeder 4. Stelle (da Sie um einen Faktor von 4 sind Abwärtsabtastens) Sie die Punkte in der Nähe davon kann addieren, multipliziert mit sin (a dt) / a dt, wobei dt der zeitliche Abstand zu dieser Stelle ist. Wie in der Nähe? Nun, das hängt davon ab, wie gut Sie wollen, dass es klingen. Es ist üblich, alles außerhalb des ersten Null, zum Beispiel zu ignorieren, oder nehmen Sie nur die Anzahl der Punkte das Verhältnis zu sein, mit dem Sie Abwärtsabtastens.

Schließlich gibt es die piss-poor (aber schnell) Art und Weise nur die Mehrheit der Proben zu verwerfen, sondern nur die nullte halten, die vierten, und so weiter.

Ehrlich gesagt, wenn es in den Speicher passt, würde ich empfehlen, nur die DFT Weg zu gehen. Wenn es nicht eine der Software-Filterpakete zu verwenden ist, die andere empfohlen haben für Sie die Filter zu konstruieren.

Ich habe kürzlich BruteFIR die bereits einige von dem, was tun kann Sie sind interessiert?

Sie haben Tiefpassfilter anwenden (Frequenzen oberhalb von 5500 Hz zu entfernen) und dann Dezimierung gelten (lassen Sie jede N-ten Probe, jede 4. in Ihrem Fall).

Für Dezimierung, FIR, nicht IIR-Filter sind in der Regel verwendet, da sie bei früheren Ausgaben hängen nicht und deshalb haben Sie nichts für verworfen Proben zu berechnen. IIRs, in der Regel, hängt sowohl von Ein- und Ausgängen, so, es sei denn, eine bestimmte Art von IIR verwendet wird, dann würden Sie jede Ausgabe Probe berechnen müssen, bevor 3/4 von ihnen zu verwerfen.

Nur ein Intro-Level-Artikel über das Thema gegoogelt: https: // www. dspguru.com/dsp/faqs/multirate/decimation

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top