Arduino Uno 将 FFT 音频转换为 LED 和振动电机问题

问题描述

对于一个 uni 项目,我试图将频率转换为 4 个不同的振动电机 我订购了 MSGEQ7,但它们很难买到,而且订购过程需要很长时间,因此我暂时选择了 FFT 路线。

我首先尝试使用 LED 作为不同频率范围的输出进行 FFT 转换,因为它应该更简单并提供视觉反馈。 我向一位朋友寻求帮助,他编写了一些有效的代码。然而,它不会输出到有问题的 LED,但根据监视器,它会正确拾取频率。有谁知道代码有什么问题? 我怎样才能使用这个 FFT 读数来触发振动电机而不是板上的 LED 引脚?

我很困惑这是否可以与 Arduino Uno 一起使用,因为我读到 Uno 不可能实时转换 FFT。我认为这就是样本量非常小的原因。我是否需要经常重启董事会?

非常感谢!

#define SAMPLES 128 //define according to your need
#define AUdio A0
#define ledLowsGreen A1
#define ledLowMidsYellow A2
#define ledMidsBlue A3
#define ledHighMidsWhite A4
#define ledHighsRed A5

// array of leds to switch the values
int ledarray[5] = { A1,A2,A3,A4,A5 };
// value to compile the data into 128 / dividor
int dividor = 21;
char im[SAMPLES];
char data[SAMPLES];
int barht[SAMPLES];

void setup()
{
  Serial.begin(9600);
  pinMode(ledLowsGreen,OUTPUT);
  pinMode(ledLowMidsYellow,OUTPUT);
  pinMode(ledMidsBlue,OUTPUT);
  pinMode(ledHighMidsWhite,OUTPUT);
  pinMode(ledHighsRed,OUTPUT);
}

void loop()
{
  static int i,j;
  int val;
  // get audio data
  for (i = 0; i < SAMPLES; i++)
  {
    val = analogRead(AUdio); // 0-1023
    data[i] = (char)(val / 4 - SAMPLES); // store as char
    im[i] = 0; // init all as 0
  }
  // run FFT
  fix_fft(data,im,7,0);
  // extract absolute value of data only,for 32 results
  for (i = 0; i < SAMPLES; i++)
  {
    barht[i] = (int)sqrt(data[i] * data[i] + im[i] * im[i]);
  }

  for (i = 0,j = 0; i < SAMPLES / dividor; i++,j += dividor)
  {
    for (int x = 0 ; x < dividor; x++)
    {
      barht[i] = barht[i] + (barht[j + x]);
    }
  }

// display 5 leds
for (int k = 1; k < SAMPLES / dividor; k++) {
      analogWrite(ledarray[5],barht[k]);
     }


  // display Serial plotter
  for (int k = 1; k < SAMPLES / dividor; k++) {
    Serial.print("Band_");
    Serial.print(k);
    Serial.print(":");
    if ( k + 1 == (SAMPLES / dividor))
    {
      Serial.println();
      break;
    }
    else
    {
      Serial.print(",");
    }
  }

  for (int k = 1; k < SAMPLES / dividor; k++) {
    Serial.print(barht[k]);
    //analogWrite(ledarray[5],barht[k])
    if ( k + 1 == (SAMPLES / dividor))
    {
      Serial.println();
      break;
    }
    else
    {
      Serial.print(",");
    }
  }
}```

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)