2017-02-21 14 views
0

각 채널에서 동일한 스케일링을 사용하여 오디오 입력의 선형 스케일링을 수행하려고합니다.사운드 스케일링 Java

전체적인 효과는 입력 스트림이 조용해질 때까지 진폭이 점차 감소한다는 것입니다. 따라서 첫 번째 샘플은 동일하게 유지되고 마지막 샘플은 진폭 측면에서 0이됩니다. 이걸 어떻게 구현하는지 궁금 해서요.

지금까지 내가 스케일링 코드를 가지고 있으며 16 자리 2의 보수 범위 사이에 있도록 샘플의 크기를 조정해야하는지 궁금해하고있었습니다.

for (int i=0; i<data.length; ++i){ // data[i] is sample in intger form 
     data[i] = (int) (data[i]*(something/something)); 
} 

특정 요인에 대한 조정이 설명 될 수 있다면 도움이 될까요?

감사합니다.

+1

실제 질문은 무엇입니까? 스케일링을 올바르게하고 진폭 만 줄이면 자동으로 16 비트 범위가됩니다. 그러나 코드가 정확하지 않습니다 - 최대 값을 가진 샘플을 여러 개 필요로하는 이유는 32 비트 범위로 훨씬 커지기 때문입니다. 루프의 첫 번째 반복에서 0으로 나누면 어떻게됩니까? 코드도 실행 했나요? –

+0

@erwin bolwidt 제 질문은 선형 적으로 0으로 스케일하는 방법입니다. 각 샘플을 0으로 나누겠습니까? – Hawwa

답변

1

오디오 데이터 (예 : [-32768..32767])의 짧은 값으로 작업하고 있고 바이트와의 변환이 다른 곳에서 처리된다고 가정합니다.

"something/something"의 분수에서 분자는 분모와 동일한 값에서부터 0까지의 범위를 가지며 분모는 고정 값으로 유지됩니다.

예를 들어 볼륨 범위를 128 단계로 나누면 가장 큰 볼륨은 128/128이 될 것이고 가장 조용한 볼륨은 0/128이됩니다.

나누기를 피하기 위해 1/128에 해당하는 계수를 미리 계산하고 [0..128] 범위의 값으로 곱할 수 있습니다.

그런 다음 "뭔가 * precalculatedFactor"가되어 조금 더 빨리 실행할 수 있습니다.

그러나 선형 볼륨 스케일링에 문제가 있습니다. 실제 감지 된 볼륨은 선형으로 추적하지 않습니다. 따라서, X의 볼륨 간격은 하이 엔드에서 간혹 볼륨 차이를 생성 할 수 있지만, 불연속성을 야기하고 로우 엔드에서 클릭을 발생시킬만큼 커야합니다.

저는 사람들이 볼륨을 선형 입력에 더 잘 맵핑하기 위해 종종 지수 함수를 사용한다고 생각합니다. 어떤 것이 가장 좋은 것인지 의견이 분분하다. 그러나 볼륨 다이얼이 [0..1]에서 시작한다고 가정 해보십시오. 예를 들어, 값을 적용하기 전에 값을 큐브로 만들면, 0.5의 입력은 (0.5 * 0.5 * 0.5) => 0.125가됩니다.이 값은 0.5보다 1/2 라우드니스에 더 가깝습니다.

따라서 "something * something * something * precalculatedFactorCubed"가 더 효과적 일 수 있습니다.

+0

두 채널을 사용하여 스케일링을 수행하는 방법은 무엇입니까? – Hawwa

+0

채널이 왼쪽과 오른쪽으로 번갈아 가며 나타납니다. 두 값의 각각에 동일한 요소와 계산을 적용 할 수 있습니다. –