Filter für DA-Wandler (PWM)

Es geht darum, dass ein Controller eine Melodie spielen soll. Da ich mich zwar mit Controllern, aber weniger auf dem speziellen Gebiet der Filtertechnik auskenne, hoffe ich, dass mir hier jemand weiterhelfen kann.

Gegeben ist folgendes:

- Controller mit 20MHz und 16bit PWM;

- Chebyshev Filter 5th Ordnung;

- Melodie wird erzeugt aus Noten-Daten

- Wavetable (max. 1k) und Hüllkurve;

- einfache Melodie a la "Alle meine Entchen..."

- möglichst guter Sound wie "Music Box" einer Soundkarte.

- Noten von c1 (261,6Hz) bis f2 (698,4Hz)

meine FFT der "Music Box" hat ergeben, dass es sich dabei um um ein Kurve handelt, die zusammengesetzt ist aus:

Grundwelle + 0,374 x 4. Oberwelle + 0,272 x 8. Oberwelle.

Frage: Wo lege ich am besten die Samplefrequenz hin, da diese ja direkt die Auflösung beeinflußt?

8bit bei Fs=78,1kHz 9bit bei Fs=39kHz 10bit bei Fs=19,5kHz 11bit bei Fs=9,7kHz

Die 8. Oberwelle bei f2 geht ja bis 5,58kHz. Was klingt besser, wenn ein paar Oberwellen weggefilter werden und dafür die Auflösung höher ist, oder alle Oberwellen sind vorhanden und die Auflösung ist nicht so hoch?

Wie muss die Filterkurve liegen? 10bit sind ja 60db, reicht es also, wenn der Filter bei Fs/2 =-60db hat, oder ist das falsch?

Dirk

Reply to
Dirk Ruth
Loading thread data ...

Man kann das sicher irgendwie ausrechnen. Aus dem Bauch und der Erfahrung heraus: Man kann mit 8 Bit erstaunlich guten Sound produzieren - nur ist die Dynamik halt eingeschraenkt. Hohe Sampling- frequenz vereinfacht aber die Filterei entschieden. Aliasing klingt viel scheuszlicher als bisschen mehr Quantisierungsgeraeusch.

Ich wuerde es mit 8bit/78kHz oder 9bit/39kHz probieren.

Oberwellen sind fakultativ. Weiss ja keiner, wie es klingen soll. :-) Schlimmstenfalls Preemphasis anwenden. Aliasing ist furchtbar. Quantisierungsgeraeusch ist stoerend. Meine Meinung: Samplingfrequenz moeglichst hoch.

Bei 5.6kHz hoechster Spektralkomponente muss f_s groeszer 11.2kHz sein. f_s = 78kHz ist 7faches Oversampling. Unter den Bedingungen kann mMn Aliasing nicht auftreten. Die Filterei dient also dem Gerauschspannungsabstand. Du hast grob eine Dekade Platz zwischen Nutzsignal und f_s. Bei einem Filter 5. Ordnung sind das theoretisch 100dB. Stellt sich die Frage, ob Du statt des Tschebyscheff-Filters nicht einen Bessel-TP nehmen solltest; da ist das Impulsverhalten viel besser.

Grusz, Rainer

Reply to
Rainer Ziegenbein

Das ist doch schon mal ein Hinweis.

Du meinst damit bei den höheren Tönen die höchste Oberwelle entsprechend gewichtet nach der Filterkennlinie zur Grundwelle zu addieren. Ok das setzt vorraus, dass ich nur die Sinuswelle als Tabelle abspeichere und die Addition der zwei Oberwellen vor der Ausgabe mache. Ansonsten hätte ich direkt die Summe in der Tabelle abgelegt. So wird aus der Einstimmihkeit also Polyphonie.

Bei Fs=39kHz komme ich bei Tschebyscheff 5th-Ordnung und 5,58kHz bei Fs/2 auf ca. 50dB und bei Bessel auf ca. 7db. Bei Fs=78,1kHz komme ich bei Tschebyscheff 5th-Ordnung und 5,58kHz bei Fs/2 auf ca. 105dB und bei Bessel auf ca. 32db.

Wie wirkt sich denn die veränderte Gruppenlaufzeit auf den Klang aus? Spielt das überhaupt eine Rolle?

Dirk

Reply to
Dirk Ruth

das ist jetzt nicht so leicht zu überschauen, aber lies Dir mal 'Spektrum PWM-Sinus' vom 4.2.05 durch, allerdings eine etwas schwierige Diskussion. Ich hatte da mal was simuliert, bei PWM 15 KHz hatte ich bei

70 dB S/N eine Signalbandbreite von 1.8 KHz mit FFT simuliert, ich glaube ohne Quantisierung. Das wäre dann bei 70 dB eine Filterfrequenz von 0.12 Schaltfrequenz, also nicht etwa 0.5 wie bei 'normaler' Abtastung.

mfg. Winfried

Reply to
Winfried Salomon

Winfried Salomonschrieb: "

Wie sah denn der Tiefpass aus? Ein einfacher Passiver hat ja nur 20dB pro Dekade, also hast Du sicher was Aktives genommen. Welchen Typ hast Du simuliert?

Dirk

Reply to
Dirk Ruth

Jein. Du kannst auf die von Dir beschriebene Art auch zwei komplexere Klaenge mischen, also z.B. den normalen, gewuenschten "Grund- klang" mit einem Klang, der nur die Oberwellen enthaelt. Gewichtetes Mittel nehmen, Gewichte von der Tonhohe abhaengig machen, fertig.

Geht trotzdem noch.

Ja, Du brauchst zwei Soundgeneratoren fuer eine Stimme.

Hmm. Die 7dB bzw. 32dB kommen mir deutlich zu klein vor, so ca. 20dB zu klein. Ich habe fuer den Bessel-TP eine 3dB-Frequenz von ca. 7kHz angenommen (omega=1) und in das Diagramm im Tietze/Schenk geguckt. Bei ca 20kHz (=39kHz/2; omega=3 wegen 3*7=21) ist die Daempfung besser als 25dB, bei 40kHz (=78kHz/2; omega=6) ist sie ungefaehr 50dB.

Woher kommen diese Differenzen?

Die Impulstreue wird besser. Alles Gezupfte oder Geschlagene wird natuerlicher wiedergegeben, weil das Einschwingverhalten des Filters besser wird, das Filter also nicht so klingelt.

In Deinem Fall sicher nicht :-) Du kommst u.U. schon mit einem rein passiven, z.B. dreigliedrigen Tiefpass aus. Allerdings holt der natuerlich nicht den maximal moeglichen Fremdspannungsabstand aus Deinem System heraus.

Ist halt die Frage, ob Du "einfach und brauchbar" oder das unter den gegebenen Bedingungen maximal Moegliche haben willst.

Grusz, Rainer

Reply to
Rainer Ziegenbein

Auf drei Nachkommastellen genau muss das nicht sein. 0,4 und 0,3 als Faktoren tun es IMHO genauso.

Ich habe den Klang eben mal mit einem Synthesizer-Emulator (Bristol) nachgebildet. Meiner Meinung nach stört die 8. Oberwelle bei hohen Tönen mehr, als dass sie den Klang verbessert. In der eingestrichenen Oktave ist sie ok. Eine zunehmende Dämpfung der 8. Oberwelle mit der Frequenz halte ich also eher für besser.

Auch bei natürlichen Instrumenten ist übrigens die Wellenform über die Frequenz nicht konstant. Das liegt zum Einen daran, dass z.B. dicke Saiten andere Oberwellen erzeugen als dünne, und das Gehäuse der Instrumente verstärkt oder bedämpft nicht alle Töne gleich, wirkt also wie mehrere Bandfilter/ oder -sperren.

Und zu guter Letzt ist auch der Frequenzgang der Lautsprecher wichtig. Es lohnt sich nicht, einen Abfall bei hohen Tönen von ein paar dB zu kompensieren, wenn der Lautsprecher selbst Frequenzgangfehler in der Größenordnung von 6 oder mehr dB macht, und das ist bei einfachen LS eigentlich die Regel. Ich nehme an, Du willst so einen kleinen LS wie in Grußpostkarten üblich, ansteuern?

Martin

Reply to
Martin Klaiber

Ich hatte jetzt bei

formatting link
Seite 19 bei Omega=3,5 und =7 nachgesehen (Fs/2).

formatting link
S. 34 hat aber z.B. auch eine andere Angabe.

Mir ist gerade der Gedanke gekommen, dass ich das notfalls mit einrechnen könnte. Ich kann zu jeder Frequenz die Laufzeit ausrechnen und da ich die einzelnen Sinuswellen addiere, bzw. über einen Index vorher aus der Tabelle den richtigen Wert heraushole, kann ich diesen Index auch entspr. vorher initialisieren, so dass der Filter die Phasenverschiebung wieder aufhebt.

Dirk

Reply to
Dirk Ruth

Ich hab auch schon festgestellt, dass in der Soundkarte für das gleiche Instrument verschiedene Samples, z.T. je nach Oktave, abgelegt sind. Ich nehme mal an, dass ist diesem Umstand geschuldet.

Nein es wird schon etwas größer. Lautsprecher mit 6-10W an TDA2003.

Dirk

Reply to
Dirk Ruth

Hallo Dirk,

ich habe nur das Spektrum ohne Tiefpaß betrachtet, das ähnelt hier einer Phasenmodulation. Burr Brown hatte mal Audiocodecs mit optimierten Antialias-Filtern, aber die waren ziemlich kompliziert. Wenn die Gruppenlaufzeit nicht stört, würde ich Butterworth oder Tschebyscheff nehmen, bei Bessel ist der Übergangsbereich relativ stark abgerundet.

mfg. Winfried

Reply to
Winfried Salomon

Dirk Ruth schrieb:

Hier ein Filter der auf dem Contoller die Melodie an einem AD-Input glatt macht ?

Gut f=FCr Agenten, um eine Sprachverfremdung zu erreichen :) tt.

// adwfilter.h

#define adwfilterRANGE 1000 /* Has to be set to your needed granularity */ __inline int getval(void); /* Fetches the smoothed value */ extern void diableadwfilter(void); /* Stops AD cycles. */ extern void enableadwfilter(void(*isp)(int));/* Set ISP and Starts AD cycles. */

// adwfilter.c

#include //#include "adwfiter.h"

#define __TESTCODE__ static int adwfilter[adwfilterRANGE]; static int adwfilteridx =3D 0; static int adwfilterdif =3D 1; static long adwfiltersum =3D 0L;

static void addval(int value) { adwfiltersum -=3D adwfilter[adwfilteridx]; adwfiltersum +=3D (adwfilter[adwfilteridx++] =3D value); adwfilterdif +=3D adwfilterdif

Reply to
JSievers

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.