Вход/Регистрация
Программируем Arduino. Основы работы со скетчами
вернуться

Монк Саймон

Шрифт:

13. Цифровая обработка сигналов

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

Введение в цифровую обработку сигналов

Принимая информацию с датчика, вы фактически измеряете сигнал. Сигналы принято отображать в виде линии (обычно извилистой), идущей слева направо с течением времени. Именно так отображаются электрические сигналы на экране осциллографа. Ось y отражает амплитуду сигнала (его силу), а ось x — время. На рис. 13.1 изображен сигнал, соответствующий воспроизведению музыкального фрагмента длительностью 1/4 секунды, который был захвачен с помощью осциллографа.

Вы можете заметить некоторую цикличность сигнала. Скорость повторения циклов называют частотой. Она измеряется в герцах (Гц). Сигнал с частотой 1 Гц повторяет цикл со скоростью 1 раз в секунду, с частотой 10 Гц — 10 раз в секунду. Взгляните на сигнал в левой половине рис. 13.1 — один цикл сигнала длится примерно 0,6 квадрата координатной

Рис. 13.1. Сигнал от источника музыки

сетки. Так как при настройке осциллографа размер стороны квадрата по оси x был выбран равным 25 мс, частота этой части сигнала составляет 1/(0,6 x 0,025) = 67 Гц. Если увеличить масштаб, выбрав более короткий промежуток времени, можно будет увидеть множество других частотных составляющих звука, подмешивающихся к основному сигналу. Если сигнал не является чистой синусоидой (как показано далее на рис. 13.5), он всегда будет включать в себя целый спектр гармоник.

Сигнал, изображенный на рис. 13.1, можно попытаться захватить с использованием одного из аналоговых входов на плате Arduino. Этот прием называется оцифровкой, потому что в ходе его реализации аналоговый сигнал переводится в цифровую форму. Чтобы получить довольно точную копию оригинального сигнала, замеры нужно выполнять очень быстро.

Суть цифровой обработки сигналов (Digital Signal Processing, DSP) заключается в том, чтобы оцифровать сигнал с помощью аналого-цифрового преобразователя (АЦП), выполнить некоторые манипуляции с ним и затем сгенерировать выходной аналоговый сигнал с помощью цифроаналогового преобразователя (ЦАП). Самое современное звуковое оборудование, MP3-плееры и сотовые телефоны используют цифровую обработку сигналов для частотной коррекции, управляя относительной мощностью высоких и низких частот при воспроизведении музыкальных произведений. Однако иногда не требуется выводить измененную версию входного сигнала, когда цифровая обработка нужна, только чтобы убрать из сигнала нежелательные помехи и тем самым получить от датчика более точное значение.

В общем случае платы Arduino — не самые лучшие устройства для цифровой обработки сигналов. Они не способны захватывать аналоговый ввод с высокой скоростью, а их аналоговые выходы ограничены возможностями технологии широтно-импульсной модуляции (ШИМ). Исключение составляет модель Arduino Due, которая имеет несколько АЦП, быстрый процессор и два истинных ЦАП. То есть модель Due обладает достаточными аппаратными возможностями для того, чтобы ее можно было использовать для оцифровки звукового стереосигнала и выполнения каких-то манипуляций с ним.

Усреднение замеров

При чтении сигнала с датчика часто обнаруживается, что лучших результатов можно добиться, выполняя усреднение по нескольким замерам. Одно из возможных решений этой задачи — использование циклического буфера (рис. 13.2).

При использовании циклического буфера каждый новый замер сохраняется в ячейке буфера с текущим индексом, после чего индекс увеличивается на единицу. Когда будет заполнена последняя ячейка, значение индекса обнулится, и новые замеры начнут записываться поверх старых. Следуя

Рис. 13.2. Циклический буфер

этой методике, вы всегда будете иметь N последних замеров, где N — это размер буфера.

Следующий фрагмент реализует циклический буфер:

// sketch_13_01_averaging

const int samplePin = A1;

const int bufferSize = 10;

int buffer[bufferSize];

int index;

void setup

{

Serial.begin(9600);

}

void loop

{

int reading = analogRead(samplePin);

addReading(reading);

Serial.println(average);

delay(1000);

}

void addReading(int reading)

{

buffer[index] = reading;

index++;

if (index >= bufferSize) index = 0;

}

int average

{

long sum = 0;

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

{

sum += buffer[i];

}

return (int)(sum / bufferSize);

}

  • Читать дальше
  • 1
  • ...
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: