Skip to content

Instantly share code, notes, and snippets.

@shu223
Last active February 12, 2018 18:25
Show Gist options
  • Save shu223/46a3d86cf86ef40c669a to your computer and use it in GitHub Desktop.
Save shu223/46a3d86cf86ef40c669a to your computer and use it in GitHub Desktop.
Normalize

Normalize 1

UInt16 processGain(AudioBuffer buffer,
                   float gain)
{
    SInt16 *input = (SInt16 *)buffer.mData;
    UInt64 avg = 0;
    for(int i = 0; i < buffer.mDataByteSize; i++){
        avg += abs(input[i]);        // 音量増幅前の累計
        SInt32 gained = input[i] * gain;
        if (gained > kMaxSInt16) {
            gained = kMaxSInt16;
        }
        else if (gained < kMinSInt16) {
            gained = kMinSInt16;
        }
        input[i] = gained;
    }
    avg /= buffer.mDataByteSize;
    
    return (UInt16)avg;
}


- (AudioBuffer)normalize:(AudioBuffer)buffer {
    
    UInt16 avg = 0;
    
    if (self.isBoost) {
        avg = processGain(buffer, gain);
        
        if (avg > 0) {
            gain = (float)kMaxSInt16 / avg;
            if (gain > kMaxGain) {
                gain = kMaxGain;
            }
            NSLog(@"gain:%f", gain);
        }
    }
        
    return buffer;
}

Normalize 2

UInt16 processGain(AudioBuffer buffer)
{
    SInt16 *input = (SInt16 *)buffer.mData;
    UInt64 avg = 0;
    for(int i = 0; i < buffer.mDataByteSize; i++){
        avg += abs(input[i]);        // 音量増幅前の累計
    }
    avg /= buffer.mDataByteSize;

    float gain = 1.0;
    if (avg > 0) {
        gain = (float)kMaxSInt16 / avg;
        if (gain > kMaxGain) {
            gain = kMaxGain;
        }
        NSLog(@"gain:%f", gain);
    }

    for(int i = 0; i < buffer.mDataByteSize; i++){
        avg += abs(input[i]);        // 音量増幅前の累計
        SInt32 gained = input[i] * gain;
        if (gained > kMaxSInt16) {
            gained = kMaxSInt16;
        }
        else if (gained < kMinSInt16) {
            gained = kMinSInt16;
        }
        input[i] = gained;
    }

    return (UInt16)avg;
}

Normalize 3

- (NSData *)normalize:(NSData *)data length:(NSUInteger)length {
    
    SInt16 *input = (SInt16 *)data.bytes;
    UInt64 avg = 0;
    for(int i = 0; i < length; i++){
        avg += abs(input[i]);        // 音量増幅前の累計
    }
    avg /= length;
    
    float gain = 1.0;
    if (avg > 0) {
        gain = (float)kMaxSInt16 / avg;
        if (gain > kMaxGain) {
            gain = kMaxGain;
        }
//        NSLog(@"gain:%f", gain);
    }
    
    for (int i = 0; i < length; i++) {
        avg += abs(input[i]);        // 音量増幅前の累計
        SInt32 gained = input[i] * gain;
        if (gained > kMaxSInt16) {
            gained = kMaxSInt16;
        }
        else if (gained < kMinSInt16) {
            gained = kMinSInt16;
        }
        input[i] = gained;
    }
    
    return [NSData dataWithBytes:input length:length];
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment