Arduino:Примеры/fft codec
Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску
Содержание | Знакомство с Arduino | Продукты | Основы | Справочник языка Arduino | Примеры | Библиотеки | Хакинг | Изменения | Сравнение языков Arduino и Processing |
Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.
Применение БПФ на данных от модуля Codec Shield[1]
Это скетч для библиотеки FFT, который при помощи платы Arduino считывает данные с модуля Codec Shield, а затем обрабатывает их при помощи алгоритма БПФ (быстрое преобразование Фурье).
Код
/*
Применение БПФ на данных от модуля Codec Shield
Создан пользователем guest на openmusiclabs.com
Дата создания – 18 августа 2012 года. Скетч предназначен
для запуска БПФ на данных, собранных при помощи модуля Codec Shield.
Он отсылает 128 выходных отсчетов с данными
по последовательному порту на скорости 115,2 к/бит.
Для визуализации данных есть специальный патч на PureData.
Примечание: обязательно загрузите последнюю версию
библиотеки AudioCodec, если нынешняя версия ниже 8.16.12. Там есть
модификации, благодаря которым код может быть вне прерывания.
*/
#define SAMPLE_RATE 44 // 44.1 КГц
#define ADCS 0 // АЦП не используются
#define LOG_OUT 1 // включаем функцию для логарифмического формата
#define FFT_N 256 // задаем количество выходных отсчетов на 256
// подключаем нужные библиотеки:
#include "FFT.h"
#include <Wire.h>
#include <SPI.h>
#include <AudioCodec.h>
// создаем переменные для передачи звука:
int left_in = 0x0000;
int left_out = 0x0000;
int right_in = 0x0000;
int right_out = 0x0000;
unsigned int count = 0;
volatile byte flag = 1;
void setup() {
Serial.begin(115200); // активируем последовательный порт
AudioCodec_init();
}
void loop() {
while(1) { // уменьшаем джиттер
while(flag); // ждем, пока соберутся отсчеты
fft_window(); // запускаем функцию-окно
fft_reorder(); // реорганизовываем данные перед запуском БПФ
fft_run(); // обрабатываем данные в БПФ
fft_mag_log(); // извлекаем данные, обработанные БПФ
Serial.write(255); // отсылаем стартовый байт
Serial.write(fft_log_out, FFT_N/2); // отсылаем данные
flag = 1; // говорим кодеку, что обработка готова
}
}
// функция для прерывания timer1 – тут собираются данные:
ISR(TIMER1_COMPA_vect) { // сохраняем регистры (аргумент NAKED удален)
// перед переменными типа «***_in» нужен знак «&»:
AudioCodec_data(&left_in, &right_in, left_out, right_out);
left_out = left_in; // передаем аудио
right_out = right_in;
if (flag) { // проверяем, готов ли БПФ к новым данным
fft_input[count] = left_in; // записываем действительные числа в четные отсчеты
fft_input[count + 1] = 0; // записываем нули в нечетные отсчеты
count += 2; // переходим к следующему отсчету
if (count >= FFT_N*2) { // проверяем, заполнены ли все отсчеты
flag = 0; // запускаем БПФ
count = 0; // сбрасываем счетчик отсчетов
}
}
}