Arduino:Примеры/fft adc serial
Перейти к навигации
Перейти к поиску
Поддержать проект | Содержание | Знакомство с Arduino | Продукты | Основы | Справочник языка Arduino | Примеры | Библиотеки | Хакинг | Изменения | Сравнение языков Arduino и Processing |
Перевод: Максим Кузьмин (Cubewriter) Контакты:</br>* Skype: cubewriter</br>* E-mail: cubewriter@gmail.com</br>* Максим Кузьмин на freelance.ru
Проверка/Оформление/Редактирование: Мякишев Е.А.
Содержание
Применение БПФ на данных от АЦП и отправка результата посредством println()[1]
Это скетч для библиотеки FFT, который при помощи платы Arduino считывает данные с АЦП (аналогово-цифрового преобразователя), а затем обрабатывает их при помощи алгоритма БПФ (быстрое преобразование Фурье).
Для передачи данных по последовательному порту используется цикл for() и функция println().
Код
1
2 /*
3 Применение БПФ на данных от АЦП и отправка результата через printIn()
4
5 Создан пользователем guest на openmusiclabs.com
6 Дата создания – 7 июля 2014 года.
7 Скетч предназначен для тестирования библиотеки FFT.
8
9 Он берет данные у adc0 (0—ой аналоговый контакт), а затем
10 обрабатывает их при помощи БПФ. Данные отправляются
11 по последовательному порту на скорости 115,2 килобит.
12 */
13
14 #define LOG_OUT 1 // включаем функцию для логарифмического формата
15 #define FFT_N 256 // задаем количество выходных отсчетов на 256
16
17 #include <FFT.h> // подключаем библиотеку
18
19 void setup() {
20 Serial.begin(115200); // запускаем последовательный порт
21 TIMSK0 = 0; // выключаем timer0, чтобы уменьшить джиттер
22 ADCSRA = 0xe5; // задаем для АЦП автономный режим работы
23 ADMUX = 0x40; // используем adc0
24 DIDR0 = 0x01; // выключаем цифровой вход для adc0
25 }
26
27 void loop() {
28 while(1) { // уменьшаем джиттер
29 cli(); // на Arduino 1.0 со снижением хорошо справляются прерывания UDRE
30 for (int i = 0 ; i < 512 ; i += 2) { // сохраняем 256 отчетов
31 while(!(ADCSRA & 0x10)); // ждем, когда АЦП будет готов
32 ADCSRA = 0xf5; // перезапускаем АЦП
33 byte m = ADCL; // считываем данные АЦП
34 byte j = ADCH;
35 int k = (j << 8) | m; // конвертируем в данные типа int
36 k -= 0x0200; // конвертируем в данные типа int со знаком
37 k <<= 6; // конвертируем в 16-битные данные типа int со знаком
38 fft_input[i] = k; // сохраняем действительные значения в четные отсчеты
39 fft_input[i+1] = 0; // задаем нечетным отсчетам значение «0»
40 }
41 fft_window(); // функция-окно, повышающая частотное разрешение
42 fft_reorder(); // реорганизовываем данные перед запуском БПФ
43 fft_run(); // обрабатываем данные в БПФ
44 fft_mag_log(); // извлекаем данные, обработанные БПФ
45 sei();
46 Serial.println("start"); // "Старт"
47 for (byte i = 0 ; i < FFT_N/2 ; i++) {
48 Serial.println(fft_log_out[i]); // отсылаем данные
49 }
50 }
51 }
См.также
Внешние ссылки