Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Мультимедия, OpenGL/DirectX > Захват и обработка звука с микрофона


Автор: david08 13.2.2014, 02:29
Доброго времени суток!

Подскажите пожалуйста, как снимать данные с потока микрофона для последующей обработки? Винда или Линукс не важно, интересует дальнейшее разложение сигнала в спектр и построение чего-то типа спектр от времени. Примерно представляю, что нужно пользоваться быстрым преобразованием Фурье, но если можете помочь разобраться как это реализуется, был бы очень признателен.

Автор: Alexeis 13.2.2014, 10:40
Цитата(david08 @  13.2.2014,  03:29 Найти цитируемый пост)
интересует дальнейшее разложение сигнала в спектр и построение чего-то типа спектр от времени.

  Спектр от времени получают при помощи http://ru.wikipedia.org/wiki/%D0%9E%D0%BA%D0%BE%D0%BD%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%A4%D1%83%D1%80%D1%8C%D0%B5. Дело в том, что если для анализа сигнала просто вырезать фрагмент сигнала, то сама врезка превращает сигнал из непрерывного в импульсный, а как известно, импульс имеет широкий спектр не смотря на то, что он может иметь заполнение одной частоты. С точки зрения преобразования Фурье там добавляется только один множитель. А так в результате БПФ получается массив комплексных чисел F=X(f)+i*Y(f) . Соответственно амплитудой гармоники будет sqrt(x*x+y*y), впрочем формул и примеров алгоритмов завались (даже в той же википедии есть http://ru.wikipedia.org/wiki/%D0%91%D1%8B%D1%81%D1%82%D1%80%D0%BE%D0%B5_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%A4%D1%83%D1%80%D1%8C%D0%B5). Задал массив амплитуд сингала получил спектр. 
  Что касается записи звука с микрофона, то тема достаточно избитая. Например http://forum.vingrad.ru/topic-230557.html

Автор: borisbn 13.2.2014, 11:54
Скачиваешь http://www.fftw.org/, вызываешь http://www.fftw.org/fftw3_doc/Complex-One_002dDimensional-DFTs.html#Complex-One_002dDimensional-DFTs, из полученного массива считаешь спектр мощности ( powSpectr[ i ] = complexSpectr[ i ][ 0 ] * complexSpectr[ i ][ 0 ] + complexSpectr[ i ][ 1 ] * complexSpectr[ i ][ 1 ] ), затем рассчитываешь логарифмический спектр ( logSpectr[ i ] = 10 * log10( powSpectr[ i ] ) ), затем повторяешь всё то же самое для следующей по времени выборки сигнала.
Затем рисуешь такой график: по оси X у тебя индекс массива logSpectr, по оси Y - время ( или просто номер выборки ), а цвет каждой точки берётся из таблицы цветов по индексу, равному logSpectr[ i ], т.е. как-то так:
color = colorTable[ logSpectr[ i ] ];

Автор: borisbn 13.2.2014, 12:58
Должен получиться вот такой "водопад" (нижняя половина рисунка)
user posted image

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)