Arduino:Примеры/fft codec

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Перевод: Максим Кузьмин (Cubewriter) Контакты:</br>* Skype: cubewriter</br>* E-mail: cubewriter@gmail.com</br>* Максим Кузьмин на freelance.ru
Проверка/Оформление/Редактирование: Мякишев Е.А.


Применение БПФ на данных от модуля 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; // сбрасываем счетчик отсчетов
    }
  }
}

См.также

Внешние ссылки