Forum: Mikrocontroller und Digitale Elektronik welcher (analoge) Filter für FFT im Audio-Bereich?


von Michael R. (Firma: Brainit GmbH) (fisa)


Lesenswert?

Hallo allerseits,

ich bastle grad etwas mit FFT am AVR herum, funktioniert schon recht 
fein...

Quelle soll ein Audio-Signal sein, also allermaximalst 20 kHz, eher 
<16kHz. Gesampelt wird vom ADC mit (voraussichtlich) 48kHz.

Damit ich keine Aliasing-Effekte einfange, muss ich ja Frequenzen 
kleiner Nyquist schon vorher wegfiltern (natürlich mit Reserve).

Soweit ich das sehe, gibts zwei Möglichkeiten:

a) weniger steiler (und damit einfacherer) Filter, dafür größerer 
Abstand zur Sample-Frequenz

b) niedrigere Abtastfrequenz, dafür steiler Filter.

a) hat in Kombination mit FFT den Nachteil, dass ich dann die FFT 
unnötig "breit" machen müsste, um auch tiefe Frequenzen zu erwischen. 
Also eher b). Richtig soweit?

wenn b), was nimmt man am besten für einen Filter? Ich hab letztens für 
ein DDS-Projekt erstmalig einen Cauer-Filter gebaut, der hat 
ausgezeichnet funktioniert. Ist ein Cauer hier geeignet?

Noch eine generelle Frage: Die meisten Filter-Dimensionierungsprogramme 
hätten gerne eine Impedanz. Die ist in meinem Fall eher nebensächlich 
(vermute ich zumindest) der Filter wird direkt von einem OP gespeist 
(also sehr niederohmig), und danach gehts gleich in den (relativ 
hochohmigen) ADC. Was nehme ich hier als Impedanz? oder kann ich die 
(fast beliebig) variieren, bis passende Werte (speziell für die 
Induktivität) rauskommen?

Oder sollte ich besser eine Impedanzanpassung per Serienwiderstand am 
Eingang und Terminierungswiderstand am ADC machen?

Danke!

von asd (Gast)


Lesenswert?

Dies mag nun nicht wirklich die Antwort auf deine Frage sein, aber wenn 
du die möglichkeit von Überabtastung hast, könntest du das AA-Filter 
mehr ins digitale verschieben und ein einfaches RC-Filter am Eingang 
würde reichen.
Kommt halt drauf an, was du für Rechenpower hast und wie fix die 48 kHz 
sind.
Das käme ja Lösung a gleich. Kommt halt gan drauf an, was du für 
Anforderungen/Voraussetzungen hast.

Stichworte:
- Überantastung / Oversampling
- Verschiebung Antialiasing-Filter vom Analogen ins Digitale
- Anschliessendes Downsampling mit einem Dezimator um weiterführenden 
Rechenaufwand zu minimieren.

von Michael R. (Firma: Brainit GmbH) (fisa)


Lesenswert?

Naja, Rechenpower ist begrenzt (ATmega328 mit 16 oder 20 MHz), was aber 
mehr gegen Oversampling spricht ist der Speicherverbrauch: je mehr ich 
überabtaste, desto größer muss der Puffer sein.

ich könnte natürlich auch aufs Puffern verzichten, und direkt bei der 
Abtastung filtern und downsamplen. Das würde mir aber die Interrupt-Last 
stark erhöhen, die möchte ich vermeiden, da ich plane Abtastung und 
FFT-Berechnung "parallel" auszuführen (wird sich aber erst zeigen wie 
sich das ausgeht)

Es läuft wie immer auf einen Kompromiss hinaus, aber dafür müsste ich 
erstmal wissen wie und mit welchem Aufwand ich einen teil davon analog 
erschlagen kann.

von Frank (Gast)


Lesenswert?

Du musst deinen Filter so wählen das er an der Nyquist-Frequenz eine 
Dampfung aufweisst die zum Dynamikbereich des AD-Wandlers passt.

> Ist ein Cauer hier geeignet?

Man wählt seinen Filter danach aus das er zu dem passt was man mit den 
Daten machen will. Ich würde jetzt mal vermuten das du einen nehmen 
willst der möglichst wenig Welligkeit im Durchlassbereich aufweisst, 
aber das ist nur geraten.

> danach gehts gleich in den (relativ hochohmigen) ADC.

Ich hoffe mal das du das geprüft hast.

> bis passende Werte (speziell für die
> Induktivität) rauskommen?

Es würde mich sehr erstaunen wenn ein Filter für den Audiobereich eine 
Induktivität aufweisst. Das führt schnell dazu das man Räder unter sein 
Gehäuse bauen muss.

Frank

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Angehängte Dateien:

Lesenswert?

Michael Reinelt schrieb:
> und danach gehts gleich in den (relativ
> hochohmigen) ADC.

So hochohmig ist der nicht, bzw. er möchte ein relativ niederohmiges 
Signal sehen. Bedenke, das die Quelle in der Lage sein muss, den S&H 
Kondensator des ADC in kurzer Zeit zu laden. Atmel empfiehlt bei den 
meisten AVR eine Quellimpedanz von < 10 kOhm. Es kann also sinnvoll 
sein, das Filter aktiv aufzubauen (Opamp) und den Ausgang des Opamp über 
einen kleinen Serienwiderstand direkt auf den ADC zu geben.
Ich hänge dir mal ein Filter aus dem Audiobereich mit an, aus einem 
alten Digital Mischpult von Yamaha. Hier ist es ein ADC mit 
Differenzeingängen, aber das soll dich nicht stören.

: Bearbeitet durch User
von Michael R. (Firma: Brainit GmbH) (fisa)


Lesenswert?

Matthias Sch. schrieb:
> Atmel empfiehlt bei den
> meisten AVR eine Quellimpedanz von < 10 kOhm.

Das ist für mich "hochohmig" :-) im Vergleich zu 50 Ohm meines letzten 
Filters (der allerdings im MHz-Bereich lag)

Aber ich denke gerade intensiv über variante a) nach, bzw. versuche mich 
hier einzulesen:

Der Trick wäre, schneller zu samplen (möglichst ein ganzzahliges 
Vielfaches meiner gewünschten Sample-Frequenz, also z.B 2-fach mit 
96kHz), nur jedes n-te sample zu verwenden, aber vorher mit allen 
Samples in ein digitales Filter zu gehen. Hier würde sich FIR anbieten, 
weil ich dann nur die wirklich benötigten Samples berechnen müsste.

Wo ich mir grad nicht sicher bin: Die nyquist-Frequenz bleibt schon die 
gleiche, also 24kHz, auch wenn ich statt mit 48 mit der doppelten 
Frequenz sample? Ich hab nur mehr "Platz" für meine Filterkurve?

Zur Dämpfung: Wenn ich vom ADC 8-bit Werte lese, bräuchte ich -48dB 
Dämpfung, stimmt das?

Ums mal konkret zu machen: Ich will Signale bis 16kHz aufnehmen, sample 
mit 96kHz. Mit welchen Daten müsste ich dann einen Filter-Designer 
füttern?

: Bearbeitet durch User
von Helmut L. (helmi1)


Lesenswert?

Michael Reinelt schrieb:
> Ums mal konkret zu machen: Ich will Signale bis 16kHz aufnehmen, sample
> mit 96kHz.

Hallo Michael, aber nicht mit einem AVR. Da must du schon einen nehmen 
dessen ADC auch die Samplerate kann. Beim ATMega ist da bei 16Khz 
Samplerate so ziemlich schluss. Sag mal welchen uC du nehmen willst.

Als Filter wuerde ich die ein Sallen-Key Filter vorschlagen.

Michael Reinelt schrieb:
> Wenn ich vom ADC 8-bit Werte lese, bräuchte ich -48dB
> Dämpfung, stimmt das?

Die Daempfung von 48 dB must du bei der halben Samplerate erreicht 
haben.
Anhand von Samplerate und hoechster Nutzfrequenz ergibt sich dann die 
Filtersteilheit bzw. Ordnung des Filters. Ein Filter 1. Ordnung hat eine 
Steilheit von 6dB / Oktave bzw. 20db / Dekade.
Willst du schneller Abtasten verringert sich der Analoge Filter Aufwand.
Allerdings hat man dann hoehere Datenraten auf der Digitalen Seite. Die 
kann man aber mit hilfe eines Dezimierungsfilters wieder runter rechnen.

von Michael R. (Firma: Brainit GmbH) (fisa)


Lesenswert?

Hallo Helmut,

Helmut Lenzen schrieb:
> Hallo Michael, aber nicht mit einem AVR. Da must du schon einen nehmen
> dessen ADC auch die Samplerate kann. Beim ATMega ist da bei 16Khz
> Samplerate so ziemlich schluss. Sag mal welchen uC du nehmen willst.

Oje, das ist leider ein gutes Argument :-(

Aber  nachdem ich eh nur mit 8 bit abtaste (statt mit 10) sollten 
zumindest die 48kHz gerade noch machbar sein. meine Oversampling-Träume 
kann ich mir also gleich abschminken.

> Als Filter wuerde ich die ein Sallen-Key Filter vorschlagen.

Eins? oder 7 hintereinander?

> Die Daempfung von 48 dB must du bei der halben Samplerate erreicht
> haben.
Eigentlich mag ich das gar nicht ausrechnen: von 16kHz geträumter 
maximaler Nutzfrequenz zu 24kHz halber Samplerate 48dB zu erreichen 
dürfte reichlich illusorisch sein...

Prozessor soll ein ATmega328 sein.

Momentan läuft ein Prototyp bei 12MHz Takt mit 28kHz Abtastrate am 
Funktionsgenerator, das funktioniert sehr sauber. Der "echte" soll dann 
20 MHz CPU-Takt haben, entweder gehen dann die 48kHz Sample-Frequenz, 
oder ich geh halt auf 24 kHz zurück. ich hab leider momentan kein 
"Breadboard" mit 20MHz Quarz.

Für den Filter versuch ich dann halt, mit einem Sallen-Key das beste 
rauszuholen was möglich ist.

Filter mit L bei entsprechend niedriger Impedanz (50 Ohm zumindest in 
der Filterstufe) ergäbe gar keine soooo riesigen Induktivitäten, 
allerdings passen dann wieder die OPs nicht (die mögen 600 Ohm, Audio 
halt)

Eigentlich ist das alles ja nur Spielerei, obige Warte wären halt "ein 
Traum", wenn sie nicht erreichbar sind - auch egal. Dann versuch ich 
halt, dem Optimum so nahe wie möglich zu kommen.

von Helmut L. (helmi1)


Lesenswert?

Michael Reinelt schrieb:
> Eins? oder 7 hintereinander?

Sallen-Key als Stufe hat meistens 2. Ordnung. Bei 7. ordnung waeren das 
dann ein Quad OP.

Michael Reinelt schrieb:
> Eigentlich mag ich das gar nicht ausrechnen: von 16kHz geträumter
> maximaler Nutzfrequenz zu 24kHz halber Samplerate 48dB zu erreichen
> dürfte reichlich illusorisch sein...

Das ist schon Aufwand.

Michael Reinelt schrieb:
> Der "echte" soll dann
> 20 MHz CPU-Takt haben, entweder gehen dann die 48kHz Sample-Frequenz,
> oder ich geh halt auf 24 kHz zurück.

Der ADC Takt ist ja per Teiler vom CPU Takt abgeleitet und sollte so 
zwischen 120..200 Khz liegen laut Atmel. Von daher ist der eigentlich 
CPU Takt egal. Ist nur fuer die Verarbeitung in der Software massgebend.

Michael Reinelt schrieb:
> Filter mit L bei entsprechend niedriger Impedanz (50 Ohm zumindest in
> der Filterstufe) ergäbe gar keine soooo riesigen Induktivitäten,
> allerdings passen dann wieder die OPs nicht (die mögen 600 Ohm, Audio
> halt)

In dem Bereich kannst du alles mit OPs machen, lass sie Spulen fuer HF 
Anwendungen die haben im NF Bereich nix zu suchen.
50 Ohm brauchst du da auch nicht einhalten.

Michael Reinelt schrieb:
> Eigentlich ist das alles ja nur Spielerei, obige Warte wären halt "ein
> Traum", wenn sie nicht erreichbar sind - auch egal. Dann versuch ich
> halt, dem Optimum so nahe wie möglich zu kommen.

Nimm einen anderen Contorller z.B aus der Cortex/Arm Serie oder einen 
PIC32.
Dessen ADCs sind dafuer schnell genug (1MHz Sample Frequenz). Damit tust 
du es dir auch bei der Software leicher. Als Start z.B so eine STm32 
Cortex Demo Board.

von derguteweka (Gast)


Lesenswert?

Moin,

Tja, natuerlich ist in der Theorie ein Tiefpass zur Bandbegrenzung vor 
dem ADC eine simple Sache. In echt siehts dann halt wieder anders aus. 
Da wuerd' ich sagen: Bau' ein 4..5poliges, aktives Filter ein (Bei mehr 
als 4..5polen brauchst du mehr als 2 OpAmps und die Bauteiltoleranzen 
werden unangenehm, d.h. es wird zunehmend unrealistisch, dass du das, 
was du haben willst, auch wirklich bekommst). Dann bietet sich 
Sallen-Key an; als Filtercharakteristik geht dann Cauer nicht, obwohl 
der natuerlich am Besten waere, wenn dir Gruppenlaufzeit wurscht ist.
Aber Tschebyscheff wuerde gehen. Ripple im Durchlassbereich musst du dir 
halt ueberlegen, was du tolerieren kannst oder evtl. nach deiner FFT 
wieder rausrechnen (Du weisst ja dann, welche Frequenzbaender wie gut 
durchgelassen werden). Je mehr Ripple im Durchlass du vertraegst, umso 
steiler wird die Daempfung Richtung Sperrbereich ansteigen.
Die theoretisch erforderlichen Werte fuer Sperrdaempfung bei Fsample/2 
wirst du damit nicht erreichen. Seh' ich aber nicht als besonders 
tragisch an. In "normalem" Audio kommen die hohen Frequenzen eh' nicht 
mit Wahnsinnsleistungen vor.

Gruss
WK

von Michael R. (Firma: Brainit GmbH) (fisa)


Lesenswert?

Helmut Lenzen schrieb:
> Der ADC Takt ist ja per Teiler vom CPU Takt abgeleitet und sollte so
> zwischen 120..200 Khz liegen laut Atmel.
Ja, bei voller Auflösung und optimaler Genauigkeit. Mit geringerer 
Auflösung darf er niedriger sein.
> Von daher ist der eigentlich
> CPU Takt egal. Ist nur fuer die Verarbeitung in der Software massgebend.
Jein, aufgrund der starren Prescaler muss ich vom CPU-Takt auch einen 
passenden ADC-Takt ableiten. So hoch wie nötig, so niedrig wie 
möglich...

Helmut Lenzen schrieb:
> lass sie Spulen fuer HF
> Anwendungen die haben im NF Bereich nix zu suchen.

ok (schade eigentlich, hätt mich grad erst mit denen angefreundet...)

Helmut Lenzen schrieb:
> Nimm einen anderen Contorller

Wie gesagt, es ist nur eine Spielerei, deswegen möchte ich auf keinen 
Fall mein vertrautes AVR Ökosystem verlassen.

derguteweka schrieb:
> Da wuerd' ich sagen: Bau' ein 4..5poliges, aktives Filter ein
Danke, du machst mir Mut! Darauf wirds hinauslaufen...

Mit Sallen-Key gibts ja so eine Variante wo man 3 Pole in einem OP 
unterkriegt. Da spricht hoffentlich nix dagegen? (siehe hier: 
http://www.beis.de/Elektronik/Filter/Act3PoleLP.html) Darf man zwei von 
denen hintereinanderschalten?

von derguteweka (Gast)


Lesenswert?

Moin,

Michael Reinelt schrieb:
> http://www.beis.de/Elektronik/Filter/Act3PoleLP.html) Darf man zwei von
> denen hintereinanderschalten?
Ja, deshalb schrub ich 4..5 - du kannst mit 2 
hintereinandergeschalteten, jeweils 3 poligen arbeiten, aber dann sind 2 
der 6 vorhandenen Pole rein reell und kein konjungiert komplexes 
Paerchen, d.h. dann hast du irgendein Filter, kein "reinrassiges" 
Butterworth, Cheby, oder sonstwas.

Gruss
WK

von Michael R. (Firma: Brainit GmbH) (fisa)


Lesenswert?

derguteweka schrieb:
> dann sind 2
> der 6 vorhandenen Pole rein reell und kein konjungiert komplexes
> Paerchen

Au weia, jetzt hast du mich kalt erwischt... wart mal, wo war die 
Ausrede... ach ja, damals, als wir das gelernt hatten, habe ich gefehlt 
;-)

Aber soviel glaube ich zu verstehen: 3+2 sollte es auch tun.

von Martin S. (led_martin)


Lesenswert?

Hallo Michael,

Mit Deinem Projekt bist Du ja, hier im Forum, an mehreren Stellen 
präsent. Den A/D-Wandler eines ATmega kann man getrost deutlich 
schneller laufen lassen. Im einleitenden Text, im Datenblatt, ist ja von 
bis runter zu 13us Wandlungszeit die Rede, das sind dann, bei 13 
ADC-Takten / Wandlung, 1MHz ADC-Takt. Das habe ich schon ausgenutzt, so 
schlecht wird der Wandler dabei auch nicht, für Deine Anwendung sicher 
brauchbar. Da sind 48kHz locker drin, selbst 64kHz sind noch möglich. Es 
gibt da eine Falle: Wenn Du die Messung 'zu Fuß', durch setzen des 
ADSC-Bits startest, startet die Wandlung immer erst beim nächsten 
ADC-Takt, also mit unterschiedlicher Verzögerung, das will man bei einem 
Audio-Signal nicht. Wenn Du aber die Wandlung über Auto-Trigger, von 
einem Timer, startest, wird der Takt-Vorteiler immer mit zurückgesetzt, 
die Wndlung startet also exakt im, vom Timer vorgegebenen, Raster. Ich 
habe den ADC auch schon mit Takt-Teiler 16, bei einem 20MHz getakteten 
ATmega benutzt, und keine Probleme gehabt. Eine Bandbegrenzung hast Du 
ja schon eingebaut, das Mikrofon. Ich würde da kein 
Wahnsinns-Filterdesign anfangen. Bei 24kHz (48kHz / 2), und darüber, 
sollte da eh nicht viel los sein. Bei Filtern hoher Ordnung hat man 
immer Ärger mit Bauteiletoleranzen, da sollte man besonders an die 
Kondensatoren denken.

Bei 20MHz CPU-Takt gehen die 48kHz Abtastrate gerade noch mit 
ADC-Vorteiler 32.

Mit freundlichen Grüßen - Martin

von Michael R. (Firma: Brainit GmbH) (fisa)


Lesenswert?

Martin Schlüter schrieb:
> Wenn Du aber die Wandlung über Auto-Trigger, von
> einem Timer, startest, wird der Takt-Vorteiler immer mit zurückgesetzt,
> die Wndlung startet also exakt im, vom Timer vorgegebenen, Raster.

Danke für den Hinweis!

Gilt das auch für den FreeRunning Mode? Im "Echtbetrieb" werd ich das 
sicher über einen Timer anstoßen, um feine Kontrolle zu haben, momentan 
beim "Basteln" läuft er eben im FreeRunning Mode...

Martin Schlüter schrieb:
> Eine Bandbegrenzung hast Du
> ja schon eingebaut, das Mikrofon. Ich würde da kein
> Wahnsinns-Filterdesign anfangen. Bei 24kHz (48kHz / 2), und darüber,
> sollte da eh nicht viel los sein.

Vermutlich hast du recht, und ich übertreibe da etwas :-)

von Martin S. (led_martin)


Lesenswert?

Im FreeRunning Mode sind es immer 13 ADC-Takte, die Abtastrate ist immer 
ADC-Taktfrequenz / 13. Da kommt man halt auf recht 'krumme' Werte, für 
die Abtastrate.

Mit freundlichen Grüßen - Martin

von Michael R. (Firma: Brainit GmbH) (fisa)


Lesenswert?

Hallo allerseits,

"Wenn du ein Problem nicht lösen magst, ändere einfach die 
Anforderungen" :-)

ich hab mich jetzt etwas mit meinem Prototyp gespielt, und (für mich) 
erstaunliche Erkenntnisse gewonnen: ich bin mit der Sample-Rate ziemlich 
tief "in den Keller" gewandert, (zuerst ~500 Hz, derzeit ~2kHz). Damit 
sinkt zwar meine obere Grenzfrequenz, und dagegen kann ich wenig tun, 
weil für längere Samples schlicht der Speicher am ATmega (2kB) nicht 
reicht.

Das ist aber fürs erste nicht weiter tragisch, weil meine Primäre 
Anwendung erstmal eine "Lichtorgel" für meinen kleinen 
schlagzeug-spielenden Sohn ist.

ich hätte das nicht für möglich gehalten, aber meine FFT schafft es, das 
tiefe E und F meines Basses zu trennen! (immerhin sind das grob 42 und 
44 Hz!)

Das brauch ich zwar nicht, aber dafür kann ich jetzt sogar einzelne 
Trommeln auseinanderhalten! (Sogar eine Trennung zwischen den Hänge-Toms 
wäre theoretisch möglich!) Das ist ja mehr als genial! Mein Spieltrieb 
ist geweckt...

Da damit aber die Sample-Dauer recht lange ist, muss ich meine FFT noch 
etwas umbauen, damit die auf einem Ringbuffer arbeiten kann. Das ist 
aber eine ganz andere Baustelle...

Für das Filter-Problem heisst das: Ich habe viel mehr Platz sowohl auf 
der analogen als auch auf der digitalen Seite, um Tiefpässe zu 
implementieren. Analog wird vermutlich ein simples RC-Glied ausreichen. 
Digital bin ich noch am überlegen, wie sich das am besten ausgeht, wie 
hoch ich "oversample", und welchen Filter ich dann nehme (FIR oder IIR)

Damit schließe ich gleich meine nächste Frage an: Würdets ihr eher FIR 
oder IIR nehmen, und gibt es empfehlenswerte (simple, ich bin kein 
Mathematiker) Auslegungsprogramme, möglichst im Web, damit ich nicht 
extra Software installieren muss?

von M. K. (sylaina)


Lesenswert?

Michael Reinelt schrieb:
> Naja, Rechenpower ist begrenzt (ATmega328 mit 16 oder 20 MHz)

Der Atmega328 ist für 20 kHz Signale aber zu langsam (bzgl. voller 
ADC-Auflösung!), also zumindest sein ADC. Der bringt dir nämlich maximal 
~10 MSPS, reicht also "nur" für ~5 kHz Signale. Oder du fährst die 
ADC-Taktrate hoch und senkst die ADC-Auflösung (ist auch im Datenblatt 
beschrieben). Bei "nur" 8 bit ist ~100 MSPS möglich (Free-Runningmode 
etc.pp., siehe Datasheet). Also entweder dann einen anderen ADC 
verwenden oder, wenn kein separater ADC gewünscht ist, einen anderen 
Atmega (vielleicht Atxmega32) benutzen sofern mehr als 8 bit Auflösung 
gewünscht ist.
Beim Filter kann man aber schon sagen, dass bei mehr als 10 kHz nur 
noch, vergleichsweise, wenig los ist. Da könnte man auch begrenzen.

von Michael R. (Firma: Brainit GmbH) (fisa)


Lesenswert?

Michael Köhler schrieb:
> Der Atmega328 ist für 20 kHz Signale aber zu langsam

Das hat Martin hier Beitrag "Re: welcher (analoge) Filter für FFT im Audio-Bereich?" 
schon soweit geklärt

von Ulrich H. (lurchi)


Lesenswert?

Nur ein passiver RC Filter ist ggf. nicht so gut, weil bei höherer 
Abtastrate auch die Quellimpedanz für den ADC eher niedriger werden 
sollte. Ein einfacher aktiver Filter mit 1 OP sollte aber ausreichen.

Beim digitalen Filter wird man wohl Rücksicht auf den eher langsamen µC 
nehmen müssen. Das dürfte dann eher auf einen einfache FIR Filter 
hinauslaufen, bis hin zum einfachen Mittelwert. Viel extra Speicher 
braucht man da auch nicht - eventuell für etwa 8 Werte, ggf. auch noch 
weniger.

Wenn man beim 8 Bit AVR bleiben will, gäbe es noch die Xmega: da geht 
der ADC bis 1 MHz und der Takt bis 32 MHz.

von Michael R. (Firma: Brainit GmbH) (fisa)


Lesenswert?

Ich brauch nochmal eure Hilfe, damit ich mich hier nicht verrenne.

Ich packe meine Frage mal in ein einfaches Beispiel:

Angenommen, meine FFT interessiert sich nur für Frequenzen bis 1 kHz. 
ich muss also mit mindestens 2kHz abtasten, und alles was über 1kHz ist, 
ist potentiell "böse" weil es zu Aliasing führt. Zur Sicherheit taste 
mich mit 3kHz ab, um etwas "Respektabstand" zur Nyquist-Frequenz zu 
haben.

Weiter angenommen, ich mache 8-faches Oversampling, sample also in 
Wirklichkeit mit 24 kHz. Damit ich beim Samplen kein Aliasing einfange, 
muss alles > 12 kHz weg, und zwar schon vor dem Abtasten (wenn ichs mal 
abgetastet habe, krieg ichs auch mit digitalen Filtern nicht mehr weg, 
weils nicht unterschiedbar ist)

Durch das Oversampling wird aber der "analoge" Filter viel einfacher: 
Passband 0-1kHz mit möglichst wenig Ripple, Stopband ab 12kHz mit 
(idealerweise) 48dB Dämpfung (8 bit ADC-Auflösung). Bei den 3.5 Oktaven 
wären das knapp 14dB/Oktave, oder ein zwei-bis Filter. Wenn ich das LSB 
ignoriere, wärens nur mehr 42 statt 48, damit reichen 2 RC-Glieder.

Soweit richtig bis hierher?

Nun kommt der für mich schwierigere Teil: Der Dezimator. Ich muss ja aus 
jeweils 8 Samples einen machen, den ich dann in die FFT schicke.

Passband: 0-1kHz (der Teil war einfach)
Stopband: ich hätte intuitiv gesagt, 1.5kHz (also die halbe 
Ausgabe-Frequenz des Dezimators).

Allerdings lese ich hier: 
http://www.dspguru.com/dsp/faqs/multirate/decimation "The stopband lower 
frequency is half the output rate minus the passband upper frequency." 
Das kann irgendwie nicht stimmen, das wären ja 1.5kHz - 1 kHz = 500 Hz, 
damit schneid ich mir ja mein halbes Nutzsignal weg?

Wenn ich das mal ignoriere, und versuche einen FIR-Filter mit diesen 
Werten zu kreieren ( http://t-filter.appspot.com/fir/index.html ) komm 
ich auf 61 "taps" (Koeffizienten)? Kann das stimmen?

von Helmut L. (helmi1)


Lesenswert?

Michael Reinelt schrieb:
> Nun kommt der für mich schwierigere Teil: Der Dezimator. Ich muss ja aus
> jeweils 8 Samples einen machen, den ich dann in die FFT schicke.

Der Dezimator ist halb so wild. Ist ein Tiefpassfilter mir der 
entsprechenden Grenzfrequenz und dann halt nur jeden xx Wert nehmen und 
damit weiterrechnen. Da sollte man auch ein IIR Filter nehmen koennen.

von Michael R. (Firma: Brainit GmbH) (fisa)


Lesenswert?

Ulrich H. schrieb:
> Ein einfacher aktiver Filter mit 1 OP sollte aber ausreichen.

Da hast du recht. Auf einen OP mehr oder weniger kommt es nun auch nicht 
an. Vermutlich könnte ich den Filter sogar in den Mikrofon-Vorverstärker 
gleich mit integrieren...

Ulrich H. schrieb:
> Beim digitalen Filter wird man wohl Rücksicht auf den eher langsamen µC
> nehmen müssen

Da mach ich mir mal weniger Sorgen - aufgrund der jetzt relativ 
niedrigen Abtast-Frequenzen, gepaart mit dem umstand dass ich mit FIR 
nur seltener den Filter rechnen muss, dürfte sich das locker ausgehen.

Helmut Lenzen schrieb:
> Der Dezimator ist halb so wild.
Sagst du :-)

> Ist ein Tiefpassfilter mir der
> entsprechenden Grenzfrequenz und dann halt nur jeden xx Wert nehmen und
> damit weiterrechnen. Da sollte man auch ein IIR Filter nehmen koennen.
FIR wäre mir an der Stelle sympatischer (obwohl ich mit IIR schon 
gearbeitet habe), aus mehreren Gründen:
a) FIR ist "gutmütiger" (Kunststück, ohne Feedback)
b) FIR muss ich nur dann berechnen, wenn ich einen Wert brauche, also in 
meinem Beispiel jede 8te Abtastung. Die Zwischenwerte schieb ich nur in 
den Ringbuffer.
c) FIR hat Koeffizienten die ideal für Festkomma-Arithmetik geeignet 
sind: immer im Bereich [-1, 1) und auch die Addition sättigt nicht. Das 
kriegt man auf einem AVR wirklich sehr effizient hin (hab ich erwähnt 
dass ich fmul liebe?)

Helmut, wie legst du digitale Filter aus? Kannst du mir da eine Software 
(oder noch besser ein Online-Tool) empfehlen? matlab & Co scheidet eher 
aus, das kann ich nicht bedienen...

von Marian (phiarc) Benutzerseite


Lesenswert?

Michael Reinelt schrieb:
> Filter-Dimensionierungsprogramme

Einfach eine Koeffiziententabelle nehmen, z.B. 
http://www.glensstuff.com/activefilterdesign/activefilterdesign.htm

von Michael R. (Firma: Brainit GmbH) (fisa)


Lesenswert?

Marian B. schrieb:
> Michael Reinelt schrieb:
>> Filter-Dimensionierungsprogramme
>
> Einfach eine Koeffiziententabelle nehmen, z.B.
> http://www.glensstuff.com/activefilterdesign/activefilterdesign.htm

Ähhh und wie mach ich daraus jetzt ein FIR Filter?

von Helmut L. (helmi1)


Lesenswert?

Michael Reinelt schrieb:
> Helmut, wie legst du digitale Filter aus? Kannst du mir da eine Software
> (oder noch besser ein Online-Tool) empfehlen? matlab & Co scheidet eher
> aus, das kann ich nicht bedienen...

Von Iowa Hills gint es da einige Tools.

IIR FILTER lass ich von uC selber die Kooefizenten berechnen.

von Michael R. (Firma: Brainit GmbH) (fisa)


Lesenswert?

Helmut Lenzen schrieb:
> IIR FILTER lass ich von uC selber die Kooefizenten berechnen.

Huh? Wie geht das denn?

von Helmut L. (helmi1)


Lesenswert?

Michael Reinelt schrieb:
> Huh? Wie geht das denn?

Das ist doch bloss eine Formel. IIR Filter werden durch die Tuskin 
Transformation aus den Koeffizenten der Analogen Filter berechnet. Und 
dessen Werte aus einer anderen Formel. Das ganze in ein Unterprogramm 
gepackt und schon kommen die Koeffizenten raus. So kann man leicht ein 
Adaptives Filter daraus bauen.

von Michael R. (Firma: Brainit GmbH) (fisa)


Lesenswert?

Helmut Lenzen schrieb:
> ... Tuskin Transformation ...

Womit wir wieder bei der Trennung zwischen Jungs und Männern wären :-)

Ich muss aber nochmal was grundsätzliches hinterfragen:
> Der Dezimator ist halb so wild.

Vielleicht habe ich hier einen massiven Denkfehler, aber in meinem 
obigen Beispiel müsste der Tiefpass doch ein Passband von 0-1kHz haben, 
und ab 1.5kHz (halbe Ausgaberate des Dezimators) auch wieder 
idealerweise 48dB dämpfen, sonst krieg ich ja erst wieder Aliasing rein.

Das wäre ja eine Steilheit von 96dB/Okatve, und das nennst du "halb so 
wild"? (oder ist das halb so wild?)

von Uwe (Gast)


Lesenswert?

Hallo Michael,

Michael Reinelt schrieb:
> wie legst du digitale Filter aus? Kannst du mir da eine Software
> (oder noch besser ein Online-Tool) empfehlen? matlab & Co scheidet eher
> aus, das kann ich nicht bedienen...

Analoge Filter: http://www.beis.de/Elektronik/Filter/Filter.html

Konvertierung der analogen Filter-Prototypen in digitale IIR-Filter 
incl. Programm zur Berechnung und Simulation der analogen und den daraus 
berechneten und ggf. modifizierten digitalen Filtern: 
http://www.beis.de/Elektronik/Filter/AnaDigFilt/AnaDigFilt.html

(Das sind beides meine Artikel, im Zweifelsfall kenne ich mich also gut 
mit dem Inhalt aus.)

Zum Thema Decimation: Das ist kein Programm, kein "Algorithmus": Wenn du 
einmal ein Signal Tiefpass-gefiltert hast, brauchst du nur noch 
entsprechend jeden n-ten Wert zu nehmen - alle anderen Werte sind per 
Definition redundant.

Grüße, Uwe

von Michael R. (Firma: Brainit GmbH) (fisa)


Lesenswert?

Uwe schrieb:
> Konvertierung der analogen Filter-Prototypen in digitale IIR-Filter

Hallo Uwe,

tolle Seite, Gratulation! Den Sallen-Key-Teil davon habe ich eh schon 
regelmäßig besucht, sehr praktisch!

Digital (oder besser zeitdiskrete :-) Filter sind da leider IIR, ich 
möchte das eher mit FIR machen, aus den oben dargelegten Gründen

Uwe schrieb:
> Zum Thema Decimation: Das ist kein Programm, kein "Algorithmus": Wenn du
> einmal ein Signal Tiefpass-gefiltert hast

Stimmt, mein Problem ist im Moment eh mehr der Tiefpass selber, und ob 
meine "Auslegung" (-96dB/Okatve?) überhaupt stimmen kann.

von Helmut L. (helmi1)


Lesenswert?

Michael Reinelt schrieb:
> Digital (oder besser zeitdiskrete :-) Filter sind da leider IIR, ich
> möchte das eher mit FIR machen, aus den oben dargelegten Gründen

Tief u. Hoch pass macht man meistens in IIR. FIR braucht zuviel 
Rechenzeit.

von Uwe (Gast)


Lesenswert?

Hallo Michael,

> Digital (oder besser zeitdiskrete :-) Filter sind da leider IIR, ich
> möchte das eher mit FIR machen, aus den oben dargelegten Gründen

Ich habe nicht den ganzen Thread studiert, sei mir nicht böse, wenn ich 
ich dem Sinne nicht genau auf das antworte, was du schon geschrieben 
hast. Aber ich nehme an, dass es um diesen Beitrag geht:

 Michael Reinelt schrieb:
> Ich packe meine Frage mal in ein einfaches Beispiel:
>
> Angenommen, meine FFT interessiert sich nur für Frequenzen bis 1 kHz.
> ich muss also mit mindestens 2kHz abtasten, und alles was über 1kHz ist,
> ist potentiell "böse" weil es zu Aliasing führt. Zur Sicherheit taste
> mich mit 3kHz ab, um etwas "Respektabstand" zur Nyquist-Frequenz zu
> haben.
>
> Weiter angenommen, ich mache 8-faches Oversampling, sample also in
> Wirklichkeit mit 24 kHz. Damit ich beim Samplen kein Aliasing einfange,
> muss alles > 12 kHz weg, und zwar schon vor dem Abtasten (wenn ichs mal
> abgetastet habe, krieg ichs auch mit digitalen Filtern nicht mehr weg,
> weils nicht unterschiedbar ist)
>
> Durch das Oversampling wird aber der "analoge" Filter viel einfacher:
> Passband 0-1kHz mit möglichst wenig Ripple, Stopband ab 12kHz mit
> (idealerweise) 48dB Dämpfung (8 bit ADC-Auflösung). Bei den 3.5 Oktaven
> wären das knapp 14dB/Oktave, oder ein zwei-bis Filter. Wenn ich das LSB
> ignoriere, wärens nur mehr 42 statt 48, damit reichen 2 RC-Glieder.
>
> Soweit richtig bis hierher?

Ich denke, schon. Nur vielleicht mit einer Ausnahme, auf die auch schon 
jemand hingewiesen hat: Wenn, wie üblich, im Alias-Band die Leistung 
deutlich geringer als im Nutzband ist, braucht man entsprechend weniger 
zu filtern!

> Nun kommt der für mich schwierigere Teil: Der Dezimator. Ich muss ja aus
> jeweils 8 Samples einen machen, den ich dann in die FFT schicke.

Ich meine, umgekehrt: Erst digital filtern, dann jedes 8te Sample 
nehmen. Das Filtern ist mehr oder weniger anspruchsvoll. Die Decimation 
ist trivial. (Ist vielleicht auch eine Frage der Definiton, ob der TP 
zur Decimation zuzurechnen ist oder nicht.)

> Passband: 0-1kHz (der Teil war einfach)
> Stopband: ich hätte intuitiv gesagt, 1.5kHz (also die halbe
> Ausgabe-Frequenz des Dezimators).
>
> Allerdings lese ich hier:
... Das habe ich jetzt nicht studiert :-(
> Wenn ich das mal ignoriere, und versuche einen FIR-Filter mit diesen
> Werten zu kreieren ( http://t-filter.appspot.com/fir/index.html ) komm
> ich auf 61 "taps" (Koeffizienten)? Kann das stimmen?
Ich habe mich bisher fast nicht mit FIR-Filtern befasst. Aber wenn du 
eine große Steilheit oder eine geringe Eckfrequenz brauchst, wird auch 
ein FIR-Filter aufwändig. Das ist nur logisch. Ob es 61 Taps tun, kann 
ich nicht sagen, aber eine große Anzahl von Taps würde ich erwarten.

Ich habe mal einen 20-poligen, digitalen IIR-TP-Filter (Butterworth) 
realisiert (Audio, Decimation-Filter um von der internen 2- oder 4-fach 
OSR auf die gewünschte Ausgangs-SR zu filtern). Das sind 120 dB/Oktave. 
Mit dem Wissen, wo die Fallen bei der Realisierung liegen, klappt das 
auch. Mit einem einfachen uC hast du sicherlich keine Chance, ich 
vermute, auch bei einem FIR mit 61 Taps nicht.

Sehr hilfreich zum Verständnis, anscheinend auch zur Abschätzung des 
Aufwands, fand ich: 
http://www.fourier-series.com/fourierseries2/FIR-filter.html. Vielleicht 
ist das hier ja auch schon bekannt.

Grüße, Uwe

von derguteweka (Gast)


Lesenswert?

Moin,

Helmut Lenzen schrieb:
> Tief u. Hoch pass macht man meistens in IIR. FIR braucht zuviel
> Rechenzeit.

Insbesondere dann, wenn man stumpf einen einzelnen Tiefpass mit 
Fsample/16 fuer die :8 Dezimation nimmt. Wenns schon unbedingt FIR sein 
muss, dann wirds wahrscheinlich aufwandsaermer sein, wenn man 3x jeweils 
:2 dezimiert. Fsample/4 FIR Tiefpaesse kann man z.B. so konstruieren, 
dass fast die Haelfte aller Koeffizienten 0 ist - spart also MAC 
Operationen; die Symmetrie halbiert die verbliebenen Multiplikationen 
auch noch mal auf fast die Haelfte...

Aber ich wuerd' auch eher zu IIR raten, da geht dann sogar der gute 
Cauer (6. Ordnung wird fuer diesen Fall voellig ausreichen), denn die 
Phase wird dir ja wurscht sein, wenns fuer eine Lichtorgel sein soll.

Gruss
WK

von Helmut L. (helmi1)


Lesenswert?

derguteweka schrieb:
> Wenns schon unbedingt FIR sein
> muss, dann wirds wahrscheinlich aufwandsaermer sein, wenn man 3x jeweils
> :2 dezimiert. Fsample/4 FIR Tiefpaesse kann man z.B. so konstruieren,
> dass fast die Haelfte aller Koeffizienten 0 ist - spart also MAC
> Operationen; die Symmetrie halbiert die verbliebenen Multiplikationen
> auch noch mal auf fast die Haelfte...

Die meisten machen es in Stufen von maximal 4, da hast du recht. Alles 
darueber ist aufwendig. Auf Phasenlinearitaet kommt es dabei hier ja 
nicht an, deshalb IIR nehmen.

von Uwe (Gast)


Lesenswert?

Noch etwas:

Michael Reinelt schrieb:
> Das ist aber fürs erste nicht weiter tragisch, weil meine Primäre
> Anwendung erstmal eine "Lichtorgel" für meinen kleinen
> schlagzeug-spielenden Sohn ist.

Unter diesen Umständen ist es sicherlich weder notwendig noch sinnvoll, 
die Filter so zu konstruieren, dass das LSBit immer und unter allen 
theoretisch möglichen Worst-Case Bedingungen immer frei von 
Alias-Effekten ist. In dieser Applikation kannst du schon erhebliche 
Abstriche machen - es wird beim Betrieb der Lichtorgel weder dich und 
erst recht nicht deinen kleinen Sohn stören :-)

Aber es geht hier im Forum ja auch um prinzipielle Zusammenhänge, und 
darüber zu diskutieren, finde ich schon sinnvoll.

Grüße, Uwe

von Michael R. (Firma: Brainit GmbH) (fisa)


Lesenswert?

Danke für die rege Beteiligung! ich müssts nur etwas geduldig mit mir 
sein, das ist alles ziemliches Neuland für mich.... aber ich lese und 
lerne...

Nachdem hier alle ausnahmslos zu IIR raten, darf ich daraus schließen 
dass das Zitat "The fact that only the outputs which will be used have 
to be calculated explains why decimating filters are almost always 
implemented using FIR filters!" von hier 
http://www.dspguru.com/dsp/faqs/multirate/decimation Blödsinn ist? 
Ansonsten sieht mir die Seite durchaus vertrauenswürdig aus...

Übrigens, wenn ich "Dezimator" schreibe, meine ich immer die Kombination 
aus Tiefpass und Downsampling.

Die Möglichkeit, den Dezimator auf mehrere Stufen aufzuteilen, habe ich 
bisher noch nicht in Betracht gezogen. Da muss ich erst intensiver 
drüber nachdenken... welchen Vorteil hat das?

von Michael R. (Firma: Brainit GmbH) (fisa)


Lesenswert?

Uwe schrieb:
> Aber es geht hier im Forum ja auch um prinzipielle Zusammenhänge, und
> darüber zu diskutieren, finde ich schon sinnvoll.

genau, du sprichst mir aus der Seele: Auch wenn die Anwendung 
"Kinderspielzeug" ist, mir gehts in erster Linie darum was neues (viel 
neues) zu lernen und zu verstehen. Deswegen stecke ich da auch viel (zu 
viel?) Gehirnschmalz rein. beim nächsten Mal will ichs dann vielleicht 
wirklich "gescheit" machen, und dann habe ich schon einen 
Erfahrungsschatz auf dem ich aufbauen kann.

von Guest (Gast)


Lesenswert?

Ist ja schön dass Ihr hier alle zu IIR Filtern ratet aber was ist genau 
der Vorteil daran? Im Kontext mit Dezimatoren würde ich vermutlich einen 
FIR Filter bevorzugen, aus dem einfachen Grund, dass man eine 
Polyphasenzerlegung machen kann. Lese ich hier richtig, dass ihr um 
Faktor 8 Dezimieren wollt? Dann würden bei einem Polyphasen-zerlegten 
FIR Filter zum Beispiel 2 Koeffizienten bei der schnellen Samplerate für 
einen Filter vom Grad 16 ausreichen. Das sollte ja zu machen sein, oder? 
Also pro Sample auf Input Seite eine Shift-reg Operation, 2 
Multiplikationen und eine Addition. Hinten fällt dann eben das 
langsamere Signal (Faktor 8) raus, welches mit einem Filter vom Grad 16 
gefiltert wurde.
Dafür erreicht man wohl besseres SNR als bei IIR Filtern und hat 
garantierte Stabilität ohne größere Schwierigkeiten.
Ähnlich implementiert man übrigens Asynchrone Sample Rate Converter, die 
FIR Filter von Graden weit über 1000 haben mit nur einstelligen Zahlen 
an MAC Operationen.

von Guest (Gast)


Lesenswert?

Michael Reinelt schrieb:
> Die Möglichkeit, den Dezimator auf mehrere Stufen aufzuteilen, habe ich
> bisher noch nicht in Betracht gezogen. Da muss ich erst intensiver
> drüber nachdenken... welchen Vorteil hat das?

Die Anforderungen an den Filter sind dann geringer, da die 
Signalbandbreite nicht sehr klein wird im Verhältnis zur maximal 
darstellbaren Bandbreite.

Wenn du auf einen Schlag einen sehr hohen Dezimationsfaktor benutzt 
(z.B. 8), musst du dein Signal ja sehr hart auf 1/16 der maximalen 
Bandbreite beschränken um kein Aliasing zu bekommen. Dafür brauchst du 
einen guten Filter. Machst du nur Faktor 2, musst du dein Signal nur auf 
1/4 der Bandbreite bringen, das ist nicht so schwer.

von Michael R. (Firma: Brainit GmbH) (fisa)


Lesenswert?

Guest schrieb:
> Polyphasenzerlegung

Klingt (wie der Rest deines Beitrags) spannend, nur habe ich nicht die 
Spur einer Idee was das schon wieder ist. Kannst du das etwas langsamer 
erklären?

von Guest (Gast)


Lesenswert?

Michael Reinelt schrieb:
> Guest schrieb:
>> Polyphasenzerlegung
>
> Klingt (wie der Rest deines Beitrags) spannend, nur habe ich nicht die
> Spur einer Idee was das schon wieder ist. Kannst du das etwas langsamer
> erklären?

Die Idee ist Simpel: Ein Signal schreiben wir im Diskreten als Summe 
über die einzelnen, verschobenen Pulse. Einen Filter entsprechend als 
Summe der verschobenen Pulse der Impulsantwort. Die eigentliche 
Filterung ist dann eben die Faltung der beiden Summen. Also für Signal 
x[n] und Filter h[n] so:
y[n] = Summe über i: x[n-i]*h[i]

Nun können wir die Summe einfach aufteilen, zum Beispiel so:
y[n] = Summe über i: x[n-2*i-0]*h[2*i+0] + Summe über i: 
x[n-2*i-1]*h[2*i+1]

Wir sehen also, dass wir auch zwei Filter parallel schalten könnten, die 
jeweils nur die Hälfte der Koeffizienten haben. Das ist dann eine 
Polyphasenzerlegung.

Letztendlich haben wir zu diesem Zeitpunkt aber natürlich noch nichts 
gespart. Interessant wird es erst, wenn wir sagen, wir wollen auch nur 
jedes zweite Outputsample (also Downsampling). Wir können jetzt einfach 
die Summe nur für jedes Zweite n auswerten. Damit berechnen wir nur für 
jedes Output Sample einmal alle Koeffizienten.

Analog geht das fürs Upsampling: Wir müssen nur für jedes Input Sample 
alle Koeffizienten einmal benutzen. Für die Kombination aus Up- und 
Downsampling müssen wir dann nurnoch für jedes Output Sample alle 
Koeffizienten benutzen, die auch einem Input Sample entsprechen. Dadurch 
kann man, wie gesagt, Faltung mit mehreren Tausend Koeffizienten 
effizient berechnen.

Dieses Vorgehen entspricht dem oben von dir zitierten "Man muss nur 
Samples berechnen, die man dann auch benutzt".

Mit IIR Filtern geht das übrigens nicht so einfach: Man kann nicht 
einfach nur jedes Zweite n berechnen, da das Filter eine Rückkopplung 
hat und somit jedes n für jedes andere n relevant ist.

von Michael R. (Firma: Brainit GmbH) (fisa)


Lesenswert?

Ich hab jetzt versucht mich etwas in "polyphase decimation" einzulesen, 
wobei das sehr hart für mich ist weil mir einfach die zugrundeliegende 
Mathematik fehlt :-( Auch wenn ich das tief im Innersten vielleicht 
sogar nachvollziehen könnte, ich versteh schon die mathematische Sprache 
nicht.

Soweit ich das verstehe (und ich bitte um Korrektur): ich spar mir damit 
jede Menge Multiplizierer, aber keine Multiplikationen! Ich sehe den 
großen Vorteil darin, dass ich Hardware mehrfach und parallel 
verwenden kann, in Software sehe ich die Stärke (noch) nicht.

Aber eine großartige idee werd ich auf jeden Fall mitnehmen: In meiner 
ursprünglichen Idee war es so, dass ich beim 8:1 Dezimieren 7 Takte lang 
Däumchen gedreht hätte (bis auf das Reinschieben des Meßwertes in den 
Ringbuffer), dafür im 8ten Takt dann alle Hände voll zu tun hätte, 
meinen Filter auszumultiplizieren. Mit geschickter Implementierung eines 
polyphase-Algorithmus kann ich die Rechenzeit gut auf die 8 takte 
verteilen.

Sehe ich das richtig?

von Michael R. (Firma: Brainit GmbH) (fisa)


Lesenswert?

Guest schrieb:
> Wenn du auf einen Schlag einen sehr hohen Dezimationsfaktor benutzt
> (z.B. 8), musst du dein Signal ja sehr hart auf 1/16 der maximalen
> Bandbreite beschränken um kein Aliasing zu bekommen. Dafür brauchst du
> einen guten Filter. Machst du nur Faktor 2, musst du dein Signal nur auf
> 1/4 der Bandbreite bringen, das ist nicht so schwer.

Hmmm.... ob ich jetzt einen guten Filter oder drei schlechtere 
hintereinander mache, macht für mich jetzt nicht den großen Unterschied. 
Im Endeffekt muss nach en drei Filtern Nyquist sauber unterdrückt sein, 
da kommt man ja sowieso nie drum rum.

ich verstehe dass man z.B. eine 60:1 Dezimation auf mehrere Schritte 
aufteilt.

von vorticon (Gast)


Lesenswert?

Hallo zusammen - wen es interessiert, ich hab mal mit einem atmega1284 
einen kleinen Spektrumanalysator gebastelt - hier nachzulesen:
https://sophisticatedcircuits.wordpress.com/2014/06/10/fft-auf-dem-atmega1284p/
ich habe jetzt wirklich nicht alle Beitraege gelesen, nur soviel: wenn 
man einen AVR-ADC nimmt, sollte man es mit der Wissenschaft der 
Signalverarbeitung nicht uebertreiben... Ja, man kann sehr viel aus den 
Teilen rauskitzeln, bis mehrere Mhz Abtastrate, aber die effektive 
Aufloesung ist onehin schlechter als die nominelle, und wenn man dann 
anfaengt, ueber das Fuer und Wider von fuenfpoligen aktiven Filtern zu 
debattieren... hilft nichts. Einfacher RC-Tiefpassfilter, Grenzfrequenz 
niedrig ansetzen, Welligkeit in Kauf nehmen, ist besser als nachher 
Abtastartefakte zu sehen oder zu hoeren.

von derguteweka (Gast)


Angehängte Dateien:

Lesenswert?

Moin,

Derweilen glaub' ich auch, dass das so'n Polyphasendezimator das Ding 
der Wahl sein koennte. Hab' mal spasshalber ein IIR zusammengestuempert 
- da brauch' ich pro Takt (vor der Dezimierung) 9 Multiplikationen - ich 
vermut' mal, mit dem Polyphasendezimator kommt man auf 8 
Multiplikationen pro Takt, wenn man z.b. ein 64-tap Prototypenfilter 
hernimmt. Und hat schoenere Gruppenlaufzeit. Und weniger Overflow. Und 
ueberhaupt...
In dem .zip sind Plots vom eigentlichen 6pol. Cauer-Tiefpass und von der 
Integerrealisierung und ein .c file, mit dem ich die tatsaechliche 
Impulsantwort "berechnet" hab. Oben im .c stehen ein paar Kommandos fuer 
GNU-Octave, mit denen ich die Filterkoeffizienten erraten/berechnet 
hab'.


Gruss
WK

von Michael R. (Firma: Brainit GmbH) (fisa)


Lesenswert?

Boah, dickes Danke!

Der Hinweis auf octave inkl. ein paar Code-Brocken war schon mal Gold 
wert. ich als alter Linuxer hab das natürlich sofort installiert, und 
deine Sachen haben auf Anhieb funktioniert. So ein Cauer, der kann halt 
was...

Dann hab ich mit etwas mit FIR gespielt, das war anfangs eher 
enttäuschend, immer diese müden Butterbrot-Filter...

Bis ich dann Parks-McClellan entdeckt habe (heisst dort 'remez'). Das 
Ding tut genau was ich gesucht habe. Genial!

Noch schöner: Damit lassen sich sofort Einflüsse der Rundungsfehler bei 
Konvertierung der Koeffizienten in integer erfassen. Wenn ich das in 8 
bit rechne (ich würde dann sogar die s.7-Darstellung wählen, also 
Festkomma-Arithmetik) bleibt das Ergebnis immer noch sehr gut.

Die Koeffizienten sind symmetrisch, spart nochmal Multiplikationen. Das 
bringt hier aber wenig, ein fmul am AVR geht eh in zwei Takten durch.

Einige der Koeffizienten sind 0 (je nach Rundungstiefe), spart überhaupt 
Berechnungen. Wenn ich auf s.7 runde, sind 12 von 64 Koeffizienten 0, 
bleiben 52 Multiplikationen. Wenn ich weiter auf 8 Takte parallelisiere, 
sind das 6 bzw. 7 Multiplikationen pro Takt.

Die Polyphase-methode hat hier einen weiteren Vorteil: die 6(7) 
Operationen lassen sich nun mit vertretbarem Aufwand händisch 
"entrollen", was den Code nochmal beschleunigen sollte.

Ich bin ja sowas von begeistert!

von Michael R. (Firma: Brainit GmbH) (fisa)


Lesenswert?

Erfolgsmeldung!

Ich habe jetzt so einen "polyphase decimator" in C implementiert, und 
das Ding funktioniert wunderbar, und sogar schnell genug!

Ein paar (meiner Meinung nach eindrucksvolle) Details:

AVR ATmega328P mit 12 MHz (mein Breadboard, die finale Version könnte 20 
MHz kriegen)

ADC Abtastfrequenz 20 kHz 8 bit

FIR Tiefpass mit 64 (!!!) Bins, -30db zwischen 1 und 1.3kHz (!!!)

Downsampling um Faktor 8 auf 2.5 kHz

FFT mit 256 Abtastpunkten (128 Bänder als Ergebnis, Auflösung 10 Hz, 
Bereich 0..1280Hz, nutzbarer Bereich 0..1kHz darüber kein Signal weil 
vorher weggefiltert

Der Dezimator (inkl. FIR) läuft komplett im Interrupt, und genehmigt 
sich 40% der CPU-Zeit (19..21us entspricht 230..250 Clocks je 
Abtastwert)
 Das klingt schlimm, ist es aber nicht: In der Hauptschleife sieht das 
ganze so aus:

- Warten bis Sample fertig (70 ms)
- FFT-Preprocessing (<1ms)
- sofort neues Sample starten
- FFT berechnen (28ms)
- FFT postprocessing (3ms)

Es wird also praktisch ununterbrochen gesampelt, die Berechnung der FFT 
wird parallel zum Sampeln und Filtern ausgeführt, und leidet natürlich 
unter der Interrupt-Last. Es geht sich aber locker aus, was dazu führt 
dass 70ms "Däumchen gedreht" wird. Es dürfte also gar nicht notwendig 
sein, den CPU-Takt zu erhöhen.


Also, von wegen "nicht mit einem AVR" :-)

von derguteweka (Gast)


Lesenswert?

Moin,

Yeah! Reschbeggd!

Michael Reinelt schrieb:
> Also, von wegen "nicht mit einem AVR" :-)

Wie in allen Foren gibts hier natuerlich auch diverse Bedenkentraeger 
bis professionelle Dummschwaetzer, die glauben, nur weil sie's nicht 
hinbringen, wuerd's nicht gehen. :-D (Ich hab' vor 30 JAhren aufm ZX81 
mit selbst angeflanschtem AD/DA-Wandler schon Faxen gemacht, da wusst' 
ich noch garnicht, dass es auch digitale Filter und all sowas gibt)

Was ich mir mal gedacht' hab' - aber noch nie weiterverfolgt - 
vielleicht waer das ja was fuer dich:

FFT fuer Lichtorgel/Spektrumsanalysatorzwecke macht ja anscheinend heute 
jeder. "Bloed" bei FFT: alle Ausgangskanaele sind gleich breit (In Hz). 
"Schoener" waers evtl, wenn die verschiedenen Kanaele alle z.b. eine 
Oktave (oder Terz oder so) breit waeren.

Also koennte man sich doch ein Fsample/4 FIR Tiefpass (so eines mit 
vielen Nullen als Koeffizienten) basteln. Wenn man bei dem nur dem 
Koeffizienten in der Mitte ein Minus verpasst, hat man ein Fsample/4 
Hochpass. - Kostet also nicht viel Rechenzeit extra, und man kann sein 
Spektrum in eine obere und eine untere Haelfte filtern.
Obere Haelfte: Leistung messen, logarithmieren und anzeigen, untere 
Haelfte um 2 dezimieren und das selbe Spiel (mit dem selben Filter) 
nochmal. Und dann nochmal...usw. vielleicht so 9x.
Dann hat man 10 Ausgangssignale, jeweils eine Oktave breit...
Das duerfte eigentlich auch recht sparsam mit Rechenzeit umgehen, weil 
ja laufend dezimiert wird und damit nur ganz selten (im untersten 
Bereich) ein Signal durch alle Filter geschickt werden muss. Der 
Rechenaufwand fuer alle Filter zusammen duerfte nur nicht ganz doppelt 
so hoch werden wie fuer die erste TP/HP-Kombi.

Wenn das dann tut: Das muesste auch mit Terz oder anderen Intervallen < 
Oktave gehen, nur das Downsampling wird dann aufwendiger, weil "krummer" 
Dezimationsfaktor.

Gruss
WK

von Michael R. (Firma: Brainit GmbH) (fisa)


Lesenswert?

derguteweka schrieb:
> Yeah! Reschbeggd!

Danke!

ich hab jetzt mal den Frequenzgang durchkontrolliert: Null (in Worten: 
Null) Aliasing, erst ab 10kHz, das liegt aber daran dass ich noch keinen 
(analogen) Aliasing-Filter vor dem ADC habe, sondern direkt vom 
Funktionsgenerator einspeise). Aber der "kritische" Bereich den der 
Dezimator wegblenden soll, funktioniert ganz ausgezeichnet!

ich habe allerdings etwas Ripple im Passband (naja, "etwas" ist 
untertrieben, 6dB), der ist aber fast "beabsichtigt", ich hab bei der 
Filterauslegung bewusst höheren Passband-Ripple zugelassen, um (nach der 
Rundung) eine höhere Stopband-Dämpfung zu bekommen. Der Passband-Ripple 
lässt sich aber einfach rausrechnen, da systematisch.

> Was ich mir mal gedacht' hab' - aber noch nie weiterverfolgt -
> vielleicht waer das ja was fuer dich:

Meine liebgewonnene und handgepimpte FFT (postprocessing 5x schneller 
als Elm-Chan) geb ich nicht mehr her :-)

Außerdem wirds eh keine "Lichtorgel" mehr (ich hab ja nur mehr Bässe, 
und keine Höhen) sondern eine "Lichttrommel": ich hab ja absichtlich die 
FFT-Auflösung auf 10Hz gesetzt, weil ich damit einzelne Trommeln 
unterscheiden kann. Jede Trommel kriegt ihre Farbe (naja, fast, 5 
Trommeln und drei Kanäle, ich werd wohl die toms zusammenfassen)

Insofern ist das schon ein Alleinstellungsmerkmal :-)

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
Noch kein Account? Hier anmelden.