www.mikrocontroller.net

Forum: Digitale Signalverarbeitung / DSP Tiefpaß mit C programmieren


Autor: sofi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich möchte gerne die Schwankungen von der Spannung minimieren, und zwar
durch ein Tiefpaß, hat jemand ein C-fonktion dafür oder ein link, wo
ich informationen bekomme.

ich bedanke mich für jede Hilfe

Autor: Hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
tjo wenn du wirklich einen TP haben willst darfst du falten... aber wenn
du nur schwankungen weghaben willst würd ich einfach den mittelwert
bilden... ist einfacher und schneller... vor allem wenn du 2^n samples
addierst...

73

Autor: sofi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja Schwankungen weghaben, aber durch Tiefpass(1.ordnung), mathematiche
Formeln kenne ich sie schon, die Frage wie wird das in C programm
eingesetz

Autor: Hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
am besten du nimmst dir halt sagenwirmal 16 samples her... als vector..
dann multiplizierst du das mit einer funktionalmatrix und schon hast du
was du willst ;)

genaue erklärung ist recht aufwendig und warscheinlich netter aus dem
buch nachzulesen.. ist auf jeden fall nicht ganz unkompliziert wie man
draufkommt...

73

Autor: Nils (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So kompiziert ist das gar nicht:

Wenn Du eine feste Abtastrate hast kannst Du relativ leicht ein
FIR-Filter in C implementieren. FIR hat den Vorteil, dass es auf jeden
Fall stabil ist. Dazu brauchst Du nur ein array mit so vielen Werten
anlegen, wie die Ordnung Deines Filters ist.

G(z) = Summe(von i=0 bis i=n) über bi * z^-i;

wobei n    = Ordnung des Filters
      bi   = Filterkoeffizienten
      z^-i = Abtastwerte

Die Koeffizienten kann man sich leicht in Matlab berechnen lassen.

Gruß, Nils

Autor: sofi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
kannst du mir bitte name des buchs sagen oder ein link wo mehr
erklärungen finde.

Danke

Autor: Hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
huch auf fir hab ich ganz vergessen ;)

A.V. Oppenheim, R.W. Schafer, J.R. Buck: Discrete-Time Signal
Processing. Prentice-Hall, 1999 (2nd ed.).

am englischen sitz ich gerade... zumindest die theorie sollte da
drinnen eigentlich irgendwie verständlich sein... aber achtung das ist
bei uns uni-lektüre es wird also einiges an mathe vorausgesetzt.. aber
ausborgen in irgendeiner bücherei schadet sicher nicht ;)

73

Autor: Nils (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bücher kann ich zwei empfehlen (sind aber nicht ganz billig):

Digital Signal Processing, Ifeachor und Jervis, Prentice Hall
Digital Signal Processing, Proakis und Manolakis, Pearson

aber googlen nach FIR und Wikipedia sollten einen ersten Einblick
liefern. Auch die Matlab Hilfe zur Signal Processing Toolbox ist eine
gute Grundlage.

Ich weiß auch nicht, ob für Deine Anwendung ein konkretes filterdesign
erforderlich ist. Ich denke die Grenzfrequenz Deines Tiefpaßfilters ist
dir eigentlich egal und Du willst nur irgendwelche Spikes herausfiltern.
Dann würde ich einfach den median anwenden oder einen Mittelwert
nehmen.

Gruß, Nils

Autor: Wolfram (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn du das Buch durchgelesen und verstanden hast, dann wird dir aber
auch klar, warum du vor den ADC einen analogen Tiefpass hängen musst.
Das ist nämlich eine der Grudvoraussetzungen wenn du etwas samplen
willst. Besonders wenn es dann noch in ein digitales Filter reingehen
soll. Aber eigentlich reicht dir ja schon der Tiefpass.

Autor: sofi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke euch,

ja Tiefpass 1.ordnung, ok ich ich gucke mal jetzt, aber vielleicht
komme ich nochmal mit neuen Fragen.

Autor: sofi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja das stimmt wolfran, aber bei mir hängt kein Tiefpass vor ADC, ich
wollte jetzt nur durch das Programm die Schwankungen abheben, d.h. das
Algurithm einem Tifpass benutzen.

Autor: Hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
tjo das geht eben nicht (vernünftig).... die 2 bauteile darfst du
reinlöten :)
sollte übrigens höchstens bei samplingrate/10 abschneiden.. besser noch
früher...
73

Autor: Wolfram (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
einfache Tiefpassformel:
Ausgangswert=(fx1*x1+fx2*x2+...+fxn*xn)/n
x1... xn sind die jeweils letzten n gesampelten Werte
wenn du eine definierte Samplerate hast und einen bestimmten
Frequenzgang haben willst, nimm ein Filterdesigntool z.B. wie schon
oben erwähnt Matlab. Das gibt Dir die Koeffizienten fx1..fxn an.
Wahrscheinlich wird es für deine Anwendung reichen wenn du sie auf 1
setzt.
Im übrigen bist du im falschen Forum. Das DSP-Forum ist genau das
passende hierfür.

Autor: Nils (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn Du die oben erwähnten fx1..fxn auf 1 setzt, hast Du den Mittelwert
über n Werte errechnet...

Autor: TheMason (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@sofi

erzähl doch mal was über den background der sache.
misst du nur eine sich langsam ändernde spannung ?!
je nachdem wofür du es brauchst würde ich abwägen wie genau die
filterung sein muß. oftmals reicht es nur den mittelwert zu bilden.
willst du störungen eliminieren ist ein tiefpass eher brauchbar.
hast du anforderungen an phasengang. sonst könnte man u.u. auch iir
filter nehmen. die können zwar instabil werden, aber bei passender
dimensionierung passiert da nix und je nachdem welchen background dein
signal hat, sprich mit welcher frequenz samplest du, mit welcher
frequenz willst du deine werte filtern, wie genau muß das ganze sein.
soll das ganze in einem uC, DSP, PC laufen ?! (dann muß man die
ressourcen entsprechend einplanen)
hoffe ich hab dich jetzt nicht überrannt :-))

gruß
rene

Autor: Detlef _a (detlef_a)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tiefpaß erster Ordnung geht so:

1. neuer_Ausgangswert = (1-e)*alter_Ausgangswert+e*Eingangswert
2. neuer_Ausgangswert = alter_Ausgangswert

'e' bestimmt, wie 'träge' das Ding ist.

Cheers
Detlef

Autor: Detlef _a (detlef_a)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ähm, so rum

2.  alter_Ausgangswert = neuer_Ausgangswert

Autor: Georg Weinhold (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
Ich habe eine Frage?
Woher kommt denn dein Signal, für den du den Tiefpass brauchst?
Gruß, Georg

Autor: Reiner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Versuchs doch mal hiermit:
http://www-users.cs.york.ac.uk/~fisher/mkfilter/trad.html

Oder wenn es ganz einfach sein soll

#define coeff 8  // Wert zwischen 1 und  9
int Wert;
static int Wert_alt;

Wert = (coeff * Wert_alt + (10 – coeff) * Wert) / 10);
Wert_alt = Wert;

Reiner

Autor: Reiner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da ging was schief beim posten - also nochmal:

Versuchs doch mal hiermit:
http://www-users.cs.york.ac.uk/~fisher/mkfilter/trad.html

Oder wenn es ganz einfach sein soll

#define coeff 8  // Wert zwischen 1 und  9
int Wert;
static int Wert_alt;

Wert = (coeff * Wert_alt + (10 - coeff) * Wert) / 10);
Wert_alt = Wert;

Reiner

Autor: Stefan Weilhartner (Firma: WhyLee) (whylee)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dieser Thread ist zwar schon uralt, aber ich möchte trotzdem hier 
schnell etwas Wertvolles posten.
Das ist ein Filter wie ich ihn auf schmalbrüstigen 8-bit-Mikrocontroller 
oft einsetze um Rauschen aus gewandelten Analogwerten zu filtern:

FilterWert = (FilterWert * 63 + NeuerSamplingWert)/64;

Das ist ein sogenanntes IIF (Infinite Impulseresponse Filter), das einem 
Tiefpaß erster Ordnung entspricht.
Mit dem Faktor kann angepasst werden, wie stark gefiltert werden soll 
(Im Prinzip ist das das Verhältnis von Grenzfrequenz zu 
Samplingfrequenz).

Weniger stark Filtern ist z.B.:
FilterWert = (FilterWert * 15 + NeuerSamplingWert)/16;

Man kann das dann auch mit Bitshifts machen:
FilterWert = ((FilterWert<<4) - FilterWert + NeuerSamplingWert)>>4;


Man muß sich bzw. der Genauigkeit noch einige Gedanken machen.
D.h. wenn ich einen 8-Bit Samplingwert habe, dann werde ich wohl ein 
paar Bits Genauigkeit dazugeben. ==> NeuerSamplingWert = ADC<<3

Und ich muß natürlich auch abchecken, daß bei der Multiplikation bzw. 
dem Bitshift ein Überlauf entsteht!

Wenn man das Berücksichtigt, ist dieser Filter eine feine Sache!

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Noch einfacher:
filterwert += (neu-filterwert)>>4;

Man muss nur aufpassen dass die Änderung nicht zu klein und dadurch 
weggerundet wird.

Autor: Michael O. (mischu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andreas Schwarz schrieb:
> Noch einfacher:
>
>
> filterwert += (neu-filterwert)>>4;
> 
>
> Man muss nur aufpassen dass die Änderung nicht zu klein und dadurch
> weggerundet wird.

Das klappt nur, wenn die Werte ausschließlich positive sind oder die 
shiftoperation ebenfalls mit negativen Werten umgehen kann.

In der Regel implementiere ich die Filter ähnlich (auf 8Bit). Die 
Schiebeoperation lässt sich auch nutzen, die Filterzeitkonstante 
dynamisch zur Laufzeit zu ändern (wenn man die Charakteristik mal 
umschalten muss).

Ein wirklich gutes TP Filter lässt sich eher mit einer IIR / FIR 
Implementation erzielen. Dazu benötigt man auch nicht direkt "FLOAT" 
Unterstützung und Divisionen.

Autor: avr (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Für die "Schift-Filter" habe ich vor einiger Zeit mal
was mit Berechnung gefunden.

Ist eigentlich gut erklärt.

avr

Autor: Yalu X. (yalu) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Am besten funktioniert es so:

  r = x + r - y;
  y = r >> 4;

x ist der Messwert, y der gefilterte Wert. Es wird zwar die zusätzliche
Variable r benötigt, dafür erreicht bei konstantem Messwert der
gefilterte Wert garantiert nach endlich vielen Durchläufen diesen
Messwert, was bei Verfahren ohne diese zusätzliche Variable nicht der
Fall ist.

Edit: Das ist genau die Methode in dem Artikel, den avr gepostet hat und
ich erst jetzt gelesen habe.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.