macsbug

Just another WordPress.com site

FFT Audio Analyzer for Arduino MEGA + TFT 3.5int

leave a comment »

FFT アナライザーを製作。表示は、10KHz を入力したもの。

FFT_480

 

 

 

 

 

 

 

性能:最高 13KHz

準備するもの:

1. Arduino MEGA :8-bit  ATMEGA 2560 16MHz

2. TFT LCD Display:3.5int 480×320 Controler=R61581  airendo

3. 高感度マイクアンプキット:秋月電子通商

4. FFT:FHT Libraly  Open Music Labs 。FFT Libralyより速い。

5. TFT:UTFT Libraly  henningkarlsen.com/electronics

 

メモ:

1. Arduino UNO の場合は、TFT LCD Display も含めかなり速度が遅い。

2. Micro View の場合は、最高 5KHz 程度であった。ATMEGA328 16MHz +

3. Arduino DUE は、MEGAより高速だが、FFT Libraly が見つからなかった。

4. 充分な風波数帯域が得られない為、高速のCPUを使用する事が必要。

5. 他の装置(Kinoma Create)へ転送する場合は、高速なシリアル転送が必要。(I2C?)

6. iPad の FFT Analizer は、最高20KHz である。

7. マイクとアンプは、性能の高いものが必要。

 

感想:

1. 高速なArduinoが欲しい。対応する FFT Libralyも必要。

2. ソフトをもう少し工夫したい。

 

// MEGA FFT TFT35 ANALYZER  ORG 2014.09.15 s.ono
//                          Rev 2015.01.09
// FHT  http://www.openmusiclabs.com/2012/09/arduinofht-tastes-great-less-filling/
//      3.2mmsec 256point  40khz sampling
// UTFT http://henningkarlsen.com/electronics/library.php?id=52

// FFT
#define LOG_OUT 1      // use the log output function
#define FHT_N 256      // set to 256 point fht
#include <FHT.h>       // HI SPEED FFT
#include <UTFT.h>      // UTFT Routine
// TFT
extern uint8_t SmallFont[];                 // Small Font
extern uint8_t BigFont[];                   // Big   Font
extern uint8_t SevenSegNumFont[];           // SevenSegNumFont
UTFT   myGLCD(CTE35IPS,38,39,40,41);        // TFT set,Model=CTE35IPS
int bk = 222;                               // back color
int c = 0;
int buff[256];

void setup() {
 //Serial.begin(115200); // use the serial port
 // I/O setup(ANALOG IN) -----------------------------------------------
 pinMode(A0, INPUT);
 digitalWrite(A0,LOW);   // set Internal pull-up
 // FFT setup ----------------------------------------------------------
 TIMSK0 = 0;     // turn off timer0 for lower jitter
 ADCSRA = 0xe5;  // set the adc to free running mode
 ADMUX  = 0x40;  // use adc0
 DIDR0  = 0x01;  // turn off the digital input for adc0
 // TFT setup ----------------------------------------------------------
 myGLCD.InitLCD();                         // LCD Initialize
 myGLCD.setFont(SmallFont);                // Font : smallfont
 myGLCD.clrScr();                          // LCS Clear
 myGLCD.setColor(bk,bk,bk);                // panel background color
 myGLCD.fillRect(0, 0, 480, 320);          // panel all fill
 myGLCD.setColor(0, 0, 0);                 // moji color=white
 myGLCD.setBackColor(bk,bk,bk);            // moji background color
 myGLCD.print(" FFT Audio Analyzer", LEFT, 1);   // TITLE
}

void loop() {
  while(1) { // reduces jitter
    // FFT Routine -----------------------------------------------------
    cli();         // UDRE interrupt slows this way down on arduino1.0
    for (int i = 0 ; i < FHT_N ; i++) {   // save 256 samples
      while(!(ADCSRA & 0x10));            // wait for adc to be ready
      ADCSRA = 0xf5;                      // restart adc
      byte m = ADCL;                      // fetch adc L data
      byte j = ADCH;             // fetch adc H data</pre>
      int k = (j << 8) | m;               // form into an int
      k -= 0x0200;                        // form into a signed int
      k <<= 6;                            // form into a 16b signed int
      fht_input[i] = k;                   // put real data into bins
    }    
    fht_window(); // window the data for better frequency response
    fht_reorder(); // reorder the data before doing the fht
    fht_run(); // process the data in the fht
    fht_mag_log(); // take the output of the fht
    //sei();
    // FFT Caliblation data -------------------------------------------
    //c = c + 1;
    //if ( c == 8 ){
    // for (int i = 0; i < FHT_N/3; i++) {
    // buff[i] = fht_log_out[i]/4;
    // }
    //}
    // Display Routine -------------------------------------------------
    myGLCD.setColor(255,128,0);
    for (int i = 0; i < FHT_N/3; i++) { // x
       int x = 30; int y; int L = 300;
       y = L - fht_log_out[i]/3; // + buff[i]; // y
       myGLCD.setColor(255,255,255); // clear(black)
       myGLCD.fillRect((i*5)+x,L,(i*5)+x+5,30); // clear(black)
       myGLCD.setColor(255,0,0); // blue draw
       myGLCD.fillRect((i*5)+x,L,(i*5)+x+3,y); // blue draw
    //------------------------------------------------------------------
    }
  }
}

Written by macsbug

1月 10, 2015 @ 3:03 pm

カテゴリー: Arduino

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。