Arduino:Примеры/fft adc
Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску
Содержание | Знакомство с Arduino | Продукты | Основы | Справочник языка Arduino | Примеры | Библиотеки | Хакинг | Изменения | Сравнение языков Arduino и Processing |
Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.
Применение БПФ на данных от АЦП и отправка результата посредством write()[1]
Это скетч для библиотеки FFT, который при помощи платы Arduino считывает данные с АЦП (аналогово-цифрового преобразователя), а затем обрабатывает их при помощи алгоритма БПФ (быстрое преобразование Фурье).
Для передачи данных по последовательному порту используется функция write().
Код
/*
Применение БПФ на данных от АЦП и отправка результата через write()
Создан пользователем guest на openmusiclabs.com
Дата создания – 18 августа 2012 года.
Скетч предназначен для тестирования библиотеки FFT.
Он берет данные у adc0 (0—ой аналоговый контакт), а затем
обрабатывает их при помощи БПФ. Данные отправляются
по последовательному порту на скорости 115,2 килобит.
Для визуализации данных есть специальный патч на PureData.
*/
#define LOG_OUT 1 // включаем функцию для логарифмического формата
#define FFT_N 256 // задаем количество выходных отсчетов на 256
#include <FFT.h> // подключаем библиотеку
void setup() {
Serial.begin(115200); // запускаем последовательный порт
TIMSK0 = 0; // выключаем timer0, чтобы уменьшить джиттер
ADCSRA = 0xe5; // задаем для АЦП автономный режим работы
ADMUX = 0x40; // используем adc0
DIDR0 = 0x01; // выключаем цифровой вход для adc0
}
void loop() {
while(1) { // уменьшаем джиттер
cli(); // на Arduino 1.0 со снижением хорошо справляются прерывания UDRE
for (int i = 0 ; i < 512 ; i += 2) { // сохраняем 256 отчетов
while(!(ADCSRA & 0x10)); // ждем, когда АЦП будет готов
ADCSRA = 0xf5; // перезапускаем АЦП
byte m = ADCL; // считываем данные АЦП
byte j = ADCH;
int k = (j << 8) | m; // конвертируем в данные типа int
k -= 0x0200; // конвертируем в данные типа int со знаком
k <<= 6; // конвертируем в 16-битные данные типа int со знаком
fft_input[i] = k; // сохраняем действительные значения в четные отсчеты
fft_input[i+1] = 0; // задаем нечетным отсчетам значение «0»
}
fft_window(); // функция-окно, повышающая частотное разрешение
fft_reorder(); // реорганизовываем данные перед запуском БПФ
fft_run(); // обрабатываем данные в БПФ
fft_mag_log(); // извлекаем данные, обработанные БПФ
sei();
Serial.write(255); // отсылаем стартовый байт
Serial.write(fft_log_out, 128); // отсылаем данные
}
}