2010-05-18 13 views
3

J'écris un utilitaire de compression de fichiers en C++ que je veux soutenir pour les fichiers PCM WAV, mais je veux le garder en encodage PCM et juste le convertir à un taux d'échantillonnage inférieur et le changer de stéréo en mono le cas échéant, pour obtenir une taille de fichier inférieure.Convertir par programme WAV

Je comprends l'en-tête du fichier WAV, mais je n'ai aucune expérience ou connaissance de la façon dont les données sonores réelles fonctionnent. Donc ma question est, serait-il relativement facile de manipuler par programme le sous-bloc "données" dans un fichier WAV pour le convertir à un autre taux d'échantillonnage et changer le numéro de canal, ou serais-je mieux d'utiliser une bibliothèque existante ? Si c'est le cas, comment cela se ferait-il? Merci d'avance.

Répondre

1

Je ne pense pas qu'il soit vraiment nécessaire de réinventer la roue (sauf si vous voulez le faire pour votre apprentissage personnel). Par exemple, vous pouvez essayer d'utiliser libsnd

+0

Généralement, je suis un pour le minimalisme dans mes programmes si possible, et ce serait bien de connaître un peu le format. Pour moi, il semble que changer le taux d'échantillonnage et les canaux serait relativement facile à faire, mais bien sûr, je peux me tromper. – kaykun

+0

Votre programme ne sera pas "minimal" une fois que vous aurez lancé votre propre code de traitement audio. Si vous utilisez une bibliothèque, il y a de fortes chances que vous l'ayez déjà et que vous ayez quelques lignes de code à appeler. –

4

PCM signifie simplement que la valeur du signal d'origine est échantillonnée à des points équidistants dans le temps.

Pour la stéréo, il existe deux séquences de ces valeurs. Pour les convertir en mono, vous prenez simplement la moyenne par morceaux des deux séquences.

Le rééchantillonnage du signal à une fréquence d'échantillonnage plus faible est un peu plus compliqué: vous devez filtrer les hautes fréquences du signal pour éviter la création d'alias (signal basse fréquence parasite).

2

Je suis d'accord avec avakar et nico, mais je voudrais ajouter un peu plus d'explications. L'abaissement du taux d'échantillonnage de l'audio PCM n'est pas trivial à moins que deux choses sont vraies:

  1. Votre signal contient uniquement des fréquences importantes inférieure à 1/2 le nouveau taux d'échantillonnage (Nyquist rate). Dans ce cas, vous n'avez pas besoin d'un filtre anti-aliasing.

  2. Vous effectuez un sous-échantillonnage d'une valeur entière. Dans ce cas, le downampling par N nécessite simplement de conserver chaque Nième échantillon et de laisser tomber le reste.

Si cela est vrai, vous pouvez simplement déposer des échantillons à intervalles réguliers pour sous-échantillonner. Cependant, ils ne sont probablement pas vrais si vous avez affaire à autre chose qu'un signal synthétique. Pour résoudre le problème un, vous devrez filtrer les échantillons audio avec un filtre passe-bas pour vous assurer que le signal résultant contient seulement le contenu de fréquence jusqu'à la moitié de la nouvelle fréquence d'échantillonnage. Si ce n'est pas fait, les hautes fréquences ne seront pas représentées avec précision et se retrouveront dans les fréquences pouvant être correctement représentées, provoquant une distorsion majeure. Consultez la section critical frequency de cet article wikipedia pour une explication de l'aliasing. Plus précisément, voir la figure 7 qui montre trois signaux différents qui ne peuvent être distingués que par les échantillons car le taux d'échantillonnage est trop faible.

L'adressage du problème deux peut être fait de plusieurs façons. Parfois, il est effectué en deux étapes: un suréchantillonnage suivi d'un sous-échantillonnage, ce qui permet d'obtenir un changement rationnel du taux d'échantillonnage. Il peut également être fait en utilisant l'interpolation ou d'autres techniques. Fondamentalement, le problème qui doit être résolu est que les échantillons du nouveau signal ne s'alignent pas dans le temps avec les échantillons du signal original. Comme vous pouvez le voir, le rééchantillonnage audio peut être très impliqué, donc je prendrais les conseils de nico et j'utiliserais une bibliothèque existante. Pour que le filtre fonctionne correctement, vous devrez en apprendre beaucoup sur le traitement du signal et l'analyse des fréquences.Vous n'aurez pas besoin d'être un expert, mais cela prendra du temps.