2008-08-30 5 views

Antwort

18

Wikipedia:

Diese "hoch", "niedrig" und "Band" Begriffe beziehen sich auf Frequenzen. Im Hochpass versuchen Sie, tiefe Frequenzen zu entfernen. Im Tiefpass versuchen Sie, hoch zu entfernen. Im Bandpass lässt nur ein kontinuierlicher Frequenzbereich zu.

Die Wahl der Grenzfrequenz hängt von Ihrer Anwendung ab. Die Codierung dieser Filter kann entweder durch Simulieren von RC-Schaltungen oder durch das Spielen mit Fourier-Transformationen Ihrer zeitbasierten Daten erfolgen. In den Wikipedia-Artikeln finden Sie Codebeispiele.

5

Sie sind in der Regel Elektrische Schaltungen, die dazu neigen, Teile von analogen Signalen zu passieren. Der Hochpass neigt dazu, mehr der hochfrequenten Teile zu übertragen, und der Tiefpass neigt dazu, mehr der niederfrequenten Teile zu passieren.

Sie können in Software simuliert werden. Ein Walking-Durchschnitt kann beispielsweise als ein Tiefpassfilter fungieren und der Unterschied zwischen einem Walking-Durchschnitt und seiner Eingabe kann als ein Hochpassfilter arbeiten.

5

Hochpassfilter lassen hohen -frequenz (detaillierte/lokale Informationen) Pass.
Tiefpassfilter lassen niedrigen -frequenz (Grob-/rau/global Informationen) Pass.

27

Hier ist, wie Sie ein Tiefpassfilter implementieren Faltung mit:

double[] signal = (some 1d signal); 
double[] filter = [0.25 0.25 0.25 0.25]; // box-car filter 
double[] result = new double[signal.Length + filter.Length + 1]; 

// Set result to zero: 
for (int i=0; i < result.Length; i++) result[i] = 0; 

// Do convolution: 
for (int i=0; i < signal.Length; i++) 
    for (int j=0; j < filter.Length; j++) 
    result[i+j] = result[i+j] + signal[i] * filter[j]; 

Beachten Sie, dass das Beispiel extrem vereinfacht. Es führt keine Bereichsüberprüfungen durch und behandelt die Kanten nicht richtig. Der verwendete Filter (Box-Car) ist ein besonders schlechter Tiefpassfilter, da er viele Artefakte (Klingeln) verursacht. Lesen Sie über das Filterdesign.

Sie können die Filter auch in der Frequenzdomäne implementieren. Hier ist, wie Sie ein Hochpassfilter implementieren FFT:

double[] signal = (some 1d signal); 
// Do FFT: 
double[] real; 
double[] imag; 
[real, imag] = fft(signal) 

// Set the first quarter of the real part to zero to attenuate the low frequencies 
for (int i=0; i < real.Length/4; i++) 
    real[i] = 0; 

// Do inverse FFT: 
double[] highfrequencysignal = inversefft(real, imag); 

Auch dies vereinfacht, aber Sie bekommen die Idee. Der Code sieht nicht so kompliziert aus wie die Mathematik.

+2

Sehr cool, um Code-Beispiele zu haben. Warum Faltung in einem Fall und FFT in dem anderen? – dfrankow

+2

@dfrankow Kein besonderer Grund. Nur um zu zeigen, wie es in den verschiedenen Bereichen aussieht. Der Text wurde aktualisiert, um dies zu berücksichtigen. Vielen Dank. – Hallgrim

+0

Sind Sie sicher, dass der erste Teil Ihrer Antwort richtig ist, wo Sie Faltung im Zeitbereich mit einer Rechteckfunktion anwenden? Ich dachte, ein Tiefpassfilter im Zeitbereich erforderte die Faltung einer Sinc-Funktion? – stackoverflowuser2010

5

Filtern beschreibt den Vorgang der Datenverarbeitung in einer Weise, bei der verschiedene Dämpfungspegel auf unterschiedliche Frequenzen in den Daten angewendet werden.

Ein Hochpaßfilter wird für hohe Frequenzen eine minimale Dämpfung (dh Leave-Pegel unverändert) anwenden, wendet jedoch maximale Dämpfung für niedrige Frequenzen an.

Ein Tiefpassfilter ist das Gegenteil - es wird keine Dämpfung auf niedrige Frequenzen angewendet, indem die Dämpfung auf hohe Frequenzen angewendet wird.

Es gibt eine Reihe verschiedener Filteralgorithmen, die verwendet werden. Die zwei einfachsten sind wahrscheinlich das Finite-Impulse-Response-Filter (aka. FIR-Filter) und das Infinite Impulse Response-Filter (auch bekannt als IIR-Filter).

Der FIR-Filter arbeitet, indem er eine Reihe von Proben hält und jede dieser Proben mit einem festen Koeffizienten multipliziert (der auf der Position in der Reihe basiert). Die Ergebnisse jeder dieser Multiplikationen werden akkumuliert und sind die Ausgabe für diese Probe. Dies wird als Multiply-Accumulate bezeichnet - und in dedizierter DSP-Hardware gibt es einen speziellen MAC-Befehl, um genau dies zu tun.

Wenn die nächste Probe entnommen wird, wird sie zum Anfang der Serie hinzugefügt, und die älteste Probe in der Serie wird entfernt und der Vorgang wiederholt.

Das Verhalten des Filters wird durch die Auswahl der Filterkoeffizienten festgelegt.

Einer der einfachsten Filter, der oft von Bildverarbeitungssoftware zur Verfügung gestellt wird, ist der Mittelungsfilter. Dies kann durch ein FIR-Filter implementiert werden, indem alle Filterkoeffizienten auf den gleichen Wert gesetzt werden.

5

Hier ist ein super einfaches Beispiel eines Tiefpassfilters in C++, die das Signal einer Probe zu einem Zeitpunkt verarbeitet:

float lopass(float input, float cutoff) { 
lo_pass_output= outputs[0]+ (cutoff*(input-outputs[0])); 
outputs[0]= lo_pass_output; 
return(lo_pass_output); 
} 

Hier ist so ziemlich die gleiche, außer es Hochpaß ist:

float hipass(float input, float cutoff) { 
hi_pass_output=input-(outputs[0] + cutoff*(input-outputs[0])); 
outputs[0]=hi_pass_output; 
return(hi_pass_output); 
} 
+4

Ich probiere, du bist Code, aber ich verstehe nicht, was "Cutoff" symbolisiert. Es ist keine Grenzfrequenz in Hertz, oder? –

+1

Die Antwort ist fast ein Jahrzehnt alt, aber ich glaube immer noch, dass es nicht die "Ausgabe [0]" ist, die in Berechnungen einbezogen werden sollte, sondern der vorher gefilterte Beispielwert. – Mike

+0

Related: https://dsp.stackexchange.com/questions/39063/simple-software-low-pass-filter –