Question:
Filtre passe-bande pour isoler la note de musique "A2"
user664939
2011-12-29 22:18:32 UTC
view on stackexchange narkive permalink

Je voudrais concevoir un filtre passe-bande pour isoler la note de musique A2 (110Hz) de ses notes voisines avec une précision d'un demi-pas. Cela signifie que G2 # = 103.83Hz et A2 # = 116.54Hz devraient être dans la bande d'arrêt.

Dans l ' idéal cas, 110Hz serait à un gain de 0. G2 # et A2 # seraient silencieux (gain négatif infini?), Et il y aurait un roll-off en douceur de l'A2 vers chaque note voisine.

Comment puis-je sélectionner mon type de fenêtre, déterminer combien de coefficients sont nécessaires, et calculer ces coefficients?

J'ai suivi quelques cours d'EE au collège, mais je suis loin d'être un ingénieur électricien, alors demandez des précisions où il se trouve nécessaire.

Références:

Voulez-vous finalement faire passer cette fréquence ou simplement détecter sa présence / son amplitude?
@ChrisStratton: Pour l'instant, je veux juste vérifier son amplitude. Finalement, je pourrais vouloir déterminer d'autres qualités du signal à cette fréquence également.
cherchez-vous à créer un filtre numérique dans un DSP ou un circuit analogique?
Cinq réponses:
#1
+9
Olin Lathrop
2011-12-29 22:44:04 UTC
view on stackexchange narkive permalink

Si je comprends bien, vous souhaitez détecter l'amplitude du composant 110 Hz avec une bande passante inférieure à la 12ème racine de 2 de chaque côté. Les notes adjacentes qui ne devraient pas être détectées sont 103,8 Hz et 116,5 Hz, soit environ 6% de réduction par rapport à la fréquence centrale.

Premièrement, c'est un filtre très serré. Cela ne se produira pas avec l'électronique analogique, du moins pas dans la bande de base.

Vous pouvez le faire numériquement en échantillonnant le signal d'entrée composite et en le multipliant par le sin et le cos de 110 Hz. Filtre passe-bas chacun de ces produits afin que 6 Hz soit atténué au niveau auquel vous voulez atténuer les notes adjacentes. Mettez ensuite au carré chacun des résultats et additionnez-les. Ce nombre unique sera le carré de l'amplitude récente de tout composant de 110 Hz dans le signal d'entrée. Gardez à l'esprit que puisque ce filtre a une bande passante très étroite, il répondra lentement. Il faudra quelques 100 ms pour stabiliser à partir d'un pas dans l'amplitude d'entrée de 110 Hz.

Si vous voulez juste détecter que la composante de 100 Hz est au-dessus d'un certain seuil, vous pouvez utiliser la valeur d'amplitude au carré directement. Si vous avez besoin de l'amplitude réelle, vous devrez alors prendre la racine carrée du résultat.

J'ai fait quelque chose de similaire pour détecter des fréquences DTMF individuelles dans un signal DTMF. Les fréquences, la bande passante et donc les constantes de temps sont différentes, mais l'algorithme est identique. Voici un résultat montrant la valeur au carré de l'amplitude que j'ai décrite ci-dessus pour trois fréquences DTMF successives avec l'algorithme configuré pour détecter celle du milieu:

Voici l'extrait de code qui a parcouru chaque échantillon d'entrée pour produire la magnitude au carré (MAGSQ) et la grandeur réelle (MAG):

 pour sampn: = 0 à nsamp do begin {une fois pour chaque échantillon d'entrée} t: = sampn * sampdt; {prendre l'heure de cet échantillon} samp: = getsamp (t); {obtenir un échantillon d'entrée} r: = t * freq; {faire la phase de fréquence de référence} ii: = trunc (r); r: = r - ii;
r: = r * pi2; prods: = samp * sin (r); {mélange par ref fréquence sinus et cosinus} prodc: = samp * cos (r); filtre (filts, prods); {résultats du mélangeur de filtre passe-bas} filtre (filtc, prodc); magsq: = sqr (filts.val) + sqr (filtc.val); {calculer un carré de grandeur} magsq: = magsq * 4.0; {normaliser pour que l'entrée 1.0 donne 1.0} mag: = sqrt (magsq); {calculer une magnitude linéaire} 

Le sous-programme FILTER effectue un filtre passe-bas bipolaire de la manière habituelle. Chaque pôle suit l'algorithme standard:

FILT <-- FILT + FF (NOUVEAU - FILT)

Dans ce cas, FF est 1/128. Comme il s'agit d'une puissance entière de deux (-7 dans ce cas), il pourrait être effectué dans un microcontrôleur par un décalage à droite de 7 bits.

Je pense que le CI de décodeur de tonalité LM567 utilise essentiellement cette technique. http://www.ti.com/lit/ds/symlink/lm567.pdf
#2
+2
Russell McMahon
2011-12-30 01:25:50 UTC
view on stackexchange narkive permalink

Comme l'a noté Olin - la bande passante est très étroite pour l'analogique. Très.

Une PLL pourrait bien relever le défi.

Cela semble vraiment un travail pour un amplificateur de verrouillage. Ce qui est sans doute proche d'une forme matérielle de la DFT suggérée.

Voir la fin de la superbe note d'application Jim Williams ..


Verrouiller les amplificateurs:

Présentation utile de Princeton

Tout le verrouillage FPGA numérique dans l'amplificateur Projet Princeton. Bien. Verilog.

Implémentation Labview - bien. Beaucoup de matériel de soutien et de liens. Excellente performance.

Notes universitaires relatives à un cours - du matériel utile.

Voici une note d'application datant de 26 ans du regretté Jim Williams qui PEUT sois exactement ce que tu veux. Applications pour un bloc fonctionnel d'instrumentation à condensateur commuté.

Voir la figure 4 et le texte aux pages AN3-3 et An3-4. Si cela semble avoir une valeur potentielle, vous voudrez probablement regarder beaucoup d'autres exemples donnés.

La question de savoir si cela s'applique dépend en partie du fait que vous avez accès à la source A2 qui a créé l'A2 qui est mélangé avec autre signal. Si vous le faites, cela fonctionne à merveille - vous avez un "Homodyne". Sinon, vous pouvez utiliser un A2 généré localement pour le pilote du hacheur (la broche 16 alimente le LTC1043) mais vous n'avez pas de cohérence de phase. Les résultats PEUVENT être encore utiles. Fiche technique LTC1043 - en stock pour 5,70 $ US en 1 chez Digikey. C'est DIP18. Egalement disponible en SOIC18.

enter image description here

Ils disent:

Ampli fi cateur verrouillable L'approche de porteuse CA utilisée dans la figure 3 peut être étendue pour former un «verrouillage» ampli fi cateur. Un ampli fi cateur à verrouillage fonctionne en détectant de manière synchrone la sortie modulée en porteuse de la source de signal. Du fait que les informations de signal souhaitées sont contenues dans la porteuse, le système constitue un amplificateur à bande extrêmement étroite. Les composants non liés à la porteuse sont rejetés et l'ampli fi cateur ne transmet que des signaux cohérents avec la porteuse. En pratique, les ampli fi cateurs verrouillables peuvent extraire un signal 120 dB en dessous du niveau de bruit

La Figure 4 montre un ampli fi cateur verrouillable qui utilise une seule section LTC1043. Dans cette application, la source du signal est un pont de thermistance qui détecte des changements de température extrêmement faibles dans une chambre de réaction de microcalorimétrie biochimique.

La porteuse 500Hz est appliquée à l'entrée de T1 (trace A, figure 5). La sortie flottante de T1 pilote le pont de thermistance, qui présente une sortie asymétrique vers A1. A1 fonctionne à un gain CA de 1 000. Une source de bruit à large bande de 60 Hz est également délibérément injectée dans l’entrée de A1 (trace B). Les passages par zéro du transporteur sont détectés par C1. La sortie de C1 synchronise le LTC1043 (Trace C). La sortie de A1 (Trace D) montre le signal 500Hz souhaité enfoui dans la source de bruit 60Hz. La commutation synchronisée par zéro du LTC1043 à l'entrée positive de A2 (Trace E) fait alterner le gain de A2 entre plus et moins un. En conséquence, la sortie de A1 est démodulée de manière synchrone par A2. La sortie de A2 (trace F) est constituée d’un signal porteur démodulé et de composants non cohérents. Les informations d’amplitude et de polarité de porteuse souhaitées sont discernables dans la sortie de A2 et sont extraites par moyennage du filtre en A3. Pour couper ce circuit, ajustez le potentiomètre de phase de sorte que C1 commute lorsque la porteuse passe par zéro

LT, AN3, juillet 1985:

http: //cds.linear .com / docs / Application% 20Note / an03f.pdf

#3
+2
JustJeff
2011-12-31 08:33:18 UTC
view on stackexchange narkive permalink

Il existe quelque chose qui s'appelle «l'algorithme de Goertzl», qui est souvent utilisé dans les DSP pour détecter des fréquences uniques dans un signal de domaine temporel, par exemple pour détecter les tonalités DTMF. Il s'agit essentiellement d'une transformée de Fourier discrète optimisée, mais elle est très simple à programmer. Google vous fournira de nombreux exemples si vous êtes intéressé.

#4
+2
Connor Wolf
2011-12-31 15:18:13 UTC
view on stackexchange narkive permalink

Remarque: je publie ceci davantage comme un FYI, car les composants requis devraient être fabriqués sur mesure et être ridiculement chers.

C'est vraiment plus une expérience de réflexion.


Ceci est assez facilement possible en analogique (comme dans la conception électrique est simple. La conception mécanique? pas tellement), en supposant que vous puissiez acquérir les bons composants.

Ce que vous voulez, c'est un filtre à cristal basse fréquence.

Le vrai défi va être d'acquérir des cristaux de fréquence suffisamment basse.

Je sais qu'il est possible de fabriquer des oscillateurs à quartz sous 1000 Hz, mais en dehors des récepteurs militaires ELF / VLF (par exemple pour les communications sous-marines), ils ne sont pas un marché pour eux, ils sont donc pratiquement indisponibles.

Si vous voulez apprendre à broyer vos propres cristaux, ce serait certainement un projet intéressant!


Une autre idée intéressante serait d'essayer de créer le vôtre Filtre SAW. Je pense qu'il serait possible de le faire avec quelques actionneurs piézo. Vous auriez besoin d'une masse résonnante (diable, peut-être utiliser un diapason réel), et elle aurait probablement plusieurs modes de résonance, vous auriez donc besoin d'un filtrage électrique en plus du filtre mécanique, mais ce serait certainement plus facile à faire puis broyer vos propres cristaux de quartz personnalisés.

Cependant, je ne sais pas quel genre de roll-off vous pourriez réaliser.

Je réfléchissais aussi à des moyens analogiques comme une sorte d'expérience de pensée. Avez-vous entendu parler des filtres "N-path"? Voici un lien (avertissement, mathématiques lourdes): http://www.alcatel-lucent.com/bstj/vol39-1960/articles/bstj39-5-1321.pdf Ils sont essentiellement une sorte de filtre à condensateur commuté, à faible fréquences, vous pouvez les utiliser pour construire des filtres passe-bande avec des facteurs Q de plusieurs millions.
@Bitrex - Intéressant. Il semble que le PDF lié et l'approche SAW font la même chose, à savoir l'utilisation d'un système mécanique pour simuler un système FIR.
@Bitrex: Vous ne voulez pas de Q dans les millions dans ce cas. Cela rendrait la bande passante si extrêmement étroite que la réponse serait très lente. Pensez-y. 1M de cycles à 110Hz est une longue période.
@Olin Lathrop - Je ne pense pas qu'il disait que vous voudriez que dans * ce * cas, juste que cette technique puisse atteindre de telles performances de filtre.
#5
  0
Chris Stratton
2011-12-29 22:37:51 UTC
view on stackexchange narkive permalink

Si vous souhaitez uniquement mesurer la note, envisagez d'utiliser la transformée de Fourier discrète évaluée uniquement à la fréquence d'intérêt (il existe également d'autres algorithmes, mais celui-ci est facile à décrire)

Essentiellement, pendant un certain temps, vous multipliez les échantillons d'entrée à la fois par le cosinus et le sinus d'une variable en incrémentant à la fréquence souhaitée, et vous accumulez séparément les résultats en tant que deux composants d'un nombre complexe. À partir des totaux, vous pouvez prendre la magnitude (racine carrée de la somme des carrés) et la phase.

Pour réduire la détection parasite d'autres fréquences, vous pouvez utiliser une fonction de fenêtre telle qu'un cosinus surélevé (cosinus + 1, de -pi / 2 à pi / 2) qui va doucement fondre et disparaître le signal afin de réduire la contamination de l'analyse par des artefacts de transitions de démarrage et d'arrêt brusques.

Vous avez omis la partie sur le filtrage passe-bas des produits sin et cos. C'est ainsi que la bande passante étroite est obtenue. La largeur de ce filtre est ce qui définit le delta de fréquence autour du signal souhaité qui sera détecté.
@OlinLathrop - non, je ne l'ai pas laissé de côté, comme je l'ai dit d'accumuler pendant un certain temps. La durée est ce qui définit la bande passante, et oui, c'est une forme de filtre passe-bas. Bien qu'il soit possible de créer ce filtre sous une forme continue, la construction d'accumulation, d'enregistrement, de vidage et de redémarrage est plus courante. Ce qui est approprié dépendra de la fréquence à laquelle une réponse est nécessaire - si plus souvent que la période d'accumulation nécessaire pour la netteté souhaitée, les périodes devront se chevaucher, peut-être à l'extrême de continuellement.
OK, je n'avais pas réalisé que c'était ce que tu voulais dire par «pendant un certain temps». Oui, c'est un filtre passe-bas, en particulier un filtre boîte. Il existe de meilleurs filtres qui nécessitent moins d'état et qui ont une meilleure réponse en fréquence et qui sont à peu près les mêmes en termes de calcul, mais cela fonctionnera. Je ne suis pas d'accord pour dire que le traitement par lots de morceaux de données est plus courant. Il y a de bonnes raisons de ne pas faire cela. Je pense que la plupart du temps, c'est parce que c'est tout ce que connaissait celui qui a écrit le firmware.
@OlinLathrop - Non, ce n'est pas effectivement un filtre de boîte, étant donné la fonction de fenêtre mentionnée dans le dernier paragraphe. Les principales raisons du traitement des blocs sont la moindre exigence de stockage et de calcul - pour faire un filtre continu, vous avez besoin de quelque chose comme FIFO pour les prises de retard. En fin de compte, il est inutile de calculer plus de résultats que vous n'en utiliserez.
Non, vous n'avez pas besoin d'un FIFO pour les "retards". C'est pour les filtres FIR. Voir mon code ci-dessus pour un exemple de traitement continu sans rien de tout cela. Ce problème est plus adapté à un filtre IIR.
Vous n'avez pas publié l'implémentation interne de votre filtre, il n'y a donc rien à "voir". Et un filtre IIR à temps discret nécessite des éléments de retard, mais pas autant.
Cela devrait être évident. Je ne fais rien d'inhabituel là-bas, juste deux pôles de filtrage passe-bas simple. Puisque vous demandez cependant, j'ai ajouté à ma réponse pour la montrer explicitement. Chaque pôle ne nécessite qu'un seul état, et le calcul par échantillon est simple.


Ce Q&R a été automatiquement traduit de la langue anglaise.Le contenu original est disponible sur stackexchange, que nous remercions pour la licence cc by-sa 3.0 sous laquelle il est distribué.
Loading...