2025-10-23 13:06:22 +07:00

45 lines
1.3 KiB
Go

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)
}
*/