2009-10-16 5 views
6

안녕하세요 저는 wav 오디오 파일의 샘플 속도를 44.1kHz에서 8kHz로 다운 샘플링해야합니다. 바이트 배열을 사용하여 모든 작업을 수동으로 수행해야합니다. 이는 학업 목적을위한 것입니다.Java - 다운 샘플링 wav 오디오 파일

현재 두 개의 클래스 인 Sink 및 Source를 사용하여 바이트 배열을 팝업하고 푸시합니다. 선형 보간법을 사용하여 데이터 청크를 다운 샘플링해야하는 부분에 도달하기 전까지는 모든 것이 잘 진행됩니다.

44100에서 8000Hz로 다운 샘플링 했으므로 128 000 000 바이트를 포함하는 바이트 배열을 어떻게 보간합니까? 지금은 i % 2 == 0, i % 2 == 1 및 i % 80 == 0에 따라 5, 6 또는 7 바이트를 팝핑하고 있으며이 5, 6 또는 7 바이트의 평균을 새 파일로 푸시합니다. .

실제로 결과는 원본보다 작지만 Windows Media Player에서 재생할 수 없습니다 (파일을 읽는 중에 오류가 있음). 올바른 트랙을들을 수는 있지만 많은 소음이 있습니다. 소음.

그래서, 요약하면 선형 보간 부분에 대한 도움이 필요합니다. 미리 감사드립니다.

+0

지금 사용중인 코드를 게시하면 버그를 쉽게 찾을 수 있습니다. –

답변

7

나는 중간 샘플 필터가 될 것이므로 정확하게 샘플링하지 말아야한다고 생각합니다. 5/6/7 번째 샘플을 모두 사용하고 새 파일에 쓰십시오.

아마도 일부 앨리어싱 인공물이 있지만 전체적으로 인식 할 수 있습니다.

더 복잡한 솔루션이지만 더 나은 결과를 제공하는 품질 좋은 방법은 먼저 FFT 또는 DFT를 사용하여 샘플을 주파수 분포로 변환 한 다음 적절한 샘플 속도로 다시 변환하는 것입니다. 그런 일을 한 지 오래되었지만 확실히 할 수 있습니다. 그래도 제대로 작동하려면 조금 돌아가는 것이 좋습니다.

또한 전체 배열의 FT를 사용하지 않고 세그먼트로 나누면 세그먼트 경계가 0이되는 문제가 발생합니다. 몇 년 전에 이러한 작업을 수행 할 때 실행 가능한 솔루션을 찾지 못했습니다. 이 (그것은뿐만 아니라 아티팩트를 생성하기 때문에)하지만이 아마 당신이

WMP 파일에 대해 불평에 관해서는

:-) 올바른 책을 읽으면 하나입니다 : 당신은 당신이 따라 쓰기 헤더를 수정 않았다, 맞죠?

+0

평균은 아마도 나쁜 생각 일 수 있습니다. 체리 피킹 샘플에서 얻는 것보다 적은 인공물을 원한다면 그냥 업 샘플링 한 다음 다운 샘플링 할 수 있습니다. –

+2

와아! 정말 많이 감사합니다. "5/6/7 번째 샘플을 모두 사용하고 새 파일에 쓰십시오."그냥 내 모든 문제를 수정 한 것입니다! 작성하는데 2 분이 소요되는 동안이 시간을 보냈다는 것을 믿을 수 없습니다! 다시 한 번 감사드립니다! –

+1

당신은 환영합니다 :-) 그것에 대해 생각한다면, 평균은 * 정말 * 나쁜 생각입니다. 파형의 완전한 전체 모양이 손실됩니다. 그리고 그것은 실제로 우리가 뭔가 감각적 인 것을 듣는 것이 중요합니다. :) – Joey