Forum: Digitale Signalverarbeitung / DSP / Machine Learning software Tiefpassfilter


von Filtrix (Gast)


Lesenswert?

Hallo,

ich möchte gern mit einem Mega Controller zur Übung einen Tiefpassfilter 
2. Ordnung in C programmieren. Grenzfrequenz sollte z.B. 1kHz sein.

Ich habe leider nirgends gefunden wie man sich die Grundbausteine wie 
z.B. Samplefrequenz so zurechtlegt, wie es das Filter benötigen wird.

Hat jemand Ratschläge bezüglich guter Literatur oder gar die Zeit dazu 
mal einen solchen Code wie gefordert mit Erklärung zu posten?


Danke

: Verschoben durch Admin
von Michael R. (mexman) Benutzerseite


Lesenswert?

Na, wie funktioniert ein Filter?


Im Prinzip musst Du nur
- einen Analogwert einlesen
- ihn mit dem vorherigen Analogwert vergleichen und
- daraufhin einen berechneten Analogwert ausgeben.

Wie funktioniert ein Tiefpass?
Du berechnest die Differenz (neuer Eingangs-Analogwert - alter 
Eingangs-Analogwert)
und berechnest daraus die Aenderung des Ausgabewertes.
Fuer einen Tiefpass muss
- bei setigendem EIngangswert der Ausgangswert steigen
- die Groesse des Anstieges abhaengen von der DIfferenz der 
EIngangswerte
(alles bei Abtastung  in gleichmaessigen Zeitabstaenden)


Im Extremfall machst Du das so:
neue Einangsspannung > alte Eingangsspannung -> Inkrementiere den 
Ausgangswert

neue Einangsspannung < alte Eingangsspannung -> Dekrementiere den 
Ausgangswert


Gruss

Michael

von Mehmet K. (mkmk)


Lesenswert?

1
// Tiefpass-Filter:
2
// adc_akt   : akt. ADC-Messwert
3
// adc_value : akt. Mittelwert
4
// adc_tmp   : Mittelwert des letzten Zyklus
5
// k         : Integer Wert mit k > 1
6
//
7
// adc_value = (k-1)/k * adc_tmp + 1/k * adc_akt
8
// wir arbeiten mit k = 4
9
//==============================================
10
// ADC_ReadSound
11
//==============================================
12
void ADC_ReadSound( WORD adc_akt)
13
{
14
  static WORD adc_tmp;
15
16
  if (adc_tmp == 0)      // falls erste Messung
17
    adc_tmp = adc_akt;
18
19
  adc_values[ADC_SOUND].value_ist = (adc_tmp + adc_tmp + adc_tmp) / 4  + (adc_akt / 4);
20
  adc_values[ADC_SOUND].valid     = true;
21
  adc_tmp                         = adc_akt;
22
}

von edgar S. (hbl333)


Lesenswert?

Dann sieh mal hier nach:

http://de.wikipedia.org/wiki/Filter_mit_endlicher_Impulsantwort

jetzt brauchst du nur noch Filterkoeffizienten und fertig.

von Filtrix (Gast)


Angehängte Dateien:

Lesenswert?

Mehmet Kendi schrieb:
1
 adc_tmp = adc_akt;

Das dürfte nicht viel bringen, wenn du deinen letzten Messwert in der 
nächsten Berechnung mehr Wertigkeit gibst als dem Neuen. Damit 
verschiebst du dein Messergebnis lediglich um eine Messung nach hinten.
1
 adc_temp = adc_values[ADC_SOUND].value_ist

higegen macht Sinn, siehe Anhang.

Welchen Einfluss hat jetzt noch die Sample-Rate? Je schneller ich 
sample, desto weniger bringt das Filter!

von Mathias F. (minglifu)


Lesenswert?

Servus,

also willst du das ordentlich und richtig machen, so geb ich dir das 
Stichwort: Bilineare-Transformation von der s-Ebene in die z-Ebene!

MfG
MingliFu

von gk (Gast)


Lesenswert?

Also es gab mal einen Artikel in der c't Heft 12, 1987(!) mit dem Titel 
"Frequenzen wegrechnen" da war zum einen die Theorie gut beschrieben 
(ähnlich Wiki), der Filteralgorythmus und die Berechnung der zugehörigen 
Parameter mit Beispielprogrammen.
gk

von avr (Gast)


Angehängte Dateien:

Lesenswert?

Im EDN stand auch mal was, ich habs mal angehängt.

Ist ein einfacher TP mit Erklärung.

avr

von TP (Gast)


Lesenswert?


von Georg G. (df2au)


Angehängte Dateien:

Lesenswert?

Hier
http://www.minidsp.com/applications/advanced-tools/fir-filter-tools
findest du eine gute Übersicht über verfügbare Software, die dir hilft, 
die Filterkoeffizienten zu ermitteln.

Das Programm im Anhang ist eine quick and very dirty Implementation 
eines Bandpasses.

Hier
t-filter.appspot.com
gab es einmal ein sehr gutes Programm, um online Filter zu entwerfen. 
Momentan (?) ist es leider nicht zugänglich.

Google zeigt dir unter "fir filter design online" noch viele andere 
Hilfen.

Eine Kurpackung Entwurfssoftware für Windows findest du unter
http://iowahills.com/

: Bearbeitet durch User
von Gerhard (Gast)


Lesenswert?

Auch immer eine gute Adresse das "The Scientist and Engineer's Guide to 
Digital Signal Processing" zu finden hier:
http://www.dspguide.com/pdfbook.htm

und speziell zum Filterdesign:
http://www.dspguide.com/ch20.htm

Man kann sich die Kapitel auch als PDF runterladen.

Gerhard

von Henk (Gast)


Lesenswert?

Michael Roek schrieb:
> Wie funktioniert ein Tiefpass?
> Im Extremfall machst Du das so:
> neue Einangsspannung > alte Eingangsspannung -> Inkrementiere den
> Ausgangswert
>
> neue Einangsspannung < alte Eingangsspannung -> Dekrementiere den
> Ausgangswert

Was ist denn DAS für eine seltsame Definition für einen TP? Wie sieht da 
wohl die Ü-Funktion aus?

von Joe F. (easylife)


Lesenswert?

Henk schrieb:
> Wie sieht da
> wohl die Ü-Funktion aus?

so:
cat /dev/random

von Markus B. (russenbaer)


Angehängte Dateien:

Lesenswert?

Mehmet Kendi schrieb:
> Mehmet Kendi
>         (mkmk)
>
>
>
>
>
>
>
>
>       Datum: 08.03.2011 15:09


Hab Dir einen Bodediagramm für Deine Filterkoeffizienten und den Fall 
fs=2kHz gemacht.
Die sind nicht gerade berühmt...

von Christoph db1uq K. (christoph_kessler)


Lesenswert?


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.