9
votes

Extraire les aigus et la basse de l'audio dans iOS

Je cherche un moyen d'obtenir les données des aigus et des basses d'une chanson pour une certaine incrémentation du temps (disons 0,1 seconde) et dans la plage de 0,0 à 1,0. J'ai googlé autour mais je n'ai pas été capable de trouver rien à distance proche de ce que je cherche. En fin de compte, je veux être capable de représenter le niveau des aigus et des basses pendant que la chanson joue.

Merci!


4 commentaires

Voir la réponse acceptée à cette question: Stackoverflow.com/Questtions/1794010/...


Ok c'est explique la procédure mais pas comment effectuer cette procédure sur iOS - ou au moins où commencer.


iOS a des filtres passe bas et haut intégrés dans le cadre de l'unité audio.


Pouvez-vous fournir un exemple de code? Je n'ai aucune idée de quelle direction prendre avec ça.


3 Réponses :


5
votes

Il semble que vous recherchiez Transform rapide Fournisseur de Fourier Code exemple.

C'est un sujet assez important à couvrir dans une réponse.

Les outils dont vous aurez besoin sont déjà construits dans iOS: API VDSP

Cela devrait vous aider: Guide de programmation VDSP

Et il y a aussi un code d'échantillon FFT disponible

Vous voudrez peut-être aussi consulter iPhoneFondT . Bien que ce code soit glulant obsolète, il peut vous aider à comprendre les processus "sous-timoners".


0 commentaires

11
votes

C'est raisonnablement facile. Vous devez effectuer une FFT, puis résumer les bacs qui vous intéressent. Beaucoup de la manière dont vous sélectionnez dépendra du taux d'échantillonnage de votre audio.

Vous devez ensuite choisir une commande FFT appropriée pour obtenir de bonnes informations dans les bacs de fréquence renvoyées.

Donc, si vous faites un Commandez 8 FFT Vous aurez besoin de 256 échantillons. Cela vous retournera 128 paires complexes.

Ensuite, vous devez les convertir en magnitude. Ceci est en fait assez simple. Si vous utilisez STD :: Complexe, vous pouvez simplement effectuer une STD :: ABS sur le numéro complexe et vous aurez sa magnitude (SQRT (R ^ 2 + I ^ 2)).

intéressant de manière intéressante Point Il y a quelque chose appelé Théorème de Parseval . Ce théorème indique que, après avoir exécuté une transformée de Fourier, la somme des bacs retournée est égale à la somme des carrés moyens du signal d'entrée.

Cela signifie que pour obtenir l'amplitude d'un ensemble spécifique de bacs, vous pouvez simplement les ajouter ensemble diviser par le nombre d'entre eux puis sur la valeur SQRT pour obtenir la valeur d'amplitude RMS de ces bacs.

Alors, où cela vous laisse-t-il?

Bien d'ici, vous devez déterminer quelles bacs vous ajoutez ensemble.

  1. Une tonalité aiguisée est définie comme ci-dessus 2000hz.
  2. Un ton de basse est inférieur à 300Hz (si ma mémoire me sert correctement).
  3. Les médiums sont compris entre 300Hz et 2KHz.

    Supposons maintenant que votre taux d'échantillon est 8KHz. Le <-href="http://fr.wikipedia.org/wiki/nyquist_frequency" rel. indique que la fréquence la plus élevée que vous puissiez représenter dans un échantillonnage à 8 kHz est de 4 kHz. Chaque poubelle représente donc 4000/128 ou 31,25Hz.

    Donc, si les 10 premières bacs (jusqu'à 312.5Hz) sont utilisées pour les fréquences de basse. La corbeille 10 à la poubelle 63 représente la mi-parcours. Enfin, la corbeille 64 à 127 est les treillis.

    Vous pouvez ensuite calculer la valeur RMS comme décrit ci-dessus et que vous avez les valeurs RMS.

    Valeurs RMS peut être convertie en valeurs DBFS en effectuant 20.0f * log10f (rmsval); . Cela vous rappellera une valeur de 0dB (amplitude maximale) jusqu'à -INFINITY DB (amplitude min). Soyez conscient Les amplitudes ne vont pas de -1 à 1.

    Pour vous aider, voici un peu de classe FFT basée sur la C ++ sur iPhone (qui utilise VDSP sous le capot): < Pré> xxx


0 commentaires

3
votes

Reportez-vous à AurioTouch2 exemple d'Apple - il a tout de l'analyse de fréquence à la représentation de l'interface utilisateur de ce que vous voulez.


0 commentaires