Question

Je dois trouver la fréquence d'un échantillon, stockée (en vb) sous forme de tableau d'octets. Échantillon est une onde sinusoïdale, fréquence connue, je peux donc vérifier), mais les chiffres sont un peu bizarres et mon calcul mathématique est faible. Gamme complète de valeurs 0-255. 99% des nombres sont compris entre 235 et 245, mais il y a des valeurs aberrantes jusqu'à 0 et 1, et jusqu'à 255 dans le 1% restant. Comment normaliser cette opération pour supprimer les valeurs aberrantes (calculer l'intervalle 235-245 car il peut changer avec différents échantillons), et comment puis-je calculer les passages par zéro pour obtenir la fréquence? Toutes mes excuses si cette description est de la foutaise!

Était-ce utile?

La solution

La FFT est probablement la meilleure réponse, mais si vous voulez vraiment le faire avec votre méthode, essayez ceci:

Pour normaliser, créez d'abord un histogramme pour compter le nombre d'occurrences de chaque valeur de 0 à 255. Supprimez ensuite X pour cent des valeurs de chaque extrémité avec quelque chose comme:

for (i=lower=0;i< N*(X/100); lower++)
  i+=count[lower];
//repeat in other direction for upper

Normaliser maintenant avec

A[i] = 255*(A[i]-lower)/(upper-lower)-128

Jeter les résultats en dehors de la plage -128..127.

Vous pouvez maintenant compter les passages à zéro. Pour vous assurer que vous n'êtes pas dupé par le bruit, vous voudrez peut-être garder une trace de la pente sur les derniers points et ne comptabiliser les passages à niveau que lorsque la pente moyenne va dans le bon sens.

Autres conseils

La méthode standard pour s'attaquer à ce problème consiste à considérer un bloc de données, si tout va bien au moins deux fois la fréquence réelle (prendre plus de données n'est pas mauvais, donc il est bon de surestimer un peu), puis prenez le FFT et devinez que la fréquence correspond au plus grand nombre du spectre FFT obtenu.

À propos, des problèmes très similaires ont déjà été posés ici - vous pouvez également rechercher ces réponses.

Utilisez la transformation de Fourier, il est beaucoup plus insensible au bruit que de compter les passages à zéro

Modifier: @WaveyDavey

J'ai trouvé une bibliothèque F # pour effectuer une FFT: À partir d'ici

  

Comme il se trouve, le meilleur gratuit   mise en oeuvre que j'ai trouvée pour F #   les utilisateurs jusqu'à présent est toujours le fantastique   Bibliothèque FFTW. Leur site a un   DLL Windows précompilée. j'ai écris   liaisons minimales qui permettent   accès thread-safe à FFTW à partir de F #,   avec à la fois gourou et interfaces simples.   La performance est excellente, 32 bits   Windows XP Pro n'est que jusqu'à 35%   plus lent que Linux 64 bits.

Maintenant, je suis sûr que vous pouvez appeler F # lib depuis VB.net, C #, etc., cela devrait être dans leur documentation

Si j’ai bien compris votre description, ce que vous avez est un signal qui est une combinaison d’un sinus, d’une constante et de problèmes aléatoires. Dites, comme

x[n] = A*sin(f*n + phi) + B + N[n]

où N [n] est le "pépin" le bruit dont vous voulez vous débarrasser.

Si les pépins ont une longueur d'échantillon, vous pouvez les supprimer en utilisant un filtre médian qui doit être plus grand que la longueur de pépin. Des deux côtés du pépin. Des pépins de longueur 1 signifient que vous en aurez assez avec une médiane de 3 échantillons de longueur.

y[n] = median3(x[n])

La médiane est calculée comme suit: Prenez les échantillons de x que vous souhaitez filtrer (x [n-1], x [n], x [n + 1]), triez-les et votre sortie sera celle du milieu.

Maintenant que le signal de bruit est absent, supprimez le signal constant. Je comprends que le tampon a une longueur limitée et connue, vous pouvez donc calculer la moyenne de tout le tampon. Soustrayez-le.

Vous avez maintenant votre seul signal sinusal. Vous pouvez maintenant calculer la fréquence fondamentale en comptant les passages à zéro. Comptez le nombre d'échantillons supérieurs à 0 dans lesquels le précédent échantillon était inférieur à 0. La période correspond au nombre total d'échantillons de votre tampon divisé par ce nombre, et la fréquence correspond à l'oposite (1 / x) de la période.

Bien que j'irais avec la majorité et dise qu'il semble que ce que vous voulez est une solution fft (l'algorithme fft est assez rapide), si fft n'est pas la solution, peu importe la raison, vous pouvez essayer d'ajuster une courbe sinusoïdale à les données en utilisant un programme d’ajustement et en lisant la fréquence ajustée.

À l'aide de Fityk , vous pouvez charger les données et les adapter à . * sin (b * xc) 2 * pi / b vous donnera la fréquence après ajustement.

Fityk peut être utilisé depuis une interface utilisateur graphique, depuis une ligne de commande pour les scripts et possède une API C ++, de sorte qu'il puisse être inclus directement dans vos programmes.

J'ai cherché sur Google pour "base fft". FFT Visual Basic Votre question crie FFT, mais soyez prudent, utilisez FFT sans comprendre, même Un peu plus sur le DSP peut conduire à des résultats que vous ne comprenez pas ou ne savez pas d’où ils viennent.

Procurez-vous l'analyseur de fréquence à l'adresse http://www.relisoft.com/Freeware/index. htm , lancez-le et regardez le code.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top