2013-10-26 3 views
2

44100, 16 비트 모노에서 AudioRecord를 사용하여 오디오 소스를 녹음하는 안드로이드 응용 프로그램을 유지 관리했습니다. 나는 그것을 8000으로 다운 샘플링 할 필요가있다. 현재 애플 리케이션에는 제대로 작동하는지 확실하지 않은 다운 샘플 알고리즘이있다. 블랙 박스 인 다른 앱이 그것을 받으면 오디오는 재생되지만 백그라운드에서 큰 소리가 들리고 예상 한 것보다 느립니다. 수신 응용 프로그램에 파이프 된 적절한 형식의 다른 오디오는 문제없이 잘 수신됩니다.다운 샘플 PCM 오디오 44100 ~ 8000

내가 갖고있는 알고리즘이 여기에 나열되어 있습니다. 원래 변수 이름을 기반으로 한 코드가 디 컴파일 된 것으로 의심됩니다.

private void downSample() { 
    int v5 = 0; 
    int v4 = 0; 
    int v2; 
    for (v2 = 0; v2 < 0xA0; ++v2) { 
     v5 += 0xD755; 
     int v6 = v5/0x2710; 
     v5 -= v6 * 0x2710; 
     double v0 = 0; 
     int v3 = v4; 
     v4 += v6; 
     while (v3 < v4) { 
      v0 += ((double) ((((float) this.readBuffer[v3])) * this.volume)); 
      ++v3; 
     } 

     v0 /= ((double) v6); 
     if (32767 < v0) { 
      v0 = 32767; 
     } 
     else if (-32768 > v0) { 
      v0 = -32768; 
     } 

     this.downSampledBuffer[v2] = ((short) (((int) v0))); 
    } 
} 

readBuffer는 녹음 소스로 채워지는 짧은 []입니다. downSampledBuffer는 짧은 []입니다. 무엇이 잘못 될지에 대한 생각?

+1

특히 눈에 거슬리지도 유지하기 어려운 코드입니다. 그것이 분명히 보이지 않는 것은이 변환을 이루기위한 정통 방법 인 [데시 메이션에 의한 리샘플링] (http://www.dspguru.com/dsp/faqs/multirate/resampling)입니다. 거기에 LPF가 있다면 상당히 진절머리 나는 LPF입니다. 나는 결과가 좋다고 대단히 의심한다. 자신의 것을 압연하기보다는 Android 용 라이브러리 지원이 있어야합니다. – marko

+0

Android에서 Honeycomb의 라이브러리를 지원하지만 안타깝게도이 앱에는 Gingerbread가 필요합니다. 데시 메이션 알고리즘을 사용하여 리샘플링하여 현재있는 것을 대체하려고합니다. – mjsalinger

답변

1

"윙윙 거리는 소리"와 "예상보다 느린 소리"는이 알고리즘 외부에서 생성됩니다.

알고리즘은 정확히 882 입력 샘플을 처리하고 160 출력 샘플을 생성합니다. 따라서 downSample()을 호출하기 전에 this.readBuffer에 정확하게 882 개의 새 short 값을 채워야하고 downSample()에서 반환 한 후에 결과 160 개의 short 값을 이미 처리 된 샘플에 연결해야합니다.

통합 저역 통과 필터는 5 또는 6 입력 샘플에 대해 단순 평균이므로 모든 앨리어싱을 제거 할 수는 없지만 다른 한편으로는 다운 샘플링 문제에 대한 가장 느린 솔루션이 아닙니다 .

+0

감사합니다. 내 문제의 현지화에 도움이되었습니다. – mjsalinger