#c# #.net #audio #xna #pcm
#c# #.net #Аудио #xna #pcm
Вопрос:
У меня есть API, который предоставляет мне данные волны PCM:
http://msdn.microsoft.com/en-us/library/ff966424.aspx
Формат буфера byte[], используемый в качестве параметра для конструктора SoundEffect, Microphone.Метод getData и DynamicSoundEffectInstance.Метод SubmitBuffer — это данные волны PCM. Кроме того, формат PCM чередуется и имеет строчный конец.
Аудиоформат имеет следующие ограничения:
- Аудиоканалы могут быть моно (1) или стерео (2).
- Файл волны PCM должен содержать 16 бит на выборку.
- Частота дискретизации должна составлять от 8000 Гц до 48000 Гц.
- Чередование стереоданных осуществляется с левого канала на правый канал.
Я хотел бы сделать визуализацию на основе этих данных.
Я хочу разделить уровни высоты звука на 3 уровня и получить громкость / уровень каждого.
Итак, если я говорю тихим голосом, я получу высокое значение, затем 2 низких значения, если я говорю нормально, я получу низкое значение, высокое значение и низкое значение, а если я говорю высоким голосом, я получу 2 низких значения и высокое значение.
Как я могу этого добиться? Я никогда не пробовал ничего, что связано со звуком, поэтому я на уровне 1 и не знаю, с чего начать.
Ответ №1:
Полный ответ, вероятно, был бы слишком сложным, чтобы давать здесь, но вам нужно взять временную область, данные выборки PCM и вывести из нее представление в частотной области, чтобы затем вы могли оценить уровень сигнала в разных частотных диапазонах. Метод для этого известен как быстрая передача Фурье (FFT). Для самостоятельной реализации этого требуется значительный объем знаний о DSP, поэтому, возможно, вашим лучшим подходом было бы создать библиотеку, предлагающую готовую реализацию FFT, которую вы можете использовать.
Комментарии:
1. Кроме того, когда вы реализуете FFT и группируете свои частоты вместе, убедитесь, что вы используете логарифмическую шкалу для отображения их значений — если вы используете линейную шкалу, различия между значениями будут огромными (я на самом деле думал, что мой код не работает должным образом, потому что график был повсюду, когда я делал аналогичную визуализацию с использованием линейной шкалы)