45 lines
1.3 KiB
Go
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)
|
|
}
|
|
*/ |