Два микрофона. Положение диктора в пространстве.

Тема в разделе "Arduino & Shields", создана пользователем ilgamer, 7 мар 2012.

  1. ilgamer

    ilgamer Нерд

    Здравствуйте, крайне заинтересовался собиранием робототехники. Сейчас появилась идея создать проект - робота, следящего за оппонентом который подает голосовые команды роботу.
    По части голосовых команд я пока не собираюсь разворачивать вопрос, а вот вопрос относительно микрофонов появился.
    Я собираюсь приобрести два микрофона которые размещу на некотором расстоянии друг от друга на одной на прямой, перпендикулярно которой будет находится диктор.
    Как получать значения с микрофонов? Точнее как получить уровень шума для каждого из двух микрофонов?
    Если я буду сравнивать уровень шума на каждом из них в режиме реального времени, сильно ли это повлияет на скорость реакции робота?
    Возможно кто-нибудь уже выполнял расчеты для подобного рода проектов. Мне необходима некая зависимость. Если ничего подобного нет, я выполню зависимости и сделаю таблицы самостоятельно, но мне все-таки не понятно в каком виде приходят показания от микрофонов?
    Возможна ли запись?
     
  2. ilgamer

    ilgamer Нерд

    Вот примерный план устройства головы робота для быстрого изучения закономерности положения диктора относительно головы и показаний шума в микрофонах:
    skatch_2.jpg
    Выявление зависимости при передвижении по прямой, перпендикулярной направления головы робота, может стать основой для выявления углов на которые необходимо поворачивать голову робота в будущем
    Если у вас есть что-либо на этот счет, буду рад услышать. И все-таки, в каком виде возвращаются значения от микрофона? От 0 до 5 Вольт?
     
  3. Корней

    Корней Гик

    От какого микрофона? Если от этого (http://amperka.ru/collection/Sensory/product/Mikrofon), то там до 5 вольт не дойдет, судя по даташиту на операционники. Да и вообще такой "микрофон" для вашей задачи скорее всего не подойдет, ОУ общего назначения и регулировки усиления нет. Если это какой-то ваш "микрофон", то как сделаете, так и будет возвращать :). Я бы подумал над усилением и обработкой разницы уровней сигналов с микрофонов, вместо того, что бы оцифровывать сигнал каждого микрофона.
     
  4. ilgamer

    ilgamer Нерд

    Микрофоны эти.
    То есть, увеличиваю напряжение, подаваемое на микрофоны?
    Можно обрабатывать разницу не оцифровывая значения приходящие от микрофонов?
     
  5. ilgamer

    ilgamer Нерд

    Я еще не делал покупку оборудования, продумываю набросок устройства чтобы понять какие детали понадобятся.
    Какие микрофоны можете предложить? Их придется паять я понимаю?
     
  6. Корней

    Корней Гик

    Да, http://easyelectronics.ru/operacionnyj-usilitel.html. "Вычитающая схема".
    Только обрабатывать так надо сигнал не с "этих микрофонов", а действительно с микрофонов.
     
  7. Корней

    Корней Гик

    Тут я мало чем могу помочь, наверное надо начать с электретных. Паять придется. Впрочем, меня этот вопрос заинтересовал, в ближайшее время буду закупаться, прихвачу парочку микрофонов.
     
  8. ilgamer

    ilgamer Нерд

    Что же, спасибо. Использование не совместимых с Arduino микрофонов приводит меня в ужас, так как раньше я ничего подобного не собирал.
    А вот куда что припаять необходимо?
    Собираюсь использовать Arduino Uno Rev 3. Возможно, прикуплю IO Shield.
     
  9. Корней

    Корней Гик

    Добро пожаловать в аналоговую электронику.;) У меня микрофон пока только один, так что помочь пока не могу.
     
  10. Dmitriy Kunin

    Dmitriy Kunin Гик

    Всем поклонникам Ардуино в очередной раз рекомендую научиться паять.
    По пайке очень много информации в интернете.
    Но чувствую специально для этого сайта придётся написать отдельную статью, в которой будет рассказ для людей, которые "не очень" хотят это изучать :)
    Умение паять сильно расширяет возможности конструирования.
    А главное помните, что те кто умеет паять, почему-то страшно не хотят изучать микроконтроллеры :)
     
  11. Dmitriy Kunin

    Dmitriy Kunin Гик

    А по основной теме, вам имеет смысл поискать статьи по ключевому слову "Бинауральный эффект"
    Дело в том, что кроме электронных премудростей, я настоятельно рекомендую позаимствовать у природы механическую часть уха - волновод, он не только усиливает сигнал за счёт рупора, но и улучшает локализацию.
    Несмотря на совершенство с которым люди и звери пользуются двумя ушами, это всё за счёт мозга, я думаю увеличение количества микрофонов (до трех - четырёх) сильно упростит алгоритм обработки.
     
  12. ilgamer

    ilgamer Нерд

    Я напугался именно паять. Боюсь что-нибудь испортить когда приходится столько платить за контроллер.

    Не с проста в контролере Microsoft Kinect используется четыре микрофона. Благодаря им и камерам, положение человека ищется без проблем. Я не работаю с камерами, поэтому придется глубоко изучить тему которую вы мне предложили. Спасибо за помощь, кстати. Почитаю обязательно.

    Я рассчитывал собрать устройство, поставить на начальную позицию пьезоизлучатель и начать измерять и записывать в таблицу показания. Однако, необходимо было бы нанести углы с шагом в 20 градусов или даже меньше. ДУмаю, так бы получилось найти некую зависимость и потом ее использовать в коде.
     
  13. Корней

    Корней Гик

    Назвался груздем, полезаю в кузов. Матчасть для ориентирования: http://rus.625-net.ru/archive/z1099/7.htm.
    Имеем два электретных микрофона EM-9767 (На самом деле у нас их 4, но пока имеем два :) ). Еще в наличии горстка ОУ, конденсаторов, резисторов. Для начала попробуем воспроизвести матчасть, поэтому собираем на беспаячной макетке усилители для каждого микрофона, расстояние между микрофонами 10 см, микрофоны направлены в одну сторону, между микрофонами установлена вертикальная поролоновая "стенка", толщина примерно 1,5 см. Получаем следующую картину:
    Источник звука: правый динамик ноутбука, редактор звука обещал синусоиду частотой 1КГц.
    Положение источника по "центру" :
    ADS00001.PNG
    Сдвига фаз нет, левый канал дает больший уровень сигнала при одинаковой громкости из-за разброса параметров усилителей и/или направленностей микрофонов и динамика.
    Источник "справа", угол градусов 60, точно не фиксировался:
    ADS00004.PNG
    Сигнал левого канала запаздывает на 260 мкс и половина его амплитуды слабее на 100мВ (но гарантий, что это вызвано положением источника звука, никаких нет), чем сигнал правого канала.
    Источник "слева", угол градусов 45, точно не фиксировался:
    ADS00006.PNG
    Сигнал правого канала запаздывает на 240 мкс относительно левого, а вот с уровнем сигнала левого канала произошло что-то странное. Причина, вероятно, в совпадении-несовпадении направленности микрофонов и динамика ноутбука. А может я нечаянно инвертировал канал в осциллографе. :confused:

    Выводы из проделанного: фазовый сдвиг сигнала - надежный критерий для определения направления на источник звука, при условии, что частота источника и расстояние между микрофонами удовлетворяют условию: время запаздывания должно быть меньше половины периода сигнала.
    Использовать уровень сигнала для определения направления на источник звука в данной конфигурации аудио-средств не представляется возможным.

    В следующей части "полезания в кузов" мы повторим измерения с использованием естественного источника звука.
     
  14. ilgamer

    ilgamer Нерд

    Феноминально! Огромное спасибо за проведенные опыты.
    Комплект ардуинки пока не идет, затея с роботом простаивает.
    Еще раз спасибо!
     
  15. Корней

    Корней Гик

    Продолжаем.
    Источник звука: живой диктор, говорящий что-то короткое, но емкое в сторону наших микрофонов. Слово выглядит вот так:
    ADS00010.png
    Почему оно так выглядит? См. матчасть, например http://pmpu.ru/vf4/signal/speech
    С какой стороны был источник? А кто его знает, на таком разрешении явно не понятно. Копнем "глубже":

    Источник справа:
    ADS00016.png
    ADS00017.png
    Источник слева:
    ADS00018.png
    ADS00019.png

    Очевидно, что поролоновый разделитель между микрофонами толщиной 1,5 см. не способен заменить голову человека в качестве поглотителя высоких частот. Наличие же в сигнале компонент существенно разной частоты приводит к невозможности ориентироваться по разнице фаз сигналов левого и правого канала.
    В следующей части мы попробуем получить фазово-частотные спектры (кто разбирается в теме, поправте терминологию, если привираю, плз) сигналов левого и правого каналов.
     
  16. ilgamer

    ilgamer Нерд

    Что если использовать в качестве перегородки различные материалы? Есть ли какие табличные значения для проводимости звуковых волн различными материалами?
     
  17. Корней

    Корней Гик

    Наверняка таблицы такие есть. Изучите вопрос, предложите конкретные материалы, попробуем.
     
  18. ilgamer

    ilgamer Нерд

  19. Корней

    Корней Гик

    Продолжаем. Так как голосовой сигнал содержит множество частот, а задержка сигналов в левом и правом каналах зависит от частоты, то очевидно, что хорошо бы было как-то получить характеристики каждой частотной составляющей отдельно. Попробуем получить амплитудно-частотную и фазово-частотную диаграммы голосового сигнала посредством быстрого преобразования Фурье.
    Непосредственно для Arduino есть несколько реализаций БПФ. Так как я располагаю только вариантами ардуин с 2 кБайт ОЗУ, то для меня крайне желательна реализация, работающая с однобайтовыми входными и выходными данными. Если при этом будет использоваться еще и целночисленная математика, то это будет идеально. Такая идеальная библиотека есть: http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1286718155 (так же доступна тут http://blurtime.blogspot.com/2010/11/arduino-realtime-audio-spectrum.html).
    Небольшой скетч позволит нам оценить возможности этой библиотеки и ардуино (на ATmega328) в качестве сигнального процессора.

    Код (Text):

    #include <fix_fft.h>

    #define POW2 7
    const unsigned int DLEN=1<<POW2;
    char im[DLEN];
    char data[DLEN];

    void setup(){
      Serial.begin(115200);
    }
    void loop(){
      int i;
      int val;
      unsigned long s;
      Serial.println("ar");
      Serial.println(s=micros());
      for(i=10000;i;i--) val = analogRead(0);
      Serial.println((micros()-s)/10000);
      Serial.println("sa");
      Serial.println(s=micros());
      for (i=0; i < DLEN; i++){
        val = analogRead(0);
        data[i] = (val>>2) -128;
        im[i] = 0;
      };
      Serial.println((micros()-s)/DLEN);
    Serial.println("fft");
      Serial.println(s=micros());
      for(i=100;i;i--)
        fix_fft(data,im,POW2,0);
      Serial.println((micros()-s)/100);
    }
     
    Получаем:
    В переводе на русский:
    Время выполнения analogRead(0) чуть меньше 112 мкс.
    Длительность одной выборки - 121 мкс. (Можно довести почти до тех же 112 мкс, вынеся обработку за цикл выборки, но это не принципиально)
    Время выполнения БПФ при размере исходных данных в 128 семплов - 9 мс.
     
  20. Корней

    Корней Гик

    Вроде хорошо, всего 121 мкс на семпл, 9 мс на БПФ, :cool: но на всякий случай немного посчитаем.
    1. 121 мкс на семпл - это частота выборки в 8кГц, что позволит нам работать с сигналом до 4кГц, что для работы с голосом достаточно. Но нам требуется обрабатывать два канала одновремено, а это уже почти 242 мкс на семпл, что вынудит нас работать с сигналом до 2кГц, а это уже ощутимо ограничивает наши возможности. Плюс мы получим задержку между выборками правого и левого канала всего в половину меньшую, чем период дискретизации да еще и соразмеримую с задержкой между сигналами каналов из-за "разности хода".:(
    2. 128 раз по 242 мкс плюс два БПФ по 9мс - 49мс - если ардуина больше ничем серьезным заниматься не будет, то сможет двадцать раз в секунду контролировать "эфир". Слово длительностью полсекунды, будет обработано раз 10.
    Выводы: общая производительность на грани допустимого, но проблема с задержкой между выборками левого и правого канала очень серьезна и с этой проблемой в первую очередь требуется что-то сделать.