Pergunta

Os softwares de edição e processamento de gráficos e áudio geralmente contêm funções chamadas "Filtro passa-alto" e "Filtro passa-baixo".Exatamente o que eles fazem e quais são os algoritmos para implementá-los?

Foi útil?

Solução

Wikipédia:

Esses termos "alto", "baixo" e "banda" referem-se a frequências.No passa-alto, você tenta remover as frequências baixas.No passa-baixo, você tenta remover o alto.No passa-banda, você permite apenas que uma faixa de frequência contínua permaneça.

A escolha da frequência de corte depende da sua aplicação.A codificação desses filtros pode ser feita simulando circuitos RC ou brincando com as transformadas de Fourier de seus dados baseados em tempo.Consulte os artigos da Wikipedia para exemplos de código.

Outras dicas

Aqui está como você implementa um filtro passa-baixa usando convolução:

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

Observe que o exemplo é extremamente simplificado.Ele não faz verificações de intervalo e não trata as bordas corretamente.O filtro usado (box-car) é um filtro passa-baixa particularmente ruim, porque causará muitos artefatos (toque).Leia sobre design de filtro.

Você também pode implementar os filtros no domínio da frequência.Aqui está como você implementa um filtro passa-alta usando 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);

Novamente, isso é simplificado, mas essa é a ideia.O código não parece tão complicado quanto a matemática.

Geralmente são circuitos elétricos que tendem a transmitir partes de sinais analógicos.O passa-alto tende a transmitir mais partes de alta frequência e o passa-baixo tende a transmitir mais partes de baixa frequência.

Eles podem ser simulados em software.Uma média ambulante pode atuar como um filtro passa-baixa, por exemplo, e a diferença entre uma média ambulante e sua entrada pode funcionar como um filtro passa-alta.

Passa-alta filtrar permite alto-frequência (informações detalhadas/locais) passar.
Passa-baixo filtrar permite baixo-frequência (informações grosseiras/ásperas/globais) passar.

A filtragem descreve o ato de processar dados de uma forma que aplica diferentes níveis de atenuação a diferentes frequências nos dados.

Um filtro passa-alta aplicará atenuação mínima (ou seja,deixar os níveis inalterados) para altas frequências, mas aplica atenuação máxima para baixas frequências.

Um filtro passa-baixo é o inverso - ele não aplicará atenuação às baixas frequências, mas aplicará atenuação às altas frequências.

Existem vários algoritmos de filtragem diferentes que são usados.Os dois mais simples são provavelmente o filtro Finite Impulse Response (também conhecido como.filtro FIR) e o filtro de resposta ao impulso infinito (também conhecido como.Filtro IIR).

O filtro FIR funciona mantendo uma série de amostras e multiplicando cada uma dessas amostras por um coeficiente fixo (que se baseia na posição na série).Os resultados de cada uma dessas multiplicações são acumulados e constituem a saída dessa amostra.Isso é conhecido como Multiply-Accumulate - e em hardware DSP dedicado há uma instrução MAC específica para fazer exatamente isso.

Quando a próxima amostra é coletada, ela é adicionada ao início da série, e a amostra mais antiga da série é removida e o processo é repetido.

O comportamento do filtro é determinado pela seleção dos coeficientes do filtro.

Um dos filtros mais simples frequentemente fornecidos por software de processamento de imagem é o filtro de média.Isso pode ser implementado por um filtro FIR definindo todos os coeficientes do filtro com o mesmo valor.

Aqui está um exemplo super simples de filtro passa-baixo em C++ que processa o sinal, uma amostra por vez:

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

Aqui é praticamente a mesma coisa, exceto que é passa-alta:

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);
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top