software Tiefpassfilter

Gast #2093979
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
Persönliche Seite #2094232
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
#2094246
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
}
Gast #2094584
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!
Angehängte Dateien:
Gast #2094624
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
#4144366
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/
Angehängte Dateien:
Gast #4144411
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?

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