2013-07-21 3 views
1

다음 코드를 사용하여 PCM 오디오 데이터를 정규화합니다. 정상화하는 올바른 방법입니까? 정규화 후 LPF를 적용합니다. 순서가 LPF를 먼저 할 것인지 아니면 정규화를 출력 할 것인지를 결정해야합니다. 그렇지 않으면 현재의 순서가 더 중요한 것입니다. 또한 내 targetMax는 8000으로 설정되어 있으며이 포럼의 게시에서 사용했습니다. 무엇을위한 최적의 가치입니다. 내 입력 귀하의 findMaxAmplitude은 긍정적 여행에 보이는 44100.PCM 데이터를 표준화하십시오.

private static int findMaxAmplitude(short[] buffer) { 
    short max = Short.MIN_VALUE; 
    for (int i = 0; i < buffer.length; ++i) { 
     short value = buffer[i]; 
     max = (short) Math.max(max, value); 
    } 
    return max; 
} 

short[] process(short[] buffer) { 
    short[] output = new short[buffer.length]; 
    int maxAmplitude = findMaxAmplitude(buffer); 
    for (int index = 0; index < buffer.length; index++) { 
     output[index] = normalization(buffer[index], maxAmplitude); 
    } 
    return output; 
} 

private short normalization(short value, int rawMax) { 
    short targetMax = 8000; 
    double maxReduce = 1 - targetMax/(double) rawMax; 
    int abs = Math.abs(value); 
    double factor = (maxReduce * abs/(double) rawMax); 

    return (short) Math.round((1 - factor) * value); 
} 

답변

1

의 샘플 속도와 16 비트 모노 PCM입니다.

max = (short)Math.Max(max, Math.Abs(value)); 

정규화가 상당히 복잡해 보입니다. 더 간단한 버전은 다음을 사용합니다 :

return (short)Math.Round(value * targetMax/rawMax); 

8000의 targetMax가 올바른지 여부는 문제입니다. 일반적으로 최대 값 범위를 사용하려면 16 비트 샘플의 정규화가 필요합니다. 따라서 32767의 targetMax가 더 논리적으로 보입니다. LPF의 이득이 시퀀스의 최대 값을 변경할 수 있으므로 정규화는 LPF 연산 이후에 수행되어야합니다.

관련 문제