Filter für DA-Wandler (PWM)

D

Dirk Ruth

Guest
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
 
Dirk Ruth wrote:

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
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.

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?
Oberwellen sind fakultativ. Weiss ja keiner, wie es klingen
soll. :) Schlimmstenfalls Preemphasis anwenden.
Aliasing ist furchtbar. Quantisierungsgeraeusch ist stoerend.
Meine Meinung: Samplingfrequenz moeglichst 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?
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
 
Rainer Ziegenbeinschrieb:
"
Dirk Ruth wrote:

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

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.
Das ist doch schon mal ein Hinweis.

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

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?

Oberwellen sind fakultativ. Weiss ja keiner, wie es klingen
soll. :) Schlimmstenfalls Preemphasis anwenden.
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.

Aliasing ist furchtbar. Quantisierungsgeraeusch ist stoerend.
Meine Meinung: Samplingfrequenz moeglichst 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?

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.
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
 
Hallo Dirk,

Dirk Ruth wrote:

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?
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
 
Winfried Salomonschrieb:
"
Hallo Dirk,

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?


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.
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
 
Dirk Ruth wrote:

Oberwellen sind fakultativ. Weiss ja keiner, wie es klingen
soll. :) Schlimmstenfalls Preemphasis anwenden.

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.
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.

Ansonsten hätte ich direkt die Summe in der Tabelle abgelegt.
Geht trotzdem noch.

So wird aus der Einstimmihkeit also Polyphonie.
Ja, Du brauchst zwei Soundgeneratoren fuer eine Stimme.

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.


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.
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?

Wie wirkt sich denn die veränderte Gruppenlaufzeit auf den Klang
aus?
Die Impulstreue wird besser. Alles Gezupfte oder Geschlagene
wird natuerlicher wiedergegeben, weil das Einschwingverhalten
des Filters besser wird, das Filter also nicht so klingelt.

Spielt das überhaupt eine Rolle?
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
 
Dirk Ruth <d.ruth@itecnet.de> wrote:

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.
Auf drei Nachkommastellen genau muss das nicht sein. 0,4 und 0,3 als
Faktoren tun es IMHO genauso.

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?
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
 
Rainer Ziegenbeinschrieb:
"
Dirk Ruth wrote:


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.

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?
Ich hatte jetzt bei http://www.et-inf.fho-emden.de/~haass/dat/apx.pdf
Seite 19 bei Omega=3,5 und =7 nachgesehen (Fs/2).

http://www.krucker.ch/Skripten-Uebungen/EL1-2/EL-Kap3%20Filter.pdf
S. 34 hat aber z.B. auch eine andere Angabe.

Wie wirkt sich denn die veränderte Gruppenlaufzeit auf den Klang
aus?

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

Spielt das überhaupt eine Rolle?

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.
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.

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

Dirk
 
Martin Klaiberschrieb:
"
Dirk Ruth <d.ruth@itecnet.de> wrote:

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.

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

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?

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.
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.

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?
Nein es wird schon etwas größer. Lautsprecher mit 6-10W an TDA2003.

Dirk
 
Hallo Dirk,

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.



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?
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
 
Dirk Ruth schrieb:

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.
Hier ein Filter der auf dem Contoller die Melodie an einem AD-Input
glatt macht ?

Gut für 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 <memory.h>
//#include "adwfiter.h"

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


static void addval(int value)
{
adwfiltersum -= adwfilter[adwfilteridx];
adwfiltersum += (adwfilter[adwfilteridx++] = value);
adwfilterdif += adwfilterdif<adwfilteridx?1:0;
adwfilteridx %= adwfilterRANGE;
}

void resetadwfilter(void)
{
int s = sizeof(adwfilter);
diableadwfilter();
memset((void*)adwfilter,0,sizeof(adwfilter));
adwfilteridx = 0;
adwfilterdif = 1;
adwfiltersum = 0L;
enableadwfilter(addval);
return;
}

__inline int getval(void)
{
return (int) (adwfiltersum / adwfilterdif);
}

#ifdef __TESTCODE__
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>

static void (*ispworker)(int) = 0;

void diableadwfilter(void)
{
ispworker = 0;
}

void enableadwfilter(void(*isp)(int))
{
ispworker = isp;
}

DWORD WINAPI ADISP(LPVOID lpParameter)
{
resetadwfilter();
Sleep(1000);
while(1)
{
Sleep(1);
if(ispworker)
(*ispworker)(rand()%adwfilterRANGE);
}
return 0;
}

int main(int argc, char* argv[])
{
HANDLE thnd = CreateThread(NULL,0,ADISP,0,0,0);
while(1)
{
Sleep(10);
printf("\n%8.8i",getval());
}
return 0;
}

#endif /* __TESTCODE__ */
 

Welcome to EDABoard.com

Sponsor

Back
Top