Qu'est-ce qu'un filtre Passe-Haut ou Passe-Bas?

les logiciels D'édition et de traitement graphique et audio contiennent souvent des fonctions appelées "Filtre Passe-Haut" et "filtre Passe-Bas". Exactement quoi faire, et quels sont les algorithmes pour les mettre en œuvre?

25
demandé sur Andrew Edgecombe 2008-08-30 04:55:26

6 réponses

Wikipedia:

ces termes "haut", "bas" et "bande" font référence à fréquences. Passe-haut, vous essayez de supprimer les basses fréquences. En passe-bas, vous essayez de supprimer élevé. Dans la passe de bande, vous permettez seulement une gamme de fréquence continue de rester.

le Choix de la fréquence de coupure dépend votre application. Le codage de ces filtres peut être fait en simulant des circuits RC ou en jouant avec les transformées de Fourier de vos données basées sur le temps. Voir les articles de wikipedia pour des exemples de code.

19
répondu Frank Krueger 2008-08-30 00:58:00

Voici comment vous implémentez un filtre passe-bas en utilisant convolution:

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];

Notez que l'exemple est extrêmement simplifiée. Il ne fait pas de vérifications de portée et ne gère pas les bords correctement. Le filtre utilisé (box-car) est particulièrement mauvais, car il causera beaucoup d'artefacts (sonnerie). Lisez sur la conception du filtre.

vous pouvez également implémenter les filtres dans le domaine fréquence. Voici comment mettre en œuvre un filtre passe-haut en utilisant 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);

Encore une fois, c'est simplifié, mais vous obtenez l'idée. Le code n'a pas l'air compliqué comme les mathématiques.

27
répondu Hallgrim 2013-09-09 00:11:00

il s'agit généralement de circuits électriques qui ont tendance à transmettre des parties de signaux analogiques. High pass tend à transmettre plus de parties de haute fréquence et low pass tend à transmettre plus de parties de basse fréquence.

ils peuvent être simulés en logiciel. Une marche moyenne peut agir comme un filtre passe-bas, par exemple) et la différence entre une marche moyenne et elle est entrée peut fonctionner comme un filtre passe-haut.

5
répondu BCS 2008-08-30 00:59:58

passe-Haut filtre laisse -fréquence (description/informations locales) pass.

passe-Bas filtre laisse faible-frà © quence (information grossiÃre/rugueuse/globale) pass.

5
répondu puri 2008-08-31 12:38:34

le filtrage décrit l'acte de traiter des données d'une manière qui applique différents niveaux d'atténuation à différentes fréquences à l'intérieur des données.

Un filtre passe-haut s'appliquera minimale attentuation (ie. laisser les niveaux inchangés) pour les hautes fréquences, mais appliquer une atténuation maximale aux basses fréquences.

Un filtre passe-bas est l'inverse - il pas de l'atténuation de basses fréquences s'applique atténuation hautes fréquences.

il y a un nombre d'algorithmes de filtrage différents qui sont utilisés. Les deux plus simples sont probablement le filtre à réponse impulsionnelle finie (aka. FIR filter) et le filtre Infinite Impulse Response (alias. IIR filter).

Le filtre FIR fonctionne en gardant une série d'échantillons et en multipliant chacun de ces échantillons par un coefficient fixe (qui est basé sur la position dans la série). Les résultats de chacune de ces multiplications sont accumulés et constituent la sortie de cet échantillon. Cela est considéré comme un Multiplier-accumuler-et dans le matériel DSP dédié, il y a une instruction MAC spécifique pour le faire.

quand l'échantillon suivant est pris, il est ajouté au début de la série, et l'échantillon le plus ancien de la série est retiré, et le processus est répété.

le comportement du filtre est fixé par la sélection des coefficients du filtre.

un des filtres les plus simples qui est souvent fourni par le logiciel de traitement d'image est le filtre de moyenne. Cela peut être mis en œuvre par un filtre FIR en réglant tous les coefficients du filtre à la même valeur.

5
répondu Andrew Edgecombe 2008-10-05 02:29:57
float lopass(float input, float cutoff) {
 lo_pass_output= outputs[0]+ (cutoff*(input-outputs[0])); 
outputs[0]= lo_pass_output;
return(lo_pass_output);
}

Voici à peu près la même chose, sauf que c'est passe-haut:

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
répondu Eric Brotto 2013-09-09 00:11:54