package normalized import ( "encoding/binary" "math" ) const ( isLittleEndian = true ) func NormalizePCM(input []byte, isLittleEndian bool) []byte { var maxSample int16 numSamples := len(input) / 2 samples := make([]int16, numSamples) for i := 0; i < numSamples; i++ { if isLittleEndian { samples[i] = int16(binary.LittleEndian.Uint16(input[i*2 : (i+1)*2])) } else { samples[i] = int16(binary.BigEndian.Uint16(input[i*2 : (i+1)*2])) } if math.Abs(float64(samples[i])) > float64(maxSample) { maxSample = samples[i] } } normalized := make([]byte, len(input)) for i := 0; i < numSamples; i++ { if maxSample != 0 { normalizedSample := int16(float64(samples[i]) * (32767.0 / float64(maxSample))) if isLittleEndian { binary.LittleEndian.PutUint16(normalized[i*2:(i+1)*2], uint16(normalizedSample)) } else { binary.BigEndian.PutUint16(normalized[i*2:(i+1)*2], uint16(normalizedSample)) } } } return normalized } /* func main() { input := []byte{0x01, 0x02, 0xff, 0xfe} normalized := normalizePCM(input, isLittleEndian) fmt.Printf("Normalized data: %v\n", normalized) } */