2012-06-19 6 views
1

48 kHz PCM 스트림이 있고이를 44.1 kHz 호환 플레이어 (Apple 's AirPlay)로 스트리밍하려고합니다.44.1 kHz 수신기에서 48 kHz PCM 재생

누군가가 "일부 바이트가 손실 될 수 있기 때문에 효과가 있는지"아니면 이전에 변환/다운 샘플링을해야합니까?

"그냥 작동하지"않으면 java에서이 작업을 수행하는 데 필요한 팁이 있습니까?

편집 :

소리 ("정보 오버플로")를 망가되기 때문에 그냥 작동하지 않습니다. pcm-stream을 다시 샘플링/다운 샘플링해야합니다. 문제는이 경우에는 너무 사소한 아니기 때문에

은 (48 kHz에서 kHz에서 44.1로) 나는이 일을위한 라이브러리를 사용한다 :

내가 libresample을 다할 것입니다 생각합니다. Android를 사용 중이므로 native implementation 또는 java implementation을 사용할 수 있습니다.

Java 구현이 충분히 성능이 있다고 생각합니까?

답변

1

귀하의 경우에 필요한 프로세스를 "합리적인 요인에 의한 다운 샘플링"이라고합니다. 그것은 사소한 문제가 아니기 때문에 라이브러리를 사용하여 그렇게하는 것이 좋습니다. 직접 구현하려면 많은 DSP 지식이 필요합니다. 대신 JNI 바인딩을 작성해야하는 C 라이브러리 인 libresample을 사용할 수 있습니다.

대략적인 근사값을 계산하기 위해 대부분의 오래된 샘플을 복사하지만 매 10 번째 샘플을 삭제하는 새 버퍼를 만들 수 있습니다. 정확하게 44.1 kHZ가 아니지만 그대로 연주하는 것이 좋습니다.

0

입력 신호에 데시 메이션을 적용해야합니다. 먼저 로우 패스 필터를 통해 입력을 전달해야합니다 (이 경우 앤티 앨리어싱을 고려해야합니다).

그러면 합리적인 요소로 다운 샘플링해야합니다. 이 두 가지 프로세스에 관해 인터넷에는 많은 기사가 있습니다. 그래서 만약 당신이 정말로이 일에 종사한다면, 약간의 연구를하십시오.

예. 하나의 간단한 로우 패스 필터 접근법은 출력 샘플로서 2 샘플의 평균을 사용하는 것이다. 즉, y (n) = (x (n) + x (n-1))/2; 여기서 y -는 출력이고 x - 입력, n - 현재 샘플 위치입니다.

1

좋아, 가장 쉬운 방법은 모든 48/44.1 번째 샘플을 가져 오는 것입니다 (12 번째 샘플마다 킥 아웃하는 것과 같습니다). 결국이 작업을 수행해야합니다.

문제는 앨리어싱입니다. 다운 샘플링의 경우 실제로 다운 샘플링 속도를 벗어난 스펙트럼을 샘플로 미러링하고 있습니다 (좋은 설명은 this wiki page 참조). 이는 앨리어싱이라고합니다. 당신은 분명히 그것을 원치 않을 것입니다 (당신은 그것을 시험해보고 볼 수 있습니다. 오디오는 어떻게됩니까?).

그럼 어떻게 방지 할 수 있습니까? 가장 일반적인 방법은 미러링 된 주파수 청크의 스펙트럼 진폭을 어떻게 든 감소시키는 것입니다. 이 방법은 이 미러링 된이지만 진폭이 매우 낮기 때문에 더 이상 중요하지 않습니다. 이는 샘플링 비율 주변의 차단 주파수를 가진 저역 통과 필터를 사용하여 수행 할 수 있습니다.그래서 단계는 다음과 같습니다

  • 귀하의 샘플을 필터링하는 것은 귀하의 경우 ((주의 그 아래에 물건을 제거하지 않기)는 44.1kHz 이상 높은 주파수 진폭의
  • 표본 데이터를 제거하는 로우 패스, 킥 12 번째 샘플마다 출력)

필터의 요구 사항은 무엇입니까? 중요한 요구 사항 중 하나는 컷오프 주파수 아래의 주파수 진폭을 만지지 않아야하므로 매우 낮은 통과 대역 리플 및 통과 대역 이득이 1 일 것입니다. 그런 다음 stoppband는 가능한 한 많이 댐핑되어야합니다. 이는 분명 데이터에 따라 다릅니다. 나는 특별하게 오디오 프로세싱에 대해 알지 못하지만 보통 DSP에서 사용되는 로우 패스 필터는 FIR 또는 IIR입니다. 물론 다른 많은 것들이 있지만 구현하기가 쉽고 실시간 제약 조건을 처리 할 수있는 경우도 있습니다.

그래서 두 가지 필터 구현을 읽어 보시기 바랍니다 (또는 FIR에만 집중). 만약 내가 이라면이 방금 쓴 내용에 대해 혼란스럽고, 저역 통과 필터링 기능을 가진 라이브러리를 사용하는 것이 더 나을 것입니다. 하지만 그 물건을 많이 사용한다면, 그 문제를 읽는 것이 좋습니다. 실제로 무슨 일이 벌어지고 있는지 이해하는 데 도움이 될 것입니다 ...;)