Дискретное преобразование Фурье для WAV файла. Как огрубить результат?

Для применения дискретного преобразования Фурье к WAV файлу, нам сначала потребуется импортировать необходимые библиотеки. В случае языка программирования Go это может быть пакет github.com/go-audio/audio:

import (
    "github.com/go-audio/audio"
    "github.com/go-audio/wav"
)

Затем мы должны открыть WAV файл и прочитать его содержимое в структуру данных, которую можно обработать. Для этого можно воспользоваться следующим кодом:

file, err := os.Open("example.wav")
if err != nil {
    log.Fatal(err)
}
defer file.Close()

decoder := wav.NewDecoder(file)
buf, err := decoder.FullPCMBuffer()
if err != nil {
    log.Fatal(err)
}

После этого мы можем применить дискретное преобразование Фурье к аудио-данным, чтобы получить их представление в частотной области. Для этого можно использовать пакет github.com/mjibson/go-dsp/fft:

import (
    "github.com/mjibson/go-dsp/fft"
)

// Создаем слайс для хранения комплексных чисел (длина должна быть степенью двойки)
complexData := make([]complex128, len(buf.Data))

// Преобразуем значения аудио-данных в комплексные числа
for i, v := range buf.Data {
    complexData[i] = complex(float64(v)/32768, 0)
}

// Выполняем преобразование Фурье над аудио-данными
fftData := fft.FFT(complexData)

// Получаем модуль амплитуды преобразования Фурье
amplitudeSpectrum := make([]float64, len(fftData))
for i, v := range fftData {
    amplitudeSpectrum[i] = real(v)*real(v) + imag(v)*imag(v)
}

Теперь у нас есть амплитудный спектр аудио-данных в частотной области. Если мы хотим огрубить результат, то можно применить оконную функцию к спектру, чтобы сгладить высокие частоты и сделать спектр более плавным.

Например, мы можем использовать оконную функцию Хэмминга:

import (
    "github.com/mjibson/go-dsp/window"
)

// Применяем оконную функцию к амплитудному спектру
windowedSpectrum := make([]float64, len(amplitudeSpectrum))
for i, v := range amplitudeSpectrum {
    windowedSpectrum[i] = v * window.Hamming(len(amplitudeSpectrum))[i]
}

Это пример применения оконной функции Хэмминга, но в зависимости от ваших потребностей вы можете выбрать другую оконную функцию, такую как Блэкмана или Ханна.

Теперь у нас есть огрубленный амплитудный спектр в частотной области, и мы можем преобразовать его обратно в аудио-данные, если необходимо. Для этого можно использовать обратное дискретное преобразование Фурье (IDFT). В пакете github.com/mjibson/go-dsp/fft есть функция fft.IFFT, которую мы можем использовать:

// Применяем обратное преобразование Фурье к окну спектра
inverseFFTData := fft.IFFT(windowedSpectrum)

// Преобразуем значения комплексных чисел обратно в аудио-данные
outputData := make([]int, len(inverseFFTData))
for i, v := range inverseFFTData {
    outputData[i] = int(real(v) * 32768)
}

Теперь у нас есть огрубленные аудио-данные, которые могут быть сохранены в WAV файл или использованы для дальнейшей обработки.

Заметьте, что этот код предоставляет только примеры использования дискретного преобразования Фурье для обработки WAV файла. Реальная реализация может требовать дополнительной обработки, например, нормализации или настройки параметров преобразования, в зависимости от потребностей проекта.