Estou com dificuldade para encontrar documentação para implementar o filtro passa-banda ou passa-alto com python / scipy / numpy.
Porém, posso criar e aplicar facilmente um filtro passa-baixo, então pergunto:
Seria conceitualmente correto filtrar um sinal com passa-baixo e subtrair o resultado do sinal original, para obter apenas as altas frequências?
Além disso, se alguém tiver um exemplo simples de um filtro passa-banda ingênuo em Python (preferencialmente usando as bibliotecas numpy e scipy), ficaria muito grato.
O que eu procuro é algo como:
filtered_signal = band_pass(original_signal, rate, low=20, high=500)
Obrigado por qualquer ajuda!
EDIT: com scipy, estou usando isso como passa-baixo, com bons resultados:
import numpy, scipy.signal
def firfilt(interval, freq, sampling_rate):
nfreq = freq/(0.5*sampling_rate)
taps = sampling_rate + 1
a = 1
b = scipy.signal.firwin(taps, cutoff=nfreq)
firstpass = scipy.signal.lfilter(b, a, interval)
## second pass to compensate phase delay
secondpass = scipy.signal.lfilter(b, a, firstpass[::-1])[::-1]
return secondpass
python
bandpass
highpass-filter
heltonbiker
fonte
fonte
scipy.signal.firwin
mostra como criar filtros passa-baixo, passa-alto, passa-banda, pára-banda e multibanda. Você tentoufirwin(taps, cutoff=nfreq, pass_zero=False)
?Respostas:
Em teoria, você pode fazer isso, mas na prática é difícil, porque o alinhamento de tempo e fase deve ser muito bom para que funcione. Se o alinhamento for bom, você receberá a interferência destrutiva que está buscando. Caso contrário, você obterá alguma interferência construtiva. Pior ainda, se eles são interferentes de maneira destrutiva ou construtiva, dependerá da frequência - ou seja, você pode obter interferência construtiva e destrutiva ao mesmo tempo. Pode funcionar, no entanto, se você estiver filtrando apenas frequências razoavelmente baixas, pois os requisitos de tempo são os mais fracos, porque mudam muito lentamente.
Breve história - é possível, mas é difícil o suficiente para que geralmente faça sentido apenas fazer um filtro passa-alto.
Uma maneira relativamente simples de criar um filtro passa-banda é criar um filtro passa-baixo e modulá-lo para a frequência central desejada, multiplicando-o por um sinusóide dessa frequência.
fonte
Você pode projetar os diferentes tipos de filtro diretamente com as funções scipy.signal. Existem três funções principais para criar filtros de resposta de impulso finito com o pacote scipy.signal.
A função remez , como argumentos, recebe o número de toques (ordem + 1), as "bandas" e o ganho "desejado". As "bandas" estão em Hz. Essa função é um pouco estranha porque o parâmetro "Hz" define a taxa de amostragem em Hz. Um exemplo seria:
Nota: Eu trapacei um pouco e usei uma FFT de ordem superior para fazer o gráfico parecer um pouco melhor (interpolou os pontos apenas para visualização).
Exemplos de passa-baixo e passa-alto:
A função firwin pega novamente o número de torneiras e o ponto de corte como argumentos. O ponto de corte pode ter vários valores como uma lista para definir filtros de passagem de banda e parada de banda. As unidades padrão para o corte são a frequência normalizada, em que o corte nyquist é 1 e a taxa de amostragem seria 2. Isso pode ser modificado pela configuração / nyq /. Usando os exemplos acima, o firwin seria chamado como:
O firwin2 está mais próximo da função remez. Mas, em vez de passar ganhos para as bandas, você passa ganhos nos pontos de corte.
Mais exemplos disponíveis aqui
fonte
firwin
, e seu invólucrobutter
é o que estou usando agora. Obrigado!Você indicou que está tendo problemas para descobrir como projetar um filtro passa-alto adequado. Um método é primeiro projetar um protótipo de filtro passa-baixo e depois aplicar uma transformação que deforma a resposta do filtro em um filtro de outro tipo (como um filtro passa-alto ou passa-banda). Isso é feito substituindo uma expressão por na função de transferência do filtro lowpass do protótipo. Aqui estão alguns links para informações sobre o tópico:z−1
http://www.mathworks.com/help/toolbox/dsp/ug/bsva1v1.html
http://www.ingelec.uns.edu.ar/pds2803/Materiales/Articulos/Constantinides.pdf
http://cnx.org/content/m12759/latest/
Especificamente, para uma transformação de passagem baixa para passagem alta, você pode aplicar a seguinte substituição:
α=cos ( 1
whereωc ω′c
fonte