2009-11-25 21 views
1

Comme dans cet exemple How to extract frequency information from an input audio stream (using PortAudio)? je suis curieux de savoir portaudio et numpy ...Comment utiliser numpy avec portaudio pour extraire basse, mi aigus

Je ne suis pas sûr à 100% fft, comment puis-je passer numpy un morceau et récupérer trois valeurs de -1,0 à 1,0 pour les basses, les médiums et les aigus?

Cela ne me dérange pas si cela juste pour un canal que je peux donner un sens de la partie audio de ce fait, ce sont les mathématiques qui nagent devant moi quand je les regarde :)

+0

Que voulez-vous que les -1 à 1.0 signifient? Quelles plages de fréquences utilisez-vous pour définir les graves, les médiums et les aigus? –

Répondre

1

En fait, vous n'utiliseriez pas de transformée de Fourier pour cela.

La séparation de tout signal audio dans les graves, les médiums et les aigus se fait généralement à l'aide de filtres. Un filter est un dispositif de traitement du signal qui atténue certaines plages de fréquences. Les filtres peuvent être construits numériquement ou électriquement. Par exemple, ils sont utilisés dans les systèmes de crossover audio dans les haut-parleurs.

Pour obtenir la partie basse basse, utilisez un filtre passe-bas. Les filtres passe-bas filtrent les hautes fréquences. Ils sont également appelés filtres «coupe-haut».
Pour obtenir la partie moyenne fréquence, vous devez utiliser un filtre passe-bande. Les filtres passe-bande filtrent les fréquences basses et hautes. Ils sont également appelés «filtres à cloche».
Pour obtenir la partie aigus haute fréquence, utilisez un filtre passe-haut. Les filtres passe-haut filtrent les basses fréquences. Ils sont également appelés filtres «coupe-bas».

En fait, vous pouvez également utiliser uniquement le filtre passe-haut et passe-bas. Si vous soustrayez les deux signaux filtrés du signal original, le résultat sera un signal filtré passe-bande. Cela vous évite un filtre.

Chaque filtre aura une fréquence de seuil. La fréquence de seuil est une fréquence spéciale à partir de laquelle le filtre doit commencer à filtrer. Selon l'ordre de filtrage, le signal sera atténué de 6 dB/oct (1er ordre), 12 dB/oct (2ème ordre), 18 dB/oct (3ème ordre), etc. Pour votre application, une conception de 2ème ordre est probablement bien.
Notez que les filtres affectent généralement votre signal d'une certaine manière et plus l'ordre est élevé, plus cela peut être audible. Soit dit en passant, c'est de la physique pure et vrai pour tous les traitements de signaux, y compris les transformées de Fourier. L'utilisation de ces trois filtres est (peut être) équivalente à une transformée de Fourier avec seulement trois points spectraux.

1

Le Fourier Transform, mentionné dans la réponse sélectionnée à la question SO que vous pointez, vous donne le "spectre" - une grande collection de valeurs donnant l'intensité sonore dans chacune des différentes gammes/tranches de fréquences (exprimée, par exemple, en Hertz). Comment traduire (disons) mille intensités (une pour chaque tranche de 10 Hertz du spectre, disons) en seulement trois chiffres, comme vous le souhaitez, est bien sûr tout à fait un problème heuristique - par exemple, vous pourriez juste Décidez quelles plages de fréquences correspondent aux "basses" et aux "aigus", tout ce qui est entre les deux étant "moyen", et calculez les intensités moyennes dans chacune d'elles. Pour ce que ça vaut, je crois qu'une convention commune pour "basse" est jusqu'à 250Hz, pour "treble" 6KHz et plus (entre-deux étant le "midrange"), cfr e.g. this page - mais il est plutôt une convention arbitraire, donc, « choisissez votre poison » -!)

Une fois que vous avez les niveaux relatifs vous aurez envie de les normaliser par rapport les uns aux autres et de les étendre de manière appropriée à mentir dans votre gamme désirée (vraisemblablement sur une échelle logarithmique parce que c'est ainsi que fonctionne l'ouïe humaine ;-).

+0

Choisir les fréquences est un bon point, pour l'instant il suffirait d'utiliser trois plages de tailles égales. Je préfère être en mesure de récupérer les 3 tranches de numpy au lieu d'utiliser python pour convertir le spectre, pour la vitesse. Comme c'est pour les graphiques cela peut être suffisant, sinon je peux jouer avec les fréquences plus tard. La priorité principale est la performance et ne pas faire trop de traitement en python pur. –