Forum: Mikrocontroller und Digitale Elektronik Filtern durch Rechnen


von Kurt (Gast)


Lesenswert?

Hallo Fachleute,

lese immer wieder von FFT usw.
Kenn mich da nicht aus.
Frage: Ist es möglich und sinnvoll mit einem Rechner (AVR) zwei
Frequenzen aus einem verrauschtem Signal zu holen oder ist man mit
OP-Filtern besser dran?
Denke da an FSK-Signale usw.

Gruss Kurt

von Hubert (Gast)


Lesenswert?

Es kommt darauf an ob man Hard- oder Softwareaufwand treiben will.
Möglich ist es jedenfalls.

von Kurt (Gast)


Lesenswert?

Hallo Hubert,

danke für die schnelle Antwort.
Möchte das "beste" rausholen.
Heisst, welches Verfahren bringt das bessere Ergebniss.
Mit einem 8-Pin-AVR wäre der Platzbedarf sehr gering und es sind keine
Abgleich-Einstellungen nötig.
Ebenso wäre eine Parameteränderung in SW machbar.

Über die Kosten hab ich noch nicht nachgedacht.
Die Frequenzen welche ich meine liegen im Bereich von 500 ..2000 Hz.

Kurt

von Benedikt (Gast)


Lesenswert?

Für FSK wären wohl mehrere Bandpassfilter mit Opamp besser, denn ein AVR
schafft nur etwa 20-150 FFTs pro Sekunde.
Die maximale erreichbare Bitrate liegt damit auf jedenfall im unteren
zweistelligen Bereich.
Ein gut dimensionierter Bandpass mit einem Opamp ist da auf jedenfall
schneller und besser.
FFT ist eigentlich nur gut, wenn man sehr viele Frequenzen haben.

Um eine einzelne zu filtern sollte man FIR Filter verwenden.
Wie gut das mit FIR Filtern geht weiß ich nicht, aber spätestens wenn
man diese auf einem echten DSP betreibt, dann ist es den Opamps
überlegen.

von Mike (Gast)


Lesenswert?

2kHz, d.h. du hättest bei 16MHz Taktfrequenz des AVRs 8000 Zyklen Zeit
je Sample. Wie sollen die Frequenzen wieder ausgegeben werden?
An deiner Stelle würde ich eher zu einem IIR-Filter greifen. Bei
ordentlicher Dimensionierung erreichst du was den Betrag angeht mit
weniger Rechnerei bessere Ergebnisse. Du musst nur aufpassen, wie
wichtig die Phasenlage der beiden Frequenzen ist.
Prinzipiell sollte es gehen, du solltest es aber in ASM proggen, um die
maximale Performance zu erzielen.

von Kurt (Gast)


Lesenswert?

Es geht mir im Prinzip darum wieder saubere 0/1 sen zu bekommen
(Ersatz für den TCM3105).
Es würde ausreichen wenn ein Port-Pin umschaltet und damit das
vorhandensein der jeweiligen Frequenz anzeigt.
Wieweit hier Phasenverzerrungen mitspielen kann ich nicht beurteilen.
Beim 3105 ist dafür ein Poti vorhanden welches die Umschaltschwelle
anpasst.


Kurt

von beta-frank (Gast)


Lesenswert?

Schau mal nach Goertzel-Filter. Für einzelne Frequenzen prima und
rechnen mit weniger Aufwand als FFT.

von Stefan May (Gast)


Lesenswert?

Also für digitale Filterung braucht man überhaupt kein FFT. Das ist
großer Quatsch.

Digitale Filter kommen in zwei Formen vor: FIR (Finite Response Filter)
und IIR (Infinite Response Filter). Beide Formen haben ihre Vor- und
Nachteile, gemeinsam ist aber, daß sie mit Additionen und
Multiplikationen auskommen. Ich habe dazu mal eine Ausarbeitung für das
Studium gemacht, die hier zu finden ist:

http://users.4finger.net/~smay/studium/po_fhl/

Designen lassen sich diese Filter z.B. mit Matlab, was man als
Testversion sogar kostenlos bekommt. Obige URL enthält dazu auch
Beispiele. Aus Matlab heraus können die Koeffizienten der Filter leicht
verwendet werden. Die Implementation eines Digitalen Filters ist auch
sehr simpel, wenn man die Grundstruktur verstanden hat.

ciao, Stefan.

von Mike (Gast)


Lesenswert?

"braucht man überhaupt kein FFT"

Nicht unbedingt 100% richtig. Der erwähnte Goertzel Algorithmus basiert
auf der FFT.

von Kurt (Gast)


Lesenswert?

Hallo Stefan,

hui das sind Formeln!
Muss mich erst in die Materie "eindenken"

 ". Die Implementation eines Digitalen Filters ist auch
sehr simpel, wenn man die Grundstruktur verstanden hat."
Dieses Verständniss ist noch ausstehend.

Gruss Kurt

von Mike (Gast)


Lesenswert?

The Scientist and Engineer's Guide to
Digital Signal Processing

Gibt es frei als pdf und lässt keine Fragen offen.

von Stefan May (Gast)


Lesenswert?

Hey Kurt,

Laß Dich nicht durch die Formeln erschlagen. Schau Dir die Struktur der
Filter an und denke Dir z^-1 als Speicherstelle. (+) ist eine Addition,
(x) eine Multiplikation. Das ganze mußt Du nachbauen.

Du kannst auch im Internet schauen, es gibt fertige Implementationen
eines FIR-Filters. Die sind aber alle nicht auf 8-bit optimiert. Für
das Verständnis des Alghorithmus ist das aber gut zu gebrauchen.

ciao, Stefan.

von Werner Hoch (Gast)


Lesenswert?

Weshalb holt ihr immer gleich den großen Hammer raus (FFT, FIR, ..)
Für zwei Frequenzen sind das nur 4 Multiplikationen und Additionen pro
Sample.
Außerdem ist man mit der DFT nicht an 2^n Abtastwerte gebunden. Man
kann auch zwei ungerade Frequenzen ausfiltern.

von Stefan May (Gast)


Lesenswert?

Also ich hole den Hammer raus, weil ich wenig Ahnung von
Signalverarbeitung habe. FIR und IIR-Filter habe ich mir einmal
angeeignet, halbwegs verstanden, implementiert und kann es mit Hilfe
von Matlab auch designen. Was will man denn mehr? :-)

Kannst Du das Verfahren mit 4 Multiplikationen und Additionen mal
erläutern? Genau genommen braucht man doch für ein IIR-Filter 1.
Ordnung genau 4 Multiplikationen und Additionen.

ciao, Stefan.

von Werner Hoch (Gast)


Lesenswert?

Ein Controller besorgt sich ein Sample nach dem anderen.
Jedes Sample kann mit einer Sinus- und Cosinustabelle multipliziert und
für zwei Frequenzen aufaddiert werden:

ADC einlesen
cos_f1 += cos[n1]*ADC;
sin_f1 += sin[n2]*ADC;
cos_f2 += cos[n3]*ADC;
sin_f2 += sin[n4]*ADC;

Nach einer Periode wird geschaut welches Betragsquadrat größer ist.
Betragsquadrat deshalb, weil man keine Wurzel ziehen will.

Hat man Speicher übrig und kann sich jeweils eine Samplingperiode der
langsameren Frequenz speichern, so kann man auch sowas machen:
ADC einlesen
cos_f1 += cos[n1]*(ADC-ADC[T1]);
sin_f1 += sin[n2]*(ADC-ADC[T1]);
cos_f2 += cos[n3]*(ADC-ADC[T2]);
sin_f2 += sin[n4]*(ADC-ADC[T2]);

die ADC Werte werden hier in einem Ringpuffer gespeichert.
Die Sinus und Cosinustabellen liegen natürlich übereinander im
Speicher. ggf ist eine Sinustabelle von 0 bis PI/2 ausreichend.

Mmmh, wenn mans genau nimmt ist dies ein FIR-Filter. Durch geschickte
Wahl der Parameter haben sich halt die Operationen stark reduziert.

von Björn (Gast)


Lesenswert?

Ganz so simpel ist es ja unter Umständen nicht, wenn es ordentlich
Rauscht. Dann muss man Mitteln. Leckeffekt der DFT kommt auch noch
dazu...
Goertzel halte ich für ne gute Idee.

Gruß

von Mike (Gast)


Lesenswert?

@ Werner Hoch

So ganz genau verstehe ich den Sinn deines Algorithmus trotzdem nicht.
Kannst du ihn mir erklären oder mit einer gängigen Bezeichnung
aushelfen?
Das einzige was halbwegs so ähnlich aussieht ist ein
Hilbert-Transformator, doch sowas sollte das doch nicht werden?!

von Werner Hoch (Gast)


Angehängte Dateien:

Lesenswert?

Das Verfahren macht eine mitlaufend DFT (nach jedem Sample eine DFT über
die letzten 1/f Punkte für die zwei Frequenzen)

Die Fehler durch die Fensterung sind aber doch schlimmer als ich
angenommen habe.
Die Grundidee hab ich im angehängten Code reingehackt.

von Mike (Gast)


Lesenswert?

Also sollte es das folgende werden?

fftfilt

FFT-based FIR filtering using overlap-add method
Syntax
y = fftfilt(b,x)
y = fftfilt(b,x,n)

von Werner Hoch (Gast)


Lesenswert?

Ja sowas in der Art.
Wobei sich eine Vereinfachung ergibt, da nur eine (oder zwei) Frequenz
im Faltungssignal enthalten ist.
Die Summe aus den Produkten von dem ADC-Signal und den Filtersignalen
muß auch nie völlig neu berechnet werden. Es wird Lediglich die
Differenz aufaddiert:
summe += Sinus(z) * (ADC(t=z)-ADC(t=z-T));

Ich werde das Ganze mal in C abtippen. Für eine DFT die nur die 8
unteren Frequenzen enthielt hab ich mal was ähnliches gemacht.

von Oscar (Gast)


Lesenswert?

Hey jetzt beruhigt euch mal wieder. Der Typ hat:
a, keine Ahnung von der Materie, legt das Projekt 100% nieder bevor er
es mit einem digitalen Filter gebacken bekommt. Das braucht naemlich
nicht nur einen AVR sondern zudem: ordentlichen AD und einen DA. Bamms!
Wenn ich frage ob das mit einem AVR geht kann ich bestimmt die AD und DA
Wandler backen. Sicher.
b, gar nicht gesagt was er genau will.
Also erstmal her mit der genauen App und dann kann immer noch das
grosse Klugscheissen starten

von Mike (Gast)


Lesenswert?

@ Oscar
Um den Typ geht es auch schon lange nicht mehr.

Der Austausch mit Werner Hoch basiert allein auf der eigenen Neugier,
da ich im Moment auf diesem Gebiet tätig bin.

Der Begriff "Klugscheissen" scheint mir ein Indiz dafür zu sein, dass
du es analog zum Threadersteller auch nicht verstehst.
Wer Interesse am Thema hat, liest einfach mit - wer nicht, der lässt es
bleiben.

Gruß, Mike

von Björn (Gast)


Lesenswert?

@oscar
Hat hier einer die Null gewählt?

von Stefan May (Gast)


Lesenswert?

Hey Oscar,

Der "Typ" mit dem Nick Kurt hat sehr wohl eine klare Anwendung
gegeben.

> Es geht mir im Prinzip darum wieder saubere 0/1 sen zu bekommen
> (Ersatz für den TCM3105).

Außerdem braucht er neben dem AD-Wandler für seine Anwendung nur noch
einen Port-Pin. Also nüscht mit DA-Wandler. Und warum sollte sich ein
technisch Interessierter nicht mit dem Thema beschäftigen? Wenn es ihm
zu kompliziert wird, dann steigt er eben aus. Das ist doch allein seine
Sache. Wenigstens hat er einen Eindruck bekommen, daß Digital Filtern
nicht so einfach ist.

Deine Antwort jedenfalls ist bestenfalls hochnäsig. Schade eigentlich,
daß sie genau NULL zu dieser Diskussion beiträgt.

ciao, Stefan.

von Jürgen Schuhmacher (Gast)


Lesenswert?

Bingo! Daß sich Diskussionen verselbständigen ist natürlich und auch
gut, denn sonst käme man ja garnicht dahin, daß mal etwas Neues
auftaucht: Die Reduktion von Werner kannte ICH (jedenfalls so) noch
nicht.

Dem Fragenden sei zum G-filter folgende Seite empfohlen:
http://www.numerix-dsp.com/siglib/examples/

Eine Realisation für AVR ATMEGA
http://dragonsgate.net/pipermail/icc-avr/2004-September/004302.html

von Werner Hoch (Gast)


Angehängte Dateien:

Lesenswert?

Ich hab das Programm jetzt mal in C abgetippt.
* Compilieren mit einem C-Compiler
gcc -lm fsk_filter.c
* Die Ausgabe in eine Textdatei schreiben lassen
./a.out >xxx.txt
* mit einem Plotprogramm ankucken
octave:1> m=load xxx.txt;
octave:2>
plot(m(:,1),m(:,2),";fsk;",m(:,1),m(:,3),";f1;",m(:,1),m(:,4),";f2;")

Die Beträge habe ich wegen meiner Faulheit in double ausgerechnet.
Später würde man sicher das Wurzelziehen seinlassen und die Quadrate
vergleichen.

Die Frage wurde gestellt ob ein AVR ausreicht um die FSK
herauszufiltern.
Ich denke schon, aber auf einen Versuch käme es noch an.

Die Demodulationssignale hänge ich ans nächsten Posting an.

von Werner Hoch (Gast)


Angehängte Dateien:

Lesenswert?

Das Bild enthält das FSK-Signal und die Filtersignale a1 und a2.

Viel Spaß beim Spielen mit dem Quellcode.

von Kurt (Gast)


Lesenswert?

Hallo Allemiteinander (bayerisch),

der "Typ" ist wieder da (habe mich zurückgehalten weil ich nicht
mitkomm und zwei Tage ausser Haus war).

Hier nochmal das Ziel:
Der TCM3105 ist ein FSK Mod-Demodulator der für die Wandlung von
Dig-Bit in Analog und umgekehrt verwendet wird (worden ist, weil nicht
mehr gefertigt).
Er besitzt 16 Pin und läuft mit 5V sowie einem PAL-Quarz.
Wenn es nun mit einem Tiny13 auch ginge (durch die "Rechnerei" ev
.noch besser) dann wär das Toll.
Noch besser heisst:
Spannung von 1,7..5,5V
Sinuserzeugung (FSK-Signal)
Auswertung (vor allem aus verrauschtem Signal)
Werteanpassung durch SW
Geringer Strom- und Platzbedarf
Gleicher Baustein auch für die Verwendung als "Bi-Phase - Signale"
oder Mehrquadrantenbetrieb usw.
Warum ich zwar eine Wunschliste aber keine Lösung (Verständniss für die
Arbeitsweise eines Digitalen Filters usw.) liegt an der
 -erhaltenen- Bildung (sorry).
Also regt euch nicht auf wenn ich "schweige" , es ist nicht
Desinteresse o.Ä.

Gruss Kurt

von Kurt (Gast)


Lesenswert?

Hallo @Werner Hoch ,

danke für die Mühe.
Wenn ich das so überlege wird es mit Berechnungen sicher nicht einfach
sein.
Für die Erkennung der H-L-Frequenz stehen ja nur zwei Halbwellen
zur Verfügung (1200/1800 Hz), die Nutzrate ist ja 1200 Baud.
Ausserdem ist die Umschaltung nicht im Nulldurchgang (kann sein, muss
aber nicht).
Es müsste also bereits kurz nach der Umschaltung erkennbar sein wie
schnell sich die Schwingung verändert, egal in welchem Winkel (0..360)
sie sich gerade befindet (ohne Bezugspunkt).
Das setzt eine hohe Zahl von von A/D-Wandlungen und Berechnungen voraus
(hier wird der Tiny13 sicherlich ...).
Villeicht ist es besser sich auf einen "Erwartungszustand"
einzulassen.
Das wiederum setzt ein "Einsynchronisieren" voraus.
Dann bräuchte man nur noch nachschauen ob zu einer bestimmten Zeit das
Signal einen bestimmten Winkel trifft.
Durch Mehrfachabtastung wäre dann auch ein "Filtern aus Rauschen"
machbar.
Hoffe es ist nicht alles "Käse" was mir hierzu einfällt.
Bei Analogfiltern sehe ich die Gefahr der Phasenverschiebung durch die
RC-Komponenten.
Habe mal einen TCM.. mit Rechtecksignal 50/50  versorgt und das
Ergebniss mit nem Oszi angeschaut.
Hier war sehr schön zu sehen wie sich das Tastverhältniss des
Ausgangssignales bei steigender Frequenz verschoben hat.
Durch die Korrektur mit dem "Poti" konnte man das wieder
ausgleichen.

Freu mich auf Antworten

Gruss Kurt

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.