Improve downsampling function to handle input length that's not divisible by ratio

This commit is contained in:
Chigozirim Igweamaka 2024-06-17 11:49:18 +01:00
parent 026e9398c3
commit 3e3976992a

View file

@ -54,28 +54,27 @@ func Spectrogram(samples []float64, sampleRate int) ([][]complex128, error) {
return spectrogram, nil return spectrogram, nil
} }
// Downsample downsamples a list of float64 values to a specified ratio by averaging groups of samples
func downsample(input []float64, ratio int) ([]float64, error) { func downsample(input []float64, ratio int) ([]float64, error) {
// if ratio <= 0 || len(input)%ratio != 0 {
// return nil, errors.New("invalid or incompatible ratio")
// }
if ratio <= 0 { if ratio <= 0 {
return nil, errors.New("invalid or incompatible ratio") return nil, errors.New("invalid or incompatible ratio")
} }
outputSize := len(input) / ratio outputSize := (len(input) + ratio - 1) / ratio
output := make([]float64, outputSize) output := make([]float64, outputSize)
for i := 0; i < outputSize; i++ { for i := 0; i < outputSize; i++ {
startIndex := i * ratio startIndex := i * ratio
endIndex := startIndex + ratio endIndex := startIndex + ratio
if endIndex > len(input) {
endIndex = len(input)
}
sum := 0.0 sum := 0.0
for j := startIndex; j < endIndex; j++ { for j := startIndex; j < endIndex; j++ {
sum += input[j] sum += input[j]
} }
output[i] = sum / float64(ratio) output[i] = sum / float64(endIndex-startIndex)
} }
return output, nil return output, nil