Tiefpaß mit C programmieren

Gast #390484
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
Gast #390486
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
Gast #390487
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
Gast #390489
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
Gast #390490
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
Gast #390491
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.
Gast #390495
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.
Gast #390497
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
(Firma: WhyLee) #1751179
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!
#1751477
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.
Moderator #1751507
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren