2009-10-16 10 views
6

Salut J'ai besoin de sous-échantillonner la fréquence d'échantillonnage d'un fichier audio wav de 44,1 kHz à 8 kHz. Je dois faire tout le travail manuellement avec un tableau d'octets ... c'est à des fins académiques.Java - fichier audio wav de sous-échantillonnage

J'utilise actuellement 2 classes, Sink et Source, pour faire apparaître et pousser des tableaux d'octets. Tout se passe bien jusqu'à ce que j'atteigne la partie où j'ai besoin de sous-échantillonner le bloc de données en utilisant une interpolation linéaire.

Étant donné que je sous-échantillonne de 44100 à 8000 Hz, comment interpoler un tableau d'octets contenant quelque chose comme 128 000 000 octets? En ce moment, je saute 5, 6 ou 7 octets en fonction de i% 2 == 0, i% 2 == 1 et i% 80 == 0 et poussez la moyenne de ces 5, 6 ou 7 octets dans le nouveau fichier . Le résultat est en effet un fichier audio plus petit que l'original mais il ne peut pas être lu sur Windows Media Player (dit qu'il y a une erreur en lisant le fichier) et il y a beaucoup de bruit même si je peux entendre la bonne piste le bruit. Donc, pour résumer, j'ai besoin d'aide concernant la partie interpolation linéaire. Merci d'avance.

+0

Il nous sera plus facile d'aider à trouver vos bogues si vous postez le code que vous utilisez maintenant. –

Répondre

7

Je pense que vous ne devriez pas utiliser la moyenne de ces échantillons car ce serait un filtre médian, pas exactement un sous-échantillonnage. Utilisez simplement chaque 5ème/6ème/7ème échantillon et écrivez-le dans le nouveau fichier.

Cela aura probablement quelques artefacts d'aliasing mais pourrait globalement être reconnaissable. Une autre solution, plus complexe, mais probablement meilleure en termes de qualité, consisterait d'abord à convertir vos échantillons en une distribution de fréquence à l'aide d'une FFT ou DFT, puis à les convertir avec la fréquence d'échantillonnage appropriée. Cela fait un moment que j'ai fait une telle chose mais c'est définitivement faisable. Cependant, vous aurez peut-être besoin de bidouiller un peu pour le faire fonctionner correctement.

Aussi, lorsque vous ne prenez pas un FT de l'ensemble complet, mais plutôt dans les segments, vous avez le problème des limites de segment étant 0. Il y a quelques années, je n'ai pas trouvé de solution viable ceci (puisqu'il génère aussi des artefacts) mais il y en a probablement un si vous lisez les bons livres :-)

Comme pour WMP se plaindre du fichier: Vous avez-vous modifié l'en-tête que vous écrivez en conséquence, n'est-ce pas?

+0

La moyenne est probablement une mauvaise idée oui. Vous pourriez juste suréchantillonner et ensuite sous-échantillonner si vous voulez moins d'artefacts que ce que vous obtiendriez à partir d'échantillons de cerisiers. –

+2

Woah! Merci beaucoup "Il suffit d'utiliser chaque 5ème/6ème/7ème échantillon et d'écrire cela dans le nouveau fichier" c'est exactement ce qui a corrigé tout mon problème! Je ne peux pas croire que j'ai passé des heures là-dessus alors qu'il vous a fallu exactement 2 minutes pour l'écrire! Merci encore! –

+1

De rien :-) Si vous y réfléchissez, la moyenne est une * vraiment * mauvaise idée. La forme globale complète de la forme d'onde est perdue. Et c'est ce qui est important pour nous d'entendre quelque chose de sensé :) – Joey

Questions connexes