pure_data_drum_machine

Pure data >> Simple Drum Machine (acessado em 17/06/2024)

Filtro Butterworth

Implementação de filtros usando Matlab/Octave

O Matlab/Octave fornece funções integradas para projetar quatro tipos básicos de filtros, conforme mostrado na figura abaixo:

3-DigitalFilters-apracticalguide_pdf

A função de projeto de filtro mais simples de usar é a função butter(), em homenagem ao engenheiro britânico Stephen Butterworth (1885–1958).

Conforme mostrado no código abaixo, a função manteiga recebe três parâmetros de entrada (o tipo de filtro, a ordem e a frequência de corte – explicado mais adiante) e retorna os coeficientes e que descrevem o sistema discreto, que podem então ser usados para filtrar um sinal.

Exemplo:

Os três parâmetros de entrada da função (ordem (valor = 1), frequência de corte (valor = 0,2) e tipo (valor = 'low')) são explicados posteriormente, mas vale a pena notar que uma única linha de código é tudo que você precisa para projetar um filtro.

Cujo gráfico de resposta espectral pode ser visto adiante:

freqz_butter1.png

A linha de código a seguir mostra um exemplo de filtragem de um sinal, onde a entrada do filtro é uma sequência de números aleatórios criados usando a função rand integrada.

A primeira linha criará a variável que contém 20.000 números aleatórios com um valor entre 0 e 1. A segunda linha usa a função filter() para filtrar o sinal usando os coeficientes e retornados pela função butter() usada antes.

ruido_rand.png

Pode ser interessante ouvir a entrada e a saída. Se você usar o código abaixo, ouvirá que as altas frequências foram removidas.

Deve ter sido gerado algo como: @ 10 KHz:

;

Sinal fittrado, @ 10 KHz:

;

Resumidamente os três parâmetros servem para:

Teste: Experimente executar o seguinte código sobre o vetor calculado anteriormente:

O som gerado deve ser semelhante à: @ 10 KHz:

;

Curiosidades

A título de curiosidade, a voz masculina oscila nas frequências entre 250 à 700 Hz e a voz feminina, de 550 à 1000 Hz.

Uma bateria é composta de:

sons_bateria

Onde: \1. Prato de condução (Ride) \2. Surdo \3. Tom 1 e Tom 2 \4. Bumbo \5. Caixa \6. Chimbal (Hit-hat) \7. Prato de Ataque (Crash)

Em especial:

Bumbo:

Caixa

Tom-tons

Pratos/Overheads

Ref.: 11 Passos para mixar bateria como um profissional (acessado em 17/06/2024).

Outras classificações para faixas de aúdio:

CategoriaFaixa Frequencial
Infrasom< 20 Hz
Subgraves20 Hz ~ 60 Hz
Graves60 Hz ~ 100 Hz
Médio-graves101 Hz ~ 200 Hz
Médios201 Hz ~ 3 KHz
Agudos3 KHz ~ 20 KHz
Ultrassom> 20 KHz

Ordem do filtro

Se você executou o código [b a] = butter(1, 0.2,'low'); você descobrirá que os coeficientes são [0,2452 0,2452] e os coeficientes são [1 -0,5095]:

Isto corresponde à função transferência:

Ou a seguinte equação de diferença e ao diagrama de fluxo de sinal mostrados abaixo:

butter1_fluxo_sinal

O código [b a] = butter(1, 0.2,'low'); projeta um filtro de primeira ordem, onde a ordem (primeiro parâmetro) está associada ao número de coeficientes e retornados pela função. Se a ordem for 1, então existem 2 coeficientes e 2 coeficientes . Se a ordem for 2, então existem 3 coeficientes e 3 coeficientes . Em geral, se a ordem for , existem coeficientes para e .

A ordem do filtro afeta a taxa de “roll-off” do filtro, com filtros de ordem superior tendo uma taxa de roll-off mais rápida, conforme mostrado na figura abaixo. A taxa de roll-off refere-se à rapidez com que a resposta de frequência vai de alta para baixa, ou a inclinação da curva na resposta de magnitude:

butter1_roll_off_bode

Você deve notar que todos os três filtros passam pelo mesmo ponto, em 0,2π radianos por amostra, que é a frequência de corte para todos os três filtros (o código usado para criar o gráfico é mostrado abaixo). O filtro de ordem superior reduz as frequências mais altas de forma mais significativa e também preserva as frequências mais baixas em maior extensão, e em muitos casos este tipo de resposta é desejável, ou seja, mantendo as frequências baixas inalteradas enquanto reduz significativamente as frequências altas. No entanto, filtros de ordem superior requerem mais cálculos (mais adições e multiplicações) para serem implementados e podem levar mais tempo para serem executados em um computador (ou microcontrolador). Os projetistas de filtros digitais geralmente tentam determinar o filtro de ordem mais baixa para obter o efeito desejado

Outra razão para usar um filtro de ordem inferior é porque filtros com uma taxa de roll-off mais lenta têm uma resposta transitória mais rápida.

Para certas aplicações é desejável uma resposta transitória rápida. Um problema que surge frequentemente é que uma taxa de roll-off rápida também é desejável e o projetista do filtro está frequentemente procurando o melhor compromisso entre uma taxa de roll-off e uma resposta transitória. Infelizmente, é impossível ter uma taxa de roll-off rápida e uma resposta transitória rápida, uma vez que aumentar uma inevitavelmente diminui a outra.

Frequência de corte (normalizada)

O segundo parâmetro de função no código [b a] = butter(1, 0.2,'low'); especifica a frequência de corte do filtro, que neste caso é um valor de 0,2. Se o valor da frequência de corte for aumentado, uma faixa mais ampla de componentes de baixa frequência passará pelo filtro passa-baixa.

A frequência de corte sempre tem um valor entre 0 e 1, onde 0 corresponde a 0 Hz e 1 corresponde à frequência de Nyquist, que é metade da frequência de amostragem do sinal que você está filtrando. Os gráficos abaixo mostram a resposta de frequência de dois filtros Butterworth de 12ª ordem com frequências de corte de 0,4 e 0,65. Observe como a resposta de frequência associada à frequência de corte de 0,65 permitirá que uma faixa maior de frequências passe pelo filtro relativamente inalterada. Observe também que a transição da curva de resposta em frequência de um valor de 1 para um valor de zero está na região de 0,45 e 0,65 para as curvas azul e vermelha, respectivamente.

butter1_resp_freqs.png

Mais especificamente, a frequência de corte especifica o ponto em que a curva passará por um valor de 0,7071 = 1/√2, o que equivale a aproximadamente -3 dB (20log10(1/√2) = - 3,0103). Por esta razão, a frequência de corte também é frequentemente referida como frequência de 3 dB. Isso pode ser visto mais claramente no gráfico abaixo (também mostrado anteriormente), que mostra a resposta de magnitude de filtros de ordem diferente, todos passando pelo mesmo ponto com uma magnitude de 0,7071 e frequência de 0,2 radianos por amostra.

butter1_roll_off_bode

É útil observar que os filtros digitais não são projetados para funcionar apenas em uma frequência de amostragem específica. Assim, para dois cenários muito diferentes, o mesmo filtro poderia ser usado para obter o efeito desejado. Por exemplo, considere uma situação em que um ECG (sinal cardíaco), amostrado em 120 Hz, foi corrompido por ruído de 50 Hz e uma segunda situação em que um sinal de fala amostrado em 32 kHz tem um artefato perceptualmente irritante em 13 kHz.

Para ambas as situações, o mesmo filtro digital pode melhorar a qualidade do sinal, conforme mostrado no código abaixo. Isso ocorre porque o artefato/ruído em ambos os sinais ocorre na mesma região em relação à taxa de Nyquist (que é metade da taxa de amostragem), ou seja, 50/60 = 0,8333 para o sinal de ECG e 13.000/16.000 = 0,8125 para o sinal de fala. Este fato pode parecer estranho para aqueles com experiência em filtros analógicos, já que para o caso analógico seriam necessários componentes de filtro completamente diferentes em ambas as situações. Quando você começa a pensar sobre isso, um filtro digital é apenas uma sequência de multiplicações e adições e o conhecimento da taxa de amostragem não é necessário para implementar o filtro (o comportamento dos componentes dos filtros elétricos analógicos, como capacitores e indutores, dependem da frequência).

Repositório de arquivos Wav:

  1. SampleSwap: O SampleSwap é uma comunidade de compartilhamento de samples e oferece algumas respostas ao impulso para ambientes reais. Site:https://sampleswap.org.

Exemplo 1: Filtrando o sinal de ECG: Arquivo: noisy_ecg.txt.

sinal_ECG_butter_low_50Hz_15a.png

Neste caso, o filtro parece que não atingiu os propósitos, mas se por acaso, baixamos um pouco a freq. de corte de 42 Hz para 50 Hz, teremos:

sinal_ECG_butter_low_42Hz_15a.png

Exemplo 2: Filtrando sinal de voz com ruídos: Arquivos disponíveis: Apollo_11_launch.wav.mp3.

Compare:

Note que o interessante aqui seria plotar as respostas espectrais de cada sinal para comparar e entender melhor o impacto dos diferentes filtros.

Você pode tentar aplicar este filtros em outro arquivo de voz: Martin-Luther-King-I-Have-A-Dream.mp3.mp3 ou apollo10-see-you-on-other-side.mp3.mp3.

Casualmente, podemos observar a resposta espectral dos últimos filtros implementados:

filtros_voz_250_700_5a.png

Frequência Normalizada

Quando se trabalha com filtros digitais, a frequência é normalmente expressa em unidades de radianos por amostra, em vez de frequência em Hertz (ou radianos por segundo).

Ao trabalhar com filtros digitais, a frequência é normalmente expressa em unidades de radianos por amostra, em vez de frequência em Hertz (ou radianos por segundo).

Para se familiarizar mais com esta forma de expressar frequência pode ser útil consultar alguns exemplos. As formas de onda senoidais plotadas abaixo têm uma frequência de π/4 radianos por amostra e π/16 radianos por amostra – observe que os pontos de amostra são mostrados como pontos vermelhos e a linha azul é apenas uma curva ajustada (interpolada) entre as amostras para fazer é mais fácil visualizar as formas de onda.

frequencia_normalizada_conceito

Note que existem 2π radianos em um ciclo completo (um período) de uma forma de onda senoidal, portanto, para a senóide de frequência π/4 radianos por amostra, são necessárias 8 amostras para completar um ciclo e para a senóide de frequência π/16 amostras por ciclo são necessárias 32 amostras.

Você pode estar se perguntando qual é a frequência das senóides mostradas anteriormente em unidades de Hertz (a maioria das pessoas se sente mais confortável com unidades de Hertz do que com radianos por amostra!). A resposta a esta pergunta é “Depende da taxa de amostragem!”. A taxa de amostragem determina a duração do tempo entre as amostras (ou seja, o intervalo de amostragem que é igual ao recíproco da taxa de amostragem), portanto, se uma forma de onda senoidal leva 8 amostras para completar um ciclo e a taxa de amostragem é de 10 Hz, então o tempo para completar um ciclo dura 0,8 segundos, o que significa que a frequência da forma de onda senoidal é 1/0,8 = 1,25 Hz. É muito importante compreender que para expressar o conteúdo de frequência de um sinal em Hertz é necessária a taxa de amostragem usada para capturar o sinal.

Você deve ter notado que os gráficos no domínio da frequência mostrados anteriormente têm um eixo de frequência com um intervalo de 0 a frequência de Nyquist ou de 0 a 1. A razão pela qual o limite superior é a frequência de Nyquist (que é igual à metade da frequência de amostragem) é porque quaisquer frequências acima da frequência de Nyquist sofreriam um fenômeno conhecido como aliasing. Este fenômeno de aliasing geralmente não é desejável e as frequências acima da frequência de Nyquist são geralmente consideradas insignificantes antes que um sinal seja amostrado. Por esta razão, a faixa de frequência de interesse é normalmente de 0 até a frequência de Nyquist.

Quando a faixa do eixo de frequência for de 0 a 1, você notará que as unidades são mostradas como sendo π radianos por amostra. O componente de frequência mais alto é, portanto, π radianos por amostra (também, a frequência mais baixa é 0 radianos por amostra e um componente de frequência no meio do eixo de frequência equivaleria a π/2 radianos por amostra). O gráfico abaixo mostra uma forma de onda senoidal de frequência π radianos por amostra, que você notará que tem duas amostras por ciclo.

A forma de onda senoidal tem uma frequência de metade da taxa de amostragem (por exemplo, se a frequência de amostragem fosse 100 Hz, a duração entre as amostras seria de 0,01 segundos. Como há duas amostras por ciclo, o período é de 0,02 segundos e a frequência é, portanto, 1/0,02 = 50Hz). Pode-se, portanto, ver que a frequência de Nyquist (metade da taxa de amostragem) é equivalente a π radianos por amostra:

frequencia_normalizada_conceito_2

Note que em muitos livros didáticos e recursos on-line, a faixa de frequências ao longo de um eixo de frequência geralmente mostra uma faixa de 0 a π, com unidades de radianos por amostra (em vez de uma faixa de 0 a 1 com unidades de π radianos por amostra).

Outros tipos de filtros

A função butter() é a mais fácil de usar porque requer menos parâmetros. Existem funções alternativas que podem atingir uma taxa de roll-off mais alta para o mesmo filtro requerido. No entanto, essas alternativas (filtros Chebyshev e filtros Elípticos) têm o que chamamos de “ondulação” (ripple) na banda passante e/ou banda de parada, conforme mostrado nos gráficos abaixo:

outros_filtros

Os filtros Butterworth não têm “ripple” nem na banda passante nem na banda de corte e são chamados de “maximamente planos”. Cabe ao designer do filtro determinar se a ondulação pode ser tolerada ou não e isso realmente depende da aplicação (para algumas aplicações a ondulação pode ser aceitável, para outras não). O que é importante observar é que você pode obter uma taxa de roll-off mais rápida para um filtro de ordem inferior, mas isso tem um custo de ondulação na banda passante e/ou na banda de parada. O filtro Chebyshev atua a uma taxa mais rápida do que o filtro Butterworth, mas apresenta ondulação na banda passante. O filtro elíptico atua mais rapidamente do que Chebyshev, mas apresenta ondulação tanto na banda passante quanto na banda final.

🎧


🌊 Fernando Passold 📬 ,