2014年1月9日木曜日

ArduinoでFFT(8bit int)

ハンダ付け作業台、4980円

もちろん(と威張って言うことではないのですが)自分では書けないので、あちこちで公開されているライブラリを漁ってみたのですが…私の目的に一番フィットしていたのがこれでした。
  Modified 8bit FFT in c
Webに貼ってあるfix_fft.hとfix_fft.cppをテキストにしてArduinoライブラリフォルダに入れておく。それからArduino IDEを起動しSketchで以下のようなコードを実行(「マイコンボードへの書き込みが完了しました」という表示が出たところで、すぐにツール>シリアルモニタを開き、ボーレートが違っていたら57600に設定する)すると、意図したようなスペクトル数列が得られました。
#include <fix_fft.h>
char im[128];
char data[128];
char buf[20];

void setup() {
  Serial.begin(57600);
}

void loop(){
  int  i;
  char buf[6];
  for (i = 0; i < 128; i++) {
    //  data[i] = (i % 16) * 16 - 120;  // 三角波  
    //  data[i] = (((i >> 4) & 1) * 255) - 128;  // 方形波
    // 2つの正弦波を合成した波形
    float d = (float)i * (PI * 2.00) / 128.00;   // ラジアンへ変換:dは0〜2pi
    float f = (sin(d * 2.00) * 0.66 + sin(d * 30.00) * 0.33) * 127.00;  // 2fと30fの正弦波
    data[i] = f;
 
    // 虚数部をクリア
    im[i]   = 0;
  }
  Serial.println("");
  dispData("Source  : ", data, 128);
  Serial.println("");

  fix_fft(data, im, 7, 0);  // full scale 2^7=128, FFT mode

  for (i = 0; i < 64; i++) {
    data[i] = sqrt(data[i] * data[i] + im[i] * im[i]);
  }

  dispData("Results : ", data, 64);
  Serial.println("");
  while(1) ;
}

void dispData(char *inMsg, char *inData, int inN) {
  Serial.print(inMsg);
  for (int i = 0; i < inN; i++) {
    sprintf(buf, "%5d", inData[i]);
    Serial.print(buf);
  }
}

よかった良かった。ここ数日これに睡眠時間を削られていたので、安眠できます。

…でも、中学生ぐらいからずっと欲しかったハンダ付け作業台が昨日Amazonから届いたので、やっぱり睡眠不足は続く予感:-)

0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。