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

49 lines
1.5 KiB
Go

package reduction
import (
"encoding/binary"
// "fmt"
"math"
)
func lowPassFilter(input []float64, cutoffFrequency, sampleRate float64) []float64 {
rc := 1.0 / (cutoffFrequency * 2.0 * math.Pi)
dt := 1.0 / sampleRate
alpha := dt / (rc + dt)
output := make([]float64, len(input))
output[0] = input[0]
for i := 1; i < len(input); i++ {
output[i] = output[i-1] + alpha*(input[i]-output[i-1])
}
return output
}
func ProcessAudio(input []byte, cutoffFrequency, sampleRate float64) ([]byte, error) {
numSamples := len(input) / 2
samples := make([]float64, numSamples)
for i := 0; i < numSamples; i++ {
samples[i] = float64(int16(binary.BigEndian.Uint16(input[i*2:])))
}
filteredSamples := lowPassFilter(samples, cutoffFrequency, sampleRate)
output := make([]byte, len(input))
for i := 0; i < numSamples; i++ {
value := int16(filteredSamples[i])
binary.LittleEndian.PutUint16(output[i*2:], uint16(value))
}
return output, nil
}
/*
func main() {
inputBuffer := make([]byte, 16000*2) // 1 секунда на 16 кГц, 16 бит
cutoffFrequency := 200.0 // Частота среза в Гц
sampleRate := 16000.0 // Частота дискретизации в Гц
processedBuffer, err := ProcessAudio(inputBuffer, cutoffFrequency, sampleRate)
if err != nil {
fmt.Println("Ошибка:", err)
return
}
fmt.Println("Обработка завершена, размер выходного буфера:", len(processedBuffer))
}
*/