mirror of
https://github.com/cgzirim/seek-tune.git
synced 2025-12-17 08:54:19 +00:00
Improve downsampling function to handle input length that's not divisible by ratio
This commit is contained in:
parent
026e9398c3
commit
3e3976992a
1 changed files with 5 additions and 6 deletions
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue