Forum: Digitale Signalverarbeitung / DSP / Machine Learning Tiefpaß mit C programmieren


von sofi (Gast)


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

von Hans (Gast)


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

von sofi (Gast)


Lesenswert?

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

von Hans (Gast)


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

von Nils (Gast)


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

von sofi (Gast)


Lesenswert?

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

Danke

von Hans (Gast)


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

von Nils (Gast)


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

von Wolfram (Gast)


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.

von sofi (Gast)


Lesenswert?

Danke euch,

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

von sofi (Gast)


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.

von Hans (Gast)


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

von Wolfram (Gast)


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.

von Nils (Gast)


Lesenswert?

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

von TheMason (Gast)


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

von Detlef _. (detlef_a)


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

von Detlef _. (detlef_a)


Lesenswert?

Ähm, so rum

2.  alter_Ausgangswert = neuer_Ausgangswert

von Georg Weinhold (Gast)


Lesenswert?

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

von Reiner (Gast)


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

von Reiner (Gast)


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

von Stefan W. (Firma: WhyLee) (whylee)


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!

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Noch einfacher:
1
filterwert += (neu-filterwert)>>4;

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

von Michael O. (mischu)


Lesenswert?

Andreas Schwarz schrieb:
> Noch einfacher:
>
>
1
> filterwert += (neu-filterwert)>>4;
2
>
>
> 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.

von avr (Gast)


Angehängte Dateien:

Lesenswert?

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

Ist eigentlich gut erklärt.

avr

von Yalu X. (yalu) (Moderator)


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.

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.