2009-10-16 12 views
6

Witam Muszę zmniejszyć próbkę pliku audio WAV z 44,1 kHz do 8 kHz. Muszę wykonać całą pracę ręcznie z tablicą bajtów ... jest przeznaczona do celów akademickich.Java - downsampling pliku audio wav

Obecnie używam 2 klas, Sink and Source, do pop i push tablice bajtów. Wszystko idzie dobrze, aż dojdę do części, w której muszę zmniejszyć próbkę danych przy użyciu interpolacji liniowej.

Ponieważ próbuję z próbkowania w dół z 44100 na 8000 Hz, jak mogę interpolować tablicę bajtów zawierającą około 128 000 000 bajtów? Teraz pojawia się 5, 6 lub 7 bajtów w zależności od i% 2 == 0, i% 2 == 1 i i% 80 == 0 i wypycham średnią z tych 5, 6 lub 7 bajtów do nowego pliku .

Wynik jest rzeczywiście mniejszy plik audio niż oryginał, ale nie można go odtwarzać na Windows Media Player (mówi, że jest błąd podczas czytania pliku) i jest dużo hałasu, chociaż słyszę odpowiedni utwór za hałas.

Podsumowując, potrzebuję pomocy dotyczącej części interpolacji liniowej. Z góry dziękuję.

+0

Ułatwi nam znalezienie znalezionych błędów, jeśli opublikujesz kod, którego teraz używasz. –

Odpowiedz

7

Myślę, że nie powinieneś używać średniej z tych próbek, ponieważ byłby to filtr medianowy, a nie dokładnie próbkowanie w dół. Po prostu użyj co 5th/6th/7th sample i zapisz to w nowym pliku.

To prawdopodobnie będzie zawierało pewne artefakty aliasingu, ale może być ogólnie rozpoznawalne.

Innym, bardziej złożonym rozwiązaniem, ale prawdopodobnie lepszym z punktu widzenia jakości, byłoby najpierw przekonwertować próbki na rozkład częstotliwości za pomocą FFT lub DFT, a następnie przekonwertować z powrotem z odpowiednią częstotliwością próbkowania. Minęło trochę czasu, odkąd zrobiłem coś takiego, ale jest to zdecydowanie wykonalne. Być może trzeba trochę skrzypnąć, aby działało poprawnie.

Również, gdy nie przyjmujemy FT kompletnej tablicy, ale raczej w segmentach, mamy problem z granicą segmentu wynoszącą 0. Kilka lat temu, kiedy grałem z tymi rzeczami, nie wymyśliłem realnego rozwiązania to (ponieważ generuje artefakty, jak również), ale prawdopodobnie istnieje jeden jeśli czytasz odpowiednie książki :-)

chodzi o WMP narzekają pliku: ty nie zmodyfikować nagłówek jesteś odpowiednio pisać, prawda?

+0

Uśrednianie to prawdopodobnie zły pomysł. Możesz po prostu dodać próbkę, a następnie zmniejszyć liczbę próbek, jeśli chcesz uzyskać mniej artefaktów niż w przypadku próbek wybieranych przez wiśnie. –

+2

Woah! Dziękuję WIĘCEJ "Wystarczy użyć co 5th/6th/7th sample i zapisz to w nowym pliku" to właśnie poprawiło cały mój problem! Nie mogę uwierzyć, że spędziłem wiele godzin, a napisanie go zajęło ci dokładnie 2 minuty! Dzięki jeszcze raz! –

+1

Nie ma za co :-) Jeśli myślisz o tym, uśrednianie jest * naprawdę * złym pomysłem. Całkowity ogólny kształt kształtu fali zostaje utracony. I właśnie to jest dla nas ważne, aby usłyszeć coś rozsądnego :) – Joey

Powiązane problemy