49 lines
1.5 KiB
Go
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))
|
|
}
|
|
*/ |