J'ai du mal à trouver de la documentation pour implémenter un filtre passe-bande ou passe-haut avec python / scipy / numpy.
Je peux facilement créer et appliquer un filtre passe-bas, donc je demande:
Serait-il conceptuellement correct de filtrer passe-bas un signal, puis de soustraire le résultat du signal d'origine, afin d'obtenir uniquement les hautes fréquences?
De plus, si quelqu'un a un exemple simple d'un filtre passe-bande naïf en Python (utilisant de préférence les bibliothèques numpy et scipy), je serais très reconnaissant.
Ce que je recherche, c'est quelque chose comme:
filtered_signal = band_pass(original_signal, rate, low=20, high=500)
Merci pour toute aide!
EDIT: avec scipy, je l'utilise comme passe-bas, avec de bons résultats:
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
la source
la source
scipy.signal.firwin
explique comment créer des filtres passe-bas, passe-haut, passe-bande, coupe-bande et multi-bandes. As-tu essayéfirwin(taps, cutoff=nfreq, pass_zero=False)
?Réponses:
En théorie, vous pouvez le faire, mais en pratique, c'est difficile à faire car l'alignement de temps et de phase doit être assez bon pour que cela fonctionne. Si l'alignement est bon, vous obtiendrez l' interférence destructrice que vous recherchez. S'ils ne le sont pas, vous obtiendrez une interférence constructive. Pire encore, qu'elles interfèrent de manière destructrice ou constructive, cela dépendra de la fréquence, c'est-à-dire que vous pouvez obtenir à la fois des interférences constructives et destructives. Cela peut fonctionner, cependant, si vous ne filtrez que des fréquences assez basses, car leurs exigences de synchronisation sont les plus lâches car elles changent si lentement.
Petite histoire - il est possible de le faire mais est suffisamment difficile pour qu'il soit généralement logique de simplement faire un filtre passe-haut.
Un moyen relativement simple de créer un filtre passe-bande consiste à créer un filtre passe-bas, puis à le moduler à la fréquence centrale souhaitée en le multipliant par une sinusoïde de cette fréquence.
la source
Vous pouvez concevoir les différents types de filtres directement avec les fonctions scipy.signal. Il existe trois fonctions principales pour créer des filtres à réponse impulsionnelle finie avec le package scipy.signal.
La fonction remez , comme arguments, prend le nombre de taps (ordre + 1), les "bandes" et le gain "souhaité". Les "bandes" sont en Hz. Cette fonction est un peu étrange que le paramètre "Hz" définit la fréquence d'échantillonnage en Hz. Un exemple serait:
Remarque: J'ai triché un peu et utilisé une FFT d'ordre supérieur pour rendre l'intrigue un peu plus agréable (interpolé les points pour la visualisation uniquement).
Exemples passe-bas et passe-haut:
La fonction firwin prend à nouveau le nombre de taps et la coupure comme arguments. La coupure peut être constituée de plusieurs valeurs sous forme de liste pour définir les filtres passe-bande et bande d'arrêt. Les unités par défaut pour la coupure sont la fréquence normalisée où la coupure nyquist est 1 et la fréquence d'échantillonnage serait 2. Cela peut être modifié en définissant / nyq /. En utilisant les exemples ci-dessus, le firwin serait appelé comme:
Le firwin2 est plus proche de la fonction remez. Mais au lieu de passer des gains pour les bandes, vous passez des gains aux seuils.
Plus d'exemples disponibles ici
la source
firwin
et son enveloppebutter
sont ce que j'utilise maintenant. Merci!Vous avez indiqué que vous rencontrez des difficultés à déterminer comment concevoir un filtre passe-haut approprié. Une méthode consiste à concevoir d'abord un prototype de filtre passe-bas, puis à appliquer une transformation qui déforme la réponse du filtre en un filtre d'un autre type (tel qu'un filtre passe-haut ou passe-bande). Cela se fait en substituant une expression àz- 1 dans la fonction de transfert du prototype de filtre passe-bas. Voici quelques liens vers des informations sur le sujet:
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/
Plus précisément, pour une transformation passe-bas en passe-haut, vous pouvez appliquer la substitution suivante:
oùωc est la fréquence de coupure du prototype de filtre passe-bas et ω′c est la fréquence de coupure résultante dans le filtre passe-haut transformé. Il y a quelques exemples donnés dans la documentation MATLAB montrée dans le premier lien; des fonctions similaires peuvent être disponibles dans SciPy. Cela dit, la plupart des fonctions de conception de filtres dans cette bibliothèque suivent de près l'exemple de MATLAB, et elles sont capables de concevoir des filtres de tous les principaux types (passe-bas, passe-haut, etc.) avec très peu d'effort.
la source