Existe-t-il des formulaires de mise en œuvre standard pour les filtres Butterworth accordables?

17

L'une des façons standard de mettre en œuvre un filtre de Butterworth consiste à utiliser une cascade de sections de second ordre, chacune correspondant à une paire de pôles conjugués complexes. Pour un filtre de quatrième ordre, par exemple, il y aurait deux sections de second ordre. Si nous considérons comment les emplacements des pôles pour un filtre passe-bas changent dans le plan z lorsque la coupure est conçue pour près de 0 Hz à Nyquist, le chemin "balayé" par chaque paire de pôles correspond à une paire d'arcs à l'intérieur du cercle unitaire , comme illustré par la figure suivante [pour les filtres du quatrième ordre]:

Positions des pôles dans le plan Z pour les filtres passe-bas Butterworth du quatrième ordre

Compte tenu de la durée de vie de ces filtres et du fait que ces "arcs" correspondent à des lignes droites dans le plan s, il va de soi que quelqu'un aurait développé une forme d'implémentation avec un seul paramètre capable de balayer les pôles le long des arcs à "run time" [par opposition à "design time"]. Cependant, je n'ai encore rien vu de tel.

Il est relativement simple de trouver différentes façons de le faire, en particulier dans les segments de la plage, et avec une volonté d'y jeter un peu de calcul supplémentaire. Je me demande ce qui suit:

Existe-t-il un moyen standard de mettre en œuvre un filtre Butterworth [numérique] accordable d'un ordre donné qui 1) possède des propriétés optimales (par exemple efficacité, robustesse) et 2) couvre toute la gamme?

Ou est-ce vraiment un problème si facile que personne ne se soucie d'en parler? Si tel est le cas, il semble que cela apparaisse dans les programmes de conception de filtres à côté des options pour les conceptions "statiques".

J'ai trouvé ceci: un filtre Butterworth à usages multiples avec une fréquence de coupure variable , mais au début sur Google, il ne semble pas y avoir beaucoup d'informations sur ce qu'il contient.

Mise à jour (re: réponses)

Juste pour être un peu plus clair:

  • Je recherche un "méta-design" avec un paramètre (disons de [0,1]) qui ajustera automatiquement la coupure de DC à Nyquist (tout en gardant le gain normalisé) pour une utilisation dans un système variant dans le temps. Quelque chose comme ce résonateur bipolaire , sauf avec les contraintes de Butterworth. L'idée est que le calcul du paramètre serait plus efficace que l'exécution de la procédure de conception hors ligne typique lors de l'exécution.
  • Je ne cherche même pas nécessairement comment concevoir un "méta-filtre" (c'est-à-dire faire le calcul avec des variables au lieu de nombres), je me demande s'il y a des choix pour des formes d'implémentation standard [non évidentes] - parce que, disons, l'approche directe qui correspond au cas statique finit par avoir des problèmes numériques dans le cas variant dans le temps.
  • Peut-être n'y a-t-il pas de problèmes, et l'approche directe est celle qui est utilisée dans la pratique. Ce serait génial. Ma préoccupation est que je n'ai vu ce sujet mentionné explicitement dans aucune des sources que j'ai consultées, mais peut-être que j'ai juste raté quelque chose de vraiment évident, alors je demande.
  • Dans le processus d'ajouter plus de détails ici, j'ai rencontré un traitement général des structures biquad paramétriques, ce qui est presque ce que je recherche (et a de belles références).

Update 2

Je cherche des réponses comme celle que j'ai mise dans mon deuxième commentaire à Jason R, comme suit:

"Oh ouais, vous voulez utiliser la paramétrisation III-2b de la thèse de tel ou tel, sous forme de réseau à état tapé parce qu'elle résout tel ou tel cas de bord tout en utilisant le nombre minimal de multiplications."

Peut-être que rien de tel n'existe, mais ma question est de savoir si c'est le cas, et si oui, qu'est-ce que c'est ou où puis-je le trouver?

Cagnotte

Sur la base d'une référence à la «forme canonique de l'observateur» donnée par Tim Wescott dans le fil comp.dsp dans la réponse de Jason R , j'ai décidé de supposer que je devrais peut-être commencer à fouiller dans la littérature sur les systèmes de contrôle, j'ai donc essayé de faire une recherche de Butterworth "State Space" , et il s'est avéré le traitement suivant, très cool, de la conception / mise en œuvre, non seulement des filtres paramétriques Butterworth, mais aussi de Chebyshev et elliptiques:

Sophocles J. Orfanidis, "High-Order Digital Parametric Equalizer Design", J. Audio Eng. Soc., Vol. 53, p. 1026-1046, novembre 2005.

Cela va prendre un peu de temps à creuser, mais d'après ce que j'ai lu jusqu'à présent, je serais très surpris si ce n'est pas ce que je recherche. Je donne celui-ci à Jason R pour la référence comp.dsp qui m'a conduit au document Orfanidis. Sa réponse est également un bel aperçu pratique de la conception de filtres Butterworth.

datageist
la source

Réponses:

10

Je ne sais pas exactement ce que vous cherchez. Comme vous l'avez noté dans votre question, les fonctions de transfert de la famille de filtres Butterworth sont bien comprises et faciles à calculer analytiquement. Il est assez simple d'implémenter une structure de filtre Butterworth qui est ajustable par ordre de filtre et fréquence de coupure:

  1. En fonction de l'ordre du filtre sélectionné, de la fréquence de coupure et de la fréquence d'échantillonnage, calculez l'emplacement des pôles pour le filtre prototype analogique Butterworth. Étant donné que les filtres Butterworth n'ont pas de zéros, la fonction de transfert est déterminée par l'emplacement des pôles (et le gain CC).

  2. En utilisant la transformation bilinéaire , mappez les emplacements des pôles du prototype analogique à leurs emplacements correspondants dans votre réalisation numérique du filtre.

  3. Encore une fois, le filtre numérique est défini par les emplacements des pôles trouvés à l'étape 2. Divisez le filtre en sections de second ordre en regroupant les pôles par paires.

C'est ça. Comme je l'ai dit, il est simple de concevoir par programme un filtre Butterworth en utilisant tous les paramètres dont vous pourriez avoir besoin; aucune des opérations n'est terriblement compliquée à mettre en œuvre.

Edit: je ne suis pas vraiment sûr du résultat final que vous recherchez. Je pense que vous êtes plutôt intéressé par la façon de mettre en œuvre des filtres IIR avec des coefficients variant dans le temps, pas nécessairement spécifiques à un filtre Butterworth. Je suppose que votre objectif est de minimiser les artefacts lors du changement de la fréquence de coupure du filtre; cela a été couvert dans une discussion sur le groupe de discussion comp.dsp plus tôt cette année. Bien que je ne sois pas sûr de votre cas d'utilisation ou de vos exigences pour cette structure de filtre, il existe un certain nombre de façons d'effectuer la commutation.

Je sais que vous avez dit que vous aimeriez que votre filtre ait un seul paramètre qui définit la fréquence de coupure, mais le fait demeure que votre structure accordable doit avoir un moyen de traduire la fréquence de coupure aux coefficients requis (ou dans le cas Butterworth, juste le emplacements des pôles). Le processus que j'ai décrit ci-dessus est approprié pour générer les emplacements des pôles sur la base de la fréquence d'échantillonnage normalisée souhaitée.

Vous pouvez potentiellement simplifier le processus de calcul de l'emplacement des pôles en analysant la géométrie des emplacements des pôles du filtre numérique dans le plan z. Le filtre Butterworth analogique a des pôles qui se trouvent dans un demi-cercle dans la moitié gauche du plan s; la transformée bilinéaire mappe ce demi-cercle dans le motif d'apparence elliptique que vous avez illustré dans la description de votre question. En utilisant ce modèle connu pour les pôles du filtre Butterworth analogique, la fonction de mappage de la transformation bilinéaire et une certaine algèbre, vous pourrez peut-être trouver une expression relativement simple pour les emplacements des pôles du filtre numérique, vous donnant ainsi un filtre plus simple. action de réglage.

Jason R
la source
Jason, je ne cherche pas à concevoir une spécification Butterworth donnée, je cherche un "méta-design". Je mettrai à jour la question avec un peu plus de détails.
datageist
1
Re: Modifier. Le processus que vous avez décrit dans le dernier paragraphe est exactement la façon dont j'aborderais la question - je me demande simplement si cela a été couvert nulle part. En d'autres termes, des choses comme: "Oh oui, vous voulez utiliser la paramétrisation III-2b de la thèse de tel ou tel, sous forme de réseau à état tapé car elle résout tel ou tel cas de bord tout en utilisant le nombre minimal de multiplications. "
datageist
1
Petit commentaire pointilleux: dans le plan Z, le filtre BW a en effet des zéros. Pour les filtres passe-bas, ils sont tous à -1 et pour les filtres passe-haut, ils sont à +1.
Hilmar
s±ss0
2

Oui, il existe des formulaires d'implémentation standard pour Butterworth, et presque toutes les autres réponses de filtre. Ils sont tous entièrement implémentés dans ma bibliothèque de filtres IIR open source. Voici un extrait de code qui produit les paires pôle / zéro pour un filtre Butterworth de degré arbitraire:

void AnalogLowPass::design (int numPoles)
{
  if (m_numPoles != numPoles)
  {
    m_numPoles = numPoles;

    reset ();

    const double n2 = 2 * numPoles;
    const int pairs = numPoles / 2;
    for (int i = 0; i < pairs; ++i)
    {
      complex_t c = std::polar (1., doublePi_2 + (2 * i + 1) * doublePi / n2);
      addPoleZeroConjugatePairs (c, infinity());
    }

    if (numPoles & 1)
      add (-1, infinity());
  }
}

Comme vous pouvez le voir, la position des pôles est calculée en subdivisant le plan s en "paires" de segments égaux.

Un code approprié est fourni pour tous les types courants de réponses de filtre: Chebyshev, Elliptic, Legendre, y compris les versions en rayon de chacun.

https://github.com/vinniefalco/DSPFiltersDemo.git

https://github.com/vinniefalco/DSPFilters.git

Capture d'écran

Vinnie Falco
la source
La bibliothèque DSPFilters traite directement le cas d'utilisation envisagé par la question d'origine, en utilisant une équation paramétrée pour calculer les paires pôle / zéro d'un filtre numérique au moment de l'exécution. Je modifierai la réponse pour inclure également un extrait de code source.
Vinnie Falco