В заключение
В этой главе мы познакомились с разными способами подключения платы Arduino к сети и выполнения некоторых сетевых операций с использованием плат расширения Ethernet и WiFi. Здесь вы также узнали, как использовать Arduino в качестве веб-сервера и веб-клиента.
В следующей главе вы познакомитесь с цифровой обработкой сигналов (Digital Signal Processing, DSP) с помощью Arduino.
13. Цифровая обработка сигналов
Плата Arduino способна выполнять простую обработку сигналов. В этой главе обсуждаются разные способы такой обработки, от фильтрации сигнала, поступающего на аналоговый вход, с применением программного обеспечения вместо внешних электронных устройств до вычисления относительной величины различных частотных сигналов с применением быстрого преобразования Фурье.
Введение в цифровую обработку сигналов
Принимая информацию с датчика, вы фактически измеряете сигнал. Сигналы принято отображать в виде линии (обычно извилистой), идущей слева направо с течением времени. Именно так отображаются электрические сигналы на экране осциллографа. Ось y отражает амплитуду сигнала (его силу), а ось x — время. На рис. 13.1 изображен сигнал, соответствующий воспроизведению музыкального фрагмента длительностью 1/4 секунды, который был захвачен с помощью осциллографа.
Вы можете заметить некоторую цикличность сигнала. Скорость повторения циклов называют частотой. Она измеряется в герцах (Гц). Сигнал с частотой 1 Гц повторяет цикл со скоростью 1 раз в секунду, с частотой 10 Гц — 10 раз в секунду. Взгляните на сигнал в левой половине рис. 13.1 — один цикл сигнала длится примерно 0,6 квадрата координатной
Рис. 13.1. Сигнал от источника музыки
сетки. Так как при настройке осциллографа размер стороны квадрата по оси x был выбран равным 25 мс, частота этой части сигнала составляет 1/(0,6 × 0,025) = 67 Гц. Если увеличить масштаб, выбрав более короткий промежуток времени, можно будет увидеть множество других частотных составляющих звука, подмешивающихся к основному сигналу. Если сигнал не является чистой синусоидой (как показано далее на рис. 13.5), он всегда будет включать в себя целый спектр гармоник.
Сигнал, изображенный на рис. 13.1, можно попытаться захватить с использованием одного из аналоговых входов на плате Arduino. Этот прием называется оцифровкой, потому что в ходе его реализации аналоговый сигнал переводится в цифровую форму. Чтобы получить довольно точную копию оригинального сигнала, замеры нужно выполнять очень быстро.
Суть цифровой обработки сигналов (Digital Signal Processing, DSP) заключается в том, чтобы оцифровать сигнал с помощью аналого-цифрового преобразователя (АЦП), выполнить некоторые манипуляции с ним и затем сгенерировать выходной аналоговый сигнал с помощью цифроаналогового преобразователя (ЦАП). Самое современное звуковое оборудование, MP3-плееры и сотовые телефоны используют цифровую обработку сигналов для частотной коррекции, управляя относительной мощностью высоких и низких частот при воспроизведении музыкальных произведений. Однако иногда не требуется выводить измененную версию входного сигнала, когда цифровая обработка нужна, только чтобы убрать из сигнала нежелательные помехи и тем самым получить от датчика более точное значение.
В общем случае платы Arduino — не самые лучшие устройства для цифровой обработки сигналов. Они не способны захватывать аналоговый ввод с высокой скоростью, а их аналоговые выходы ограничены возможностями технологии широтно-импульсной модуляции (ШИМ). Исключение составляет модель Arduino Due, которая имеет несколько АЦП, быстрый процессор и два истинных ЦАП. То есть модель Due обладает достаточными аппаратными возможностями для того, чтобы ее можно было использовать для оцифровки звукового стереосигнала и выполнения каких-то манипуляций с ним.
Усреднение замеров
При чтении сигнала с датчика часто обнаруживается, что лучших результатов можно добиться, выполняя усреднение по нескольким замерам. Одно из возможных решений этой задачи — использование циклического буфера (рис. 13.2).
При использовании циклического буфера каждый новый замер сохраняется в ячейке буфера с текущим индексом, после чего индекс увеличивается на единицу. Когда будет заполнена последняя ячейка, значение индекса обнулится, и новые замеры начнут записываться поверх старых. Следуя
Рис. 13.2. Циклический буфер