Программируем Arduino. Профессиональная работа со скетчами. - [59]

Шрифт
Интервал

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

Алгоритм расчета частотной области из данных временной области сигнала называется быстрым преобразованием Фурье (БПФ). В вычислениях преобразования используются комплексные числа, и его реализация — задача не для слабых духом, если только вы не увлекаетесь математикой.


Рис. 13.10. Сигнал во временной и частотной областях


К счастью для нас, умные люди часто готовы поделиться своим кодом. Вы можете загрузить из Интернета функцию, выполняющую быстрое преобразование Фурье. Пример кода, который использовал я, не организован в библиотеку — он распространяется в виде двух файлов: заголовочного файла и файла реализации (с расширением .h и .cpp соответственно). Чтобы воспользоваться им, просто сохраните оба файла в папку со скетчем. Они находятся в пакете примеров, сопровождающем книгу, поэтому их не придется загружать из Интернета. Впервые код появился в статье на форуме Arduino (http://forum.arduino.cc/index.php/topic,38153.0.html). Эти же два файла можно найти в составе других примеров на следующих веб-сайтах: https://code.google.com/p/arduino-integer-fft/ и https://github.com/slytown/arduino-spectrum-analyzer/.

Следующие два примера иллюстрируют код, действующий в плате Arduino Uno и выполняющий замеры аудиосигнала.


Пример анализатора спектра

Этот пример плата Arduino Uno использует для получения текстового отображения частотного спектра. Исходный код можно найти в скетче sketch_13_06_FFT_Spectrum. Скетч слишком длинный, чтобы воспроизводить его здесь целиком, поэтому я буду демонстрировать лишь некоторые его фрагменты. Откройте скетч в Arduino IDE, чтобы заглядывать в него в ходе обсуждения.

Алгоритм БПФ использует два массива типа char. Этот тип выбран вместо типа byte по той простой причине, что в Arduino C тип byte представляет однобайтовые целые числа без знака, тогда как сигнал, подлежащий преобразованию, как предполагается, будет колебаться относительно значения 0. После применения алгоритма БПФ массив data будет содержать мощность каждой частотной составляющей в заданном диапазоне. Диапазон частот зависит от частоты выполнения замеров. Данный скетч выполняется с максимальной скоростью, на которую только способна плата Uno, и обеспечивает анализ полосы частот с верхней границей около 15 кГц, что для каждого из 63 равномерно распределенных частотных интервалов дает ширину 240 Гц.

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

ADCSRA &= ~PS_128;  // сбросить масштаб 128

ADCSRA |= PS_16;    // добавить масштаб 16 (1 МГц)

Функция loop содержит совсем немного кода:

void loop()

{

  sampleWindowFull();

  fix_fft(data, im, 7, 0);

  updateData();

  showSpectrum();

}

Функция sampleWindowFull заполняет временное окно 128 замерами данных. Я расскажу о ней чуть позже. Затем к данным применяется алгоритм БПФ. Параметр 7 — это логарифм по основанию 2 от числа замеров. Это значение всегда будет равно 7. Параметр 0 — это признак инверсии, который также всегда будет равен 0, что означает false. После применения алгоритма БПФ производится обновление значений в массивах. В заключение вызывается функция showSpectrum, отображающая частотную информацию.

Функция sampleWindowFull читает значение аналогового входа 128 раз и предполагает, что сигнал колеблется относительно средней точки 2,5 В, поэтому она вычитает 512 из прочитанного значения, в результате чего может получиться положительное или отрицательное значение. Затем оно масштабируется константой GAIN, чтобы немного усилить слабые сигналы. Далее 10-битный замер делением на 4 преобразуется в 8-битное значение, чтобы можно было уместить его в массив типа char. Массив im хранит мнимую часть сигнала, установленную в 0. Это внутренняя особенность алгоритма; желающие больше узнать об этом могут обратиться к статье https://ru.wikipedia.org/wiki/Быстрое_преобразование_Фурье.

void sampleWindowFull()

{

  for (int i = 0; i < 128; i++)

  {

    int val = (analogRead(analogPin) — 512) * GAIN;

    data[i] = val / 4;

    im[i] = 0;

  }

}

Функция updateData вычисляет амплитуду в каждом частотном интервале. Сила сигнала вычисляется как длина гипотенузы прямоугольного тре­угольника, двумя другими сторонами которого являются действительная и мнимая части сигнала (практическое применение теоремы Пифагора!):

void updateData()

{

  for (int i = 0; i < 64; i++)

  {

    data[i] = sqrt(data[i] * data[i] + im[i] * im[i]);

  }

}

Результаты выводятся в монитор последовательного порта в одну строку через запятую. Первое значение игнорируется, потому что содержит постоянную составляющую сигнала и обычно не представляет интереса.

Массив data можно было бы использовать, например, для управления высотой столбиков диаграммы на жидкокристаллическом дисплее. Подключить источник сигнала (например, аудиовыход MP3-плеера) можно с помощью той же схемы, обеспечивающей колебание сигнала относительно средней точки 2,5 В, что была показана ранее, на рис. 13.4.


Рекомендуем почитать
Удаление предустановленной Windows 8

На первый взгляд процедура удаления Windows 8 ничем не отличается от вполне обычного форматирования винчестера с последующей установкой системы. К сожалению, все гораздо сложней.


Работаем на нетбуке. Начали!

Вы приобрели нетбук? И теперь хотите понять, чем он отличается от привычного всем ноутбука? Тогда вы держите в руках действительно необходимую книгу. Прочитав ее, вы не только освоите все тонкости, относящиеся к работе с нетбуками, но и узнаете о том, как работать на компьютере. Вы научитесь выбирать мобильный компьютер и аксессуары к нему, узнаете, как установить и настроить операционную систему, научитесь пользоваться пакетом Microsoft Office, выясните, какие программы следует иметь на жестком диске, как защитить сам ноутбук и данные на нем, можно ли модернизировать нетбук и что делать в случае его поломки.


1001 совет по обустройству компьютера

В книге собраны и обобщены советы по решению различных проблем, которые рано или поздно возникают при эксплуатации как экономичных нетбуков, так и современных настольных моделей. Все приведенные рецепты опробованы на практике и разбиты по темам: аппаратные средства персональных компьютеров, компьютерные сети и подключение к Интернету, установка, настройка и ремонт ОС Windows, работа в Интернете, защита от вирусов. Рассмотрены не только готовые решения внезапно возникающих проблем, но и ответы на многие вопросы, которые возникают еще до покупки компьютера.


Ноутбук для начинающих. Мобильно, доступно, удобно

В книге даны детальные рекомендации по выбору и покупке ноутбука. Приведены описания работы, настройки и ремонта компонентов мобильного компьютера – винчестера, карты Wi-Fi, PCMCIA, ЖК-экрана и т. д. Читатель найдет в ней подробные рекомендации по ускорению работы мобильных компьютеров с операционными системами Windows 98, Windows XP и Windows Vista, а также пути решения проблем при поломках, попадании ноутбука в воду, заражении вирусами, сбоях программ. Даны полезные советы по увеличению времени работы от батареи, настройкам, доступу в Интернет.


Элементы схемотехники цифровых устройств обработки информации

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


Wi-Fi: Все, что Вы хотели знать, но боялись спросить

Жизнь современного человека — это движение. Мобильность для нас становится одним из самых важных моментов для работы, для общения, для жизни. Многие из нас сейчас уже не представляют жизнь без сотовых телефонов, которые из средства роскоши превратились в предмет, без которого жизнь современного человека стала просто немыслима. Многие уже оценили все преимущества Bluetooth, GPRS. Эти устройства превратили наши телефоны из средств связи в незаменимых помощников в работе. К сожалению, один из самых главных недостатков этих беспроводных технологий — малый радиус действия и низкая скорость передачи данных, что сейчас становится очень важным фактором для всех нас.