LINUX.ORG.RU

Microphon


0

0

Kinte link, ili ob'yasnite kak microphon programit'. Podoydet kak C tak i Assembler mojno dlya Linuxa i Windows. Glavnoe printzip ponyat'. Spasibo.

s uvajeniem Evgeny.

anonymous

Вопрос задан некорректно. Микрофон запрограммировать нельзя.

Микрофон всего лишь преобразует звук в электрический сигнал. Если имеется звук лишь одной частоты, на выходе микрофона будет синусоида соответствующей частоты. Чем сильнее звук, тем больше амплитуда выходного сигнала. В реале на входе микрофона имеется масса звуковых колебаний разных частот и амплитуд. Соответственно на выходе будет куча синусоид, наложенных друг на друга. Это дело подается на усилитель (например, транзистор). Затем идет на кабель, где на него наводятся электрические шумы (как минимум, вездесущие 50 Гц). А ты берешь сигнал с другого конца кабеля и делаешь с ним что хочешь.

Сигнал -- аналоговый. Чтобы его обрабатывать в цифровом виде, его надо сначала превратить в цифру. Это делает АЦП (аналого-цифровой преобразователь). Суть оцифровки аналогового сигнала в следующем: через равные интервалы времени амплитуда входного (для АЦП) сигнала измеряется относительно опорного напряжения. Отличие входного напряжения от опорного подается на выход как некое число. Чем больше амплитуда входного сигнала в момент измерения, тем больше это число. Эти числа (называемые "отсчет" или sample) АЦП подает на выход через те же самые регулярные интервалы времени, через которые он делает измерения.

Физически АЦП в ПК находится на звуковой карте. Вот тут уже можно что-то программировать. Собственно, единственным программируемым параметром является интервал измерений. Он называется "период квантования" (или частота дискретизации, или sampling rate). Чем меньше период квантования, тем более высокие частоты остаются на выходе АЦП. Теоретически на выход пролезут все частоты, но на практике этого не происходит, потому что перед АЦП ставят фильтр, срезающий все частоты, которые находятся выше требуемой границы. Кроме того, перед фильтром может стоять программируемый усилитель (есть ли такие на звуковых картах, я не знаю, но думаю вряд ли).

Таким образом, работа с микрофоном сводится к следующему: указать драйверу звуковой карты требуемый sampling rate, затем читать поток отсчетов и что-то с ними делать.

Как это делается под Windows, я не знаю. Под линуксом надо открыть файл /dev/dsp, сделать настройки, затем читать этот файл. Вот пример (не ручаюсь, что будет работать, потому как не проверял):


#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/soundcard.h>

int fd;
int fmt = AFMT_S16_LE;
int rate = 44100;
short buf[8192];

fd = open("/dev/dsp", O_RDONLY);
ioctl(fd, SNDCTL_DSP_SETFMT, &fmt);
ioctl(fd, SNDCTL_DSP_SPEED, &rate);

while (1) {
read(fd, buf, 16384);
//что-то делать с данными в buf
}


После функции чтения в буфере будет какое-то количество отсчетов. Каждый отсчет является 2-байтовым целым со знаком в дополнительном коде, в little endian. Это указывается драйверу в SNDCTL_DSP_SETFMT.

Еще следует иметь в виду, что чем больше частота дискретизации, тем быстрее должна шевелиться программа обработки данных, иначе она будет эти данные терять, потому что АЦП работает в реальном времени.

ЗЫ: если чего непонятно -- спрашивай.

nobody ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.