Comment puis-je mettre en œuvre un filtre passe-bande dans C (Objectif: détection de hauteur)?

J'ai récemment demandé cette question:

Je suis à la recherche d'un algorithme pour détecter la hauteur. l'une des réponses que m'a suggéré de faire un premier FFT pour obtenir la base de la réponse en fréquence, les fréquences sont de mieux exprimé, et de la faire suivre par un filtre passe bande dans chaque domaine d'intérêt:

Légèrement avancé algorithme pourrait faire quelque chose comme ceci:

  1. Environ détecter la hauteur de la fréquence (qui pourrait être fait avec DFT).
  2. Signal passe-bande filtre à isoler le terrain de la fréquence.
  3. Compter le nombre d'échantillons entre les deux pics dans le filtrée signaux.

Maintenant, je peux faire le premier pas d'accord ( je suis codant pour iOS et Apple dispose d'un cadre (l'accélérer cadre) pour faire Fft etc.

J'ai fait un début ici: mais je peux voir le problème: une FFT qui pourraient faire la différence entre toutes les notes possibles, on pourrait chanter nécessiterait beaucoup d'échantillons, et je ne veux pas effectuer trop de calculs inutiles que je m'adresse à un appareil mobile.

Donc je vais essayer d'obtenir ma tête autour de cette réponse ci-dessus, mais je ne comprends pas comment je pourrais appliquer le concept d'un filtre passe-bande à code.

Peut aider quelqu'un?

  • Vous avez posé beaucoup de questions DONC, à propos de la détection de hauteur déjà, mais il semble que vous n'avez toujours pas très bien compris (a) la différence entre la hauteur et la fréquence ou (b) la nécessité de choisir un algorithme de détection de hauteur, ce qui est approprié pour le type de son que vous êtes en train d'analyser (par exemple, la parole, la musique, etc). Je vous suggère de faire un peu plus de lecture sur les fondamentaux avant d'essayer de mettre en place quelque chose, sinon vous risquez de bien dépenser beaucoup d'efforts inutiles va dans la mauvaise voie.
  • C'est pourquoi je pose beaucoup de questions, je suis à essayer de comprendre ce qui est utile et ce n'est pas avant de se lancer dans quelque chose. Je suis lentement obtenir une certaine perspective sur le problème.
  • vous pourriez revenir en arrière et re-lu les réponses précédentes, et aussi les liens qui ont été fournies. J'ai le sentiment que vous êtes en train de sauter dans une mise en œuvre sans avoir compris les bases en premier. Bonne chance.
  • R: si je comprends bien, la voix est constitué d'une fréquence fondamentale et les harmoniques de celle-ci. Je suis passé par le calcul de transformées de Fourier, DFT, FFT, et d'exécuter dans les limites pratiques; à détecter si un chanté le ton est légèrement au dessus mais la note réelle exige une basse fréquence fondamentale, ce qui nécessite un grand échantillonnage de la fenêtre, ce qui nécessite de lourds CPU, ou qui diminue drastiquement le microphone de fréquence d'échantillonnage. Donc je suis à la recherche à l'exécution d'une base de FFT pour obtenir des domaines généraux de l'intérêt dans le domaine de fréquence, et d'affiner le résultat en quelque sorte.
  • R: d'Où mon intérêt dans la réponse donnée me suggérant j'utilise un filtre passe-bande à ce stade. Cependant, je ne peux pas déterminer si c'est une suggestion pratique. J'ai aussi regardé dans les autres suggestions; autocorrélation est effectivement la même que la multiplication du signal de la source par une onde sinusoïdale de fréquence souhaitée et de l'intégration sur un nombre entier de longueurs d'onde, cela peut fonctionner, mais prendrait un peu de travail pour déchiffrer légèrement les fréquences à partir de la sortie. Je suis encore à essayer de prod sous tous les angles.
  • si vous êtes intéressé à la hauteur de la voix humaine, alors vous voudrez peut-être regarder au cepstral analyse: en.wikipedia.org/wiki/Cepstrum

InformationsquelleAutor P i | 2010-11-05