0
votes

Utiliser FFT pour extraire la fréquence

J'ai un signal qui est une combinaison linéaire de deux fréquences et j'essaie d'utiliser MATLAB pour déterminer quelles fréquences le signal (principal) constitue. En tant qu'entrée, j'ai la fréquence d'échantillonnage, taux et un vecteur de ligne avec les données du signal, segment .

Maintenant, j'ai le code suivant: xxx

et cela renvoie en effet un graphique avec deux pics, une à chacune des fréquences dont le signal est constitué. Maintenant, je veux extraire ces fréquences. Je souhaite donc retourner une variable, signal , qui est un vecteur des deux fréquences.

Par conséquent, si mon signal est créé par la combinaison linéaire d'un signal de 30 Hz et l'un des 60 Hz , alors je veux Signal = [30,60] . Je peux créer un graphique, puis identifier cela, mais je veux couper ce moyen et renvoyer les fréquences trouvées, sans utiliser de boîtes à outils.

Comment puis-je trouver mes fréquences souhaitées?


0 commentaires

3 Réponses :


2
votes

Sans boîtes à outils: Sélectionnez un seuil que vous avez jugé acceptable, puis simplement faire ABS (x)> Seuil , qui vous donnera une matrice logique à indexer dans FREQ , donnant les fréquences au-dessus du seuil. Pour une précision accrue, vous pouvez alors faire des choses comme diff () sur la matrice résultante et rechercher des indices voisins, puis sélectionnez la valeur maximale sur ces indices consécutifs sur cette séquence comme "Peak" là-bas.

Vous pouvez également trier () les valeurs, conserver les indices du maximum n (dans votre cas 2) et indexez dans les tableaux de fréquence. Encore une fois pas une méthode très robuste, mais rapide et sale.

Combinant les deux techniques ci-dessus, vous pouvez réduire itérativement le seuil selon la matrice triée, puis vérifier les choses comme proximité des pics, leur proéminence, etc.

Si vous ne voulez pas implémenter tout cela vous-même, voir ci-dessous pour une fonction unique pour le faire.


Si vous êtes prêt à utiliser la boîte à outils de traitement du signal, vous pouvez utiliser FindPeaks () . Cela vous donne des indices que vous pouvez ensuite utiliser pour indexer votre matrice de fréquence pour obtenir les fréquences souhaitées. Alternativement utilisez les pics = FindPeaks (données, x) Syntaxe pour extraire directement l'emplacement x (fréquences dans votre cas).


2 commentaires

Mais si le pic supérieur a des fréquences dans sa bande supérieure au deuxième pic, il retournerait deux fréquences très proches et elle perdrait la deuxième fréquence, non?


@Mathbeginner C'est pourquoi j'ai dit que ce n'est pas très robuste. La seule solution courte serait de recourir à des algorithmes de recherche de pics intégrés tels que FindPeaks () , quelque chose de plus long que cela nécessite de mettre en œuvre un algorithme de recherche de pointe que je ressens à large pour une réponse de dépassement de pile.



0
votes

2 Moyens simples:

  1. Prenez la matrice FFT retournée et remplacez la section avec chacun des pics (1 à la fois) et remplacez-le par zéros (afin de vous retrouver avec seulement 1 pic. puis faites un FFT inverse sur le tableau vers récupérer le signal sans la fréquence à zéro.

  2. Si vous connaissez la phase des signaux d'origine - prenez-en une à la fois et créez un nouveau signal avec une cette fréquence et l'inverser (c'est-à-dire 0-Signal - où il est arrivé maintenant descend!). Et ajoutez-le au signal d'origine. Cette fréquence disparaîtra du signal audio avec le besoin de FFT (sauf pour vérifier vos résultats.


0 commentaires

0
votes

Ce que je finis à faire était d'utiliser la fonction max () . Cela rendrait le pic, puis l'index X correspondant correspondrait à la bonne fréquence. Après avoir récupéré cette fréquence, j'ai choisi un certain support autour du pic et fixez ces indices égaux à zéro. Ensuite, je voudrais à nouveau exécuter max () pour trouver le deuxième pic et sa fréquence correspondante.


0 commentaires