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
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
ja Schwankungen weghaben, aber durch Tiefpass(1.ordnung), mathematiche Formeln kenne ich sie schon, die Frage wie wird das in C programm eingesetz
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
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
kannst du mir bitte name des buchs sagen oder ein link wo mehr erklärungen finde. Danke
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
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
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.
Danke euch, ja Tiefpass 1.ordnung, ok ich ich gucke mal jetzt, aber vielleicht komme ich nochmal mit neuen Fragen.
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.
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
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.
Wenn Du die oben erwähnten fx1..fxn auf 1 setzt, hast Du den Mittelwert über n Werte errechnet...
@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
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
Hi, Ich habe eine Frage? Woher kommt denn dein Signal, für den du den Tiefpass brauchst? Gruß, Georg
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
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
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!
Noch einfacher:
1 | filterwert += (neu-filterwert)>>4; |
Man muss nur aufpassen dass die Änderung nicht zu klein und dadurch weggerundet wird.
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.
Für die "Schift-Filter" habe ich vor einiger Zeit mal was mit Berechnung gefunden. Ist eigentlich gut erklärt. avr
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.