Java 快速傅里叶变换在Arduino输入信号处理中的应用

Java 快速傅里叶变换在Arduino输入信号处理中的应用,java,c++,arduino,processing,Java,C++,Arduino,Processing,我一直在尝试从arduino话筒获取音频信号。首先,我将我的arduino设置为自由运行模式,然后等待Processing发送的消息(大写a)。当Processing发送串行信号时,我的arduino应发送回16个音频振幅样本。然后,处理将这16个音频样本以orden的形式通过快速傅里叶变换得到实时频谱。然而,我的Arduino似乎从未检测到大写字母A,而且,如果我试图在不等待大写字母A的情况下从我的Arduino发送样本,当Processing获得样本时,串行通信似乎出了问题。我尝试了许多ar

我一直在尝试从arduino话筒获取音频信号。首先,我将我的arduino设置为自由运行模式,然后等待Processing发送的消息(大写a)。当Processing发送串行信号时,我的arduino应发送回16个音频振幅样本。然后,处理将这16个音频样本以orden的形式通过快速傅里叶变换得到实时频谱。然而,我的Arduino似乎从未检测到大写字母A,而且,如果我试图在不等待大写字母A的情况下从我的Arduino发送样本,当Processing获得样本时,串行通信似乎出了问题。我尝试了许多arduinos和不同的串行电缆,以确保它没有问题。这是arduino代码:

// Arrays to save our results in

int values[16];


// Define various ADC prescaler
const unsigned char PS_16 = (1 << ADPS2);
const unsigned char PS_32 = (1 << ADPS2) | (1 << ADPS0);
const unsigned char PS_64 = (1 << ADPS2) | (1 << ADPS1);
const unsigned char PS_128 = (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0);

// Setup the serial port and pin 2
void setup() {
  Serial.begin(115200);
  pinMode(2, INPUT);

  // set up the ADC
  ADCSRA &= ~PS_128;  // remove bits set by Arduino library

  // you can choose a prescaler from above.
  // PS_16, PS_32, PS_64 or PS_128
  ADCSRA |= PS_64;    // set our own prescaler to 64 

}


void loop() {  
  unsigned int i;

  for(i=0;i<16;i++) {
      values[i] = analogRead(2);

  }

  if(Serial.available() > 0) {

    char c = Serial.read();
    if(c == 'A') { 
      for(i=0;i<16;i++) {
        Serial.println(values[i]);
      }
    }
  }
  delay(10);
}
这是处理代码:

import processing.serial.*;
import ddf.minim.analysis.*;
FFT fft;

Serial myPort;  // Create object from Serial class

void setup() 
{

  String portName = Serial.list()[0];
  myPort = new Serial(this, portName, 115200);
  size(800, 600);
  background(255);
  fft = new FFT(16, 16000);


}


String mensaje;

float[] magnitudes = new float[16];
int contador = 0;
byte request = true;
void draw()
{

  if(request) {
     myPort.write('A');//Solicita nuevos datos.
     request = false;
  } 
  while(!request) { 
    if(myPort.available()>0) {
       mensaje = myPort.readStringUntil(13);
       print(" mensaje: "+mensaje);
       if(mensaje != null){
         magnitudes[contador++] = int(mensaje);
       }
    }
    if(contador >= 15) {
      contador=0;
      fft.forward(magnitudes);
      request = true; 
      fill(100);
      rect(0,0,800,800);
      for (int i = 0; i < 15; i++) { 
         fill(200);
         rect(i*30+10, 0, 10, fft.getBand(i) * 0.1);
      }
    }
  }
}

非常感谢您的关注