问题描述
对于一个 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 (将#修改为@)