@aibb

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

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

func main() {
	file, err := os.ReadFile("/home/aleksey/temp/ideal/7.wav_8k_stereo_s16_128kb.wav")
	if err != nil {
		log.Fatal(err)
	}
	rr := bytes.NewReader(file)

	wav, err := wavdsp.New(rr)
	if err != nil {
		log.Fatal(err)
	}

	wavTemp, _ := wav.ReadFloats(wav.Samples)

	wavResult := make([]float64, 0)
	for _, v := range wavTemp {
		wavResult = append(wavResult, float64(v))
	}

	fftWindowSize := 1024

	complexArray := make([]complex128, 0)

	blocksCount := len(wavResult) / fftWindowSize
	for i := 0; i < blocksCount; i++ {
		complexArray = fft.FFTReal(wavResult[i*fftWindowSize : i*fftWindowSize+fftWindowSize])
	}


В массиве complexArray находятся комплексные числа с действительной и мнимой часть float64.
Пример элемента массива: (512.5040206313133+0i) (0.5936806295286904-0.01702782107152339i)

1) Я правильно понимаю что это представление частоты и амплитуды первого сэмпла?

Мне необходимо в дальнейшем получить аудиоотпечаток из этого массива, но текущий complexArray я так понимаю не подходит, его необходимо дополнительно обработать.

2) Собственно вопрос как обработать каждый элемент массива, чтобы получить более грубые данные о каждом сэмпле?
  • Вопрос задан
  • 237 просмотров
Решения вопроса 1
gbg
@gbg
Любые ответы на любые вопросы
1) нет, понимаете неправильно. То что получилось - это комплексное число (в википедию, если не ясно), в котором спрятаны амплитуда и фаза самой низкой частоты в преобразовании. Дальнейшие элементы массива - это тоже комплексные числа с амплитудами-фазами.

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

Учтите, что из математических свойств преобразования Фурье над вещественными данными, итоговый массив после вычисления амплитуд окажется зеркально симметричным относительно центра - так то половину результата вам надо выкинуть.

2) А тут надо почитать базовые учебники по ML. Нишант Шакла, написал хороший, например.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы