Cat hungry.png
Здравствуйте! Собираем деньги на перевод материалов по электронике(https://www.allaboutcircuits.com/education/). Реквизиты указаны здесь.

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

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

Перевод: Максим Кузьмин (Cubewriter)
Перевел 2686 статей для сайта.

Контакты:

Проверка/Оформление/Редактирование: Мякишев Е.А.


Применение БПФ на данных от модуля Codec Shield[1]

Это скетч для библиотеки FFT, который при помощи платы Arduino считывает данные с модуля Codec Shield, а затем обрабатывает их при помощи алгоритма БПФ (быстрое преобразование Фурье).

Код

  1.  
  2. /*
  3. Применение БПФ на данных от модуля Codec Shield
  4.  
  5. Создан пользователем guest на openmusiclabs.com
  6. Дата создания – 18 августа 2012 года. Скетч предназначен 
  7. для запуска БПФ на данных, собранных при помощи модуля Codec Shield.
  8.  
  9. Он отсылает 128 выходных отсчетов с данными 
  10. по последовательному порту на скорости 115,2 к/бит.
  11. Для визуализации данных есть специальный патч на PureData.
  12.  
  13. Примечание: обязательно загрузите последнюю версию
  14. библиотеки AudioCodec, если нынешняя версия ниже 8.16.12. Там есть 
  15. модификации, благодаря которым код может быть вне прерывания.
  16. */
  17.  
  18. #define SAMPLE_RATE 44 // 44.1 КГц
  19. #define ADCS 0 // АЦП не используются
  20. #define LOG_OUT 1 // включаем функцию для логарифмического формата
  21. #define FFT_N 256 // задаем количество выходных отсчетов на 256 
  22.  
  23. // подключаем нужные библиотеки:
  24. #include "FFT.h"
  25. #include <Wire.h>
  26. #include <SPI.h>
  27. #include <AudioCodec.h>
  28.  
  29. // создаем переменные для передачи звука:
  30. int left_in = 0x0000;
  31. int left_out = 0x0000;
  32. int right_in = 0x0000;
  33. int right_out = 0x0000;
  34. unsigned int count = 0;
  35. volatile byte flag = 1;
  36.  
  37. void setup() {
  38.   Serial.begin(115200); // активируем последовательный порт
  39.   AudioCodec_init();
  40. }
  41.  
  42. void loop() {
  43.   while(1) { // уменьшаем джиттер
  44.     while(flag); // ждем, пока соберутся отсчеты
  45.     fft_window(); // запускаем функцию-окно
  46.     fft_reorder(); // реорганизовываем данные перед запуском БПФ
  47.     fft_run(); // обрабатываем данные в БПФ
  48.     fft_mag_log(); // извлекаем данные, обработанные БПФ
  49.     Serial.write(255); // отсылаем стартовый байт 
  50.     Serial.write(fft_log_out, FFT_N/2); // отсылаем данные 
  51.     flag = 1; // говорим кодеку, что обработка готова
  52.   }
  53. }
  54.  
  55. // функция для прерывания timer1 – тут собираются данные:
  56. ISR(TIMER1_COMPA_vect) { // сохраняем регистры (аргумент NAKED удален)
  57.  
  58.   // перед переменными типа «***_in» нужен знак «&»:
  59.   AudioCodec_data(&left_in, &right_in, left_out, right_out);
  60.   left_out = left_in; // передаем аудио
  61.   right_out = right_in;
  62.   if (flag) { // проверяем, готов ли БПФ к новым данным
  63.     fft_input[count] = left_in; // записываем действительные числа в четные отсчеты
  64.     fft_input[count + 1] = 0; // записываем нули в нечетные отсчеты
  65.     count += 2; // переходим к следующему отсчету
  66.     if (count >= FFT_N*2) { // проверяем, заполнены ли все отсчеты 
  67.       flag = 0; // запускаем БПФ
  68.       count = 0; // сбрасываем счетчик отсчетов
  69.     }
  70.   }
  71. }

См.также

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

  1. wiki.openmusiclabs.com - fft_codec.pde