43 lines
680 B
Go
43 lines
680 B
Go
package s16le
|
|
|
|
func PeaksRMS(b []byte) int16 {
|
|
// RMS of sine wave = peak / sqrt2
|
|
// https://en.wikipedia.org/wiki/Root_mean_square
|
|
// https://www.youtube.com/watch?v=MUDkL4KZi0I
|
|
var peaks int32
|
|
var peaksSum int32
|
|
var prevSample int16
|
|
var prevUp bool
|
|
|
|
var i int
|
|
for n := len(b); i < n; {
|
|
lo := b[i]
|
|
i++
|
|
hi := b[i]
|
|
i++
|
|
|
|
sample := int16(hi)<<8 | int16(lo)
|
|
up := sample >= prevSample
|
|
|
|
if i >= 4 {
|
|
if up != prevUp {
|
|
if prevSample >= 0 {
|
|
peaksSum += int32(prevSample)
|
|
} else {
|
|
peaksSum -= int32(prevSample)
|
|
}
|
|
peaks++
|
|
}
|
|
}
|
|
|
|
prevSample = sample
|
|
prevUp = up
|
|
}
|
|
|
|
if peaks == 0 {
|
|
return 0
|
|
}
|
|
|
|
return int16(peaksSum / peaks)
|
|
}
|