Domanda

I software di editing ed elaborazione grafica e audio spesso contengono funzioni chiamate "Filtro passa alto" e "Filtro passa basso".Cosa fanno esattamente e quali sono gli algoritmi per implementarli?

È stato utile?

Soluzione

Wikipedia:

Questi termini "alto", "basso" e "fascia" si riferiscono a frequenze.Nel passa-alto, provi a rimuovere le basse frequenze.Nel passa-basso, provi a rimuovere l'alto.Nel passa banda si consente solo che rimanga una gamma di frequenza continua.

La scelta della frequenza di taglio dipende dall'applicazione.La codifica di questi filtri può essere eseguita simulando circuiti RC o giocando con le trasformate di Fourier dei dati basati sul tempo.Consulta gli articoli di Wikipedia per esempi di codice.

Altri suggerimenti

Ecco come implementare un filtro passa-basso utilizzando la convoluzione:

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

Si noti che l'esempio è estremamente semplificato.Non esegue controlli di portata e non gestisce correttamente i bordi.Il filtro utilizzato (vagone merci) è un filtro passa-basso particolarmente scadente, perché causerà molti artefatti (suono).Informati sulla progettazione del filtro.

Puoi anche implementare i filtri nel dominio della frequenza.Ecco come implementare un filtro passa-alto utilizzando 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);

Ancora una volta, questo è semplificato, ma hai l'idea.Il codice non sembra complicato come i calcoli.

Sono generalmente circuiti elettrici che tendono a far passare parti di segnali analogici.Il passa alto tende a trasmettere più parti ad alta frequenza e il passa basso tende a trasmettere più parti a bassa frequenza.

Possono essere simulati nel software.Una media ambulante può agire, ad esempio, come un filtro passa basso e la differenza tra una media ambulante e il suo input può funzionare come un filtro passa alto.

Alto passaggio filtro lascia alto-frequenza (informazioni dettagliate/locali) passaggio.
Passa basso filtro lascia Basso-frequenza (informazioni grossolane/grezze/globali) passaggio.

Il filtraggio descrive l'atto di elaborazione dei dati in modo da applicare diversi livelli di attenuazione a diverse frequenze all'interno dei dati.

Un filtro passa alto applicherà un'attenuazione minima (es.lasciare i livelli invariati) per le alte frequenze, ma applica la massima attenuazione alle basse frequenze.

Un filtro passa basso è il contrario: non applicherà alcuna attenuazione alle basse frequenze ma applicherà l'attenuazione alle alte frequenze.

Esistono diversi algoritmi di filtraggio utilizzati.I due più semplici sono probabilmente il filtro Finite Impulse Response (aka.filtro FIR) e il filtro Infinite Impulse Response (aka.filtro IIR).

Il filtro FIR funziona mantenendo una serie di campioni e moltiplicando ciascuno di essi per un coefficiente fisso (che si basa sulla posizione nella serie).I risultati di ciascuna di queste moltiplicazioni vengono accumulati e costituiscono l'output per quel campione.Questo viene definito Multiply-Accumulate e nell'hardware DSP dedicato esiste un'istruzione MAC specifica per fare proprio questo.

Quando viene prelevato il campione successivo, questo viene aggiunto all'inizio della serie, il campione più vecchio della serie viene rimosso e il processo viene ripetuto.

Il comportamento del filtro è fissato dalla selezione dei coefficienti del filtro.

Uno dei filtri più semplici spesso forniti dai software di elaborazione delle immagini è il filtro della media.Ciò può essere implementato da un filtro FIR impostando tutti i coefficienti del filtro sullo stesso valore.

Ecco un semplicissimo esempio di filtro passa basso in C++ che elabora il segnale un campione alla volta:

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

Qui è praticamente la stessa cosa, tranne che è passa alto:

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);
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top