2016-02-29 3 views
0

J'essaie d'écrire une application de musique où la détection de la hauteur est le noyau de tout cela. J'ai vu des solutions à ce problème ainsi que des applications sur l'AppStore. Cependant la plupart d'entre eux sont assez datés et j'aimerais faire ceci est Swift. J'ai regardé AVAudioEngine comme un moyen de le faire, mais je trouve la documentation manquante ou peut-être que je n'ai pas regardé assez dur.Est-il faisable d'utiliser AVAudioEngine pour détecter la hauteur en temps réel?

Ce que j'ai trouvé est que je peux appuyer sur le bus inputNode comme ceci:

self.audioEngine = AVAudioEngine() 
self.audioInputNode = self.audioEngine.inputNode! 
self.audioInputNode.installTapOnBus(0, bufferSize:256, format: audioInputNode.outputFormatForBus(0), block: {(buffer, time) in 
     self.analyzeBuffer(buffer) 
}) 

Le bus est exploité 2-3 fois par seconde et le tampon contient plus de flotteurs pour chaque 16000 robinet. Ces échantillons d'amplitude proviennent-ils du microphone?

la documentation au moins revendique sa sortie à partir du noeud: « Le paramètre de la mémoire tampon est une mémoire tampon de données audio capturées à partir de la sortie d'un AVAudioNode. »

Est-il possible d'utiliser AVAudioEngine pour détecter terrain en temps réel temps ou devrais-je aller à propos d'une autre façon?

Répondre

0

Je me rends compte que Hellium3 me donne vraiment des informations à ce que le pas est et si elle est une bonne idée de fais ces choses avec Swift. Ma question était à l'origine de savoir si le fait d'appuyer sur le bus PCM est le moyen d'obtenir des signaux d'entrée du microphone.

Depuis que j'ai posé cette question, j'ai fait exactement cela. Utilisez les données obtenues en appuyant sur le bus PCM et analysez les fenêtres du tampon.

Cela fonctionne très bien et c'était mon manque de compréhension de ce qu'est un bus PCM, tampon et fréquence d'échantillonnage qui m'a fait poser la question en premier lieu. En connaissant ces trois, il est plus facile de voir que cela est juste.

+0

Aviez-vous implémenté dans Swift? Si possible, pouvez-vous partager le fichier créé pour la détection de hauteur ou un exemple de projet? J'utilise AVAudioRecorder pour l'enregistrement audio –

2

Quelques concepts différents ici. AVAudioEngine est juste le moteur qui vous fournit les données PCM brutes, vous pouvez utiliser Novocaine, Core-Audio directement ou d'autres options.

Les données PCM sont les échantillons en virgule flottante du microphone.

En ce qui concerne le suivi de hauteur, il existe diverses techniques. Une chose à noter est que la détection de fréquence est différente de la détection de hauteur.

FFT ce qui est bon mais ne sera pas capable de détecter la hauteur des signaux avec des fondamentaux manquants. Vous auriez besoin de passer le signal à travers un filtre passe-bas pour réduire l'éventuel aliasing des fréquences supérieures à Nyquist Frequency puis window avant de le passer à la FFT, ceci pour réduire spectral leakage. La FFT va sortir le contenu spectral à l'intérieur d'une série de bacs, la plus grande valeur du bac étant la fréquence la plus forte du signal.

Autocorrelation qui peut donner de meilleurs résultats. C'est fondamentalement le signal corrélé avec lui-même. En fin de compte c'est ce que vous voulez détecter, il y a quelques considérations à prendre en compte. Des choses comme la voix masculine et certains instruments peuvent donner des résultats incorrects grâce à une FFT normale fonctionnant sur des tampons qui n'ont pas été pré-traités.

Cocher cette PITCH DETECTION METHODS REVIEW

En ce qui va Swift, ce n'est pas bien adapté pour en temps réel, la performance des systèmes ciblés. Vous pouvez vérifier les old benchmarks of Swift vs C++

enter image description here

l'implémentation C++ FFT est plus 24x plus rapide

+2

Ces indices de référence datent de plus d'un an. Swift a beaucoup évolué depuis, alors je les traite avec scepticisme. – JeremyP

+0

assez juste, mon point était encore au sujet de la performance et Swift ne peut pas remplacer C++/C pour le code de traitement audio – jarryd

+0

Merci pour ce poste informatif. J'ai testé le code ci-dessus en supposant que le tampon contenait des amplitudes échantillonnées pour la durée écoulée depuis le dernier branchement. J'ai utilisé Accelerate.framework pour passer le tampon à travers FFT et pris la valeur moyenne du résultat. En utilisant un générateur de sons pour créer du A4 j'ai testé le résultat et il montre en effet les 440 Hz + - e attendus. Cela signifie que c'est possible. Je me demande cependant s'il y a une meilleure façon de le faire. Je n'ai pas encore vérifié AudioKit, et je n'ai pas exploré les implications de l'erreur. Par exemple. il ne montre que 440 Hz si je garde le micro près du haut-parleur. – MdaG