Java 快速傅里叶变换在Arduino输入信号处理中的应用
我一直在尝试从arduino话筒获取音频信号。首先,我将我的arduino设置为自由运行模式,然后等待Processing发送的消息(大写a)。当Processing发送串行信号时,我的arduino应发送回16个音频振幅样本。然后,处理将这16个音频样本以orden的形式通过快速傅里叶变换得到实时频谱。然而,我的Arduino似乎从未检测到大写字母A,而且,如果我试图在不等待大写字母A的情况下从我的Arduino发送样本,当Processing获得样本时,串行通信似乎出了问题。我尝试了许多arduinos和不同的串行电缆,以确保它没有问题。这是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
// 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);
}
}
}
}
非常感谢您的关注那么为什么C++被标记?16点FFT?这将为您提供8个频率箱。即使您的采样率低至8 Khz,奈奎斯特频率为4 Khz,每个箱子仍然是500 Hz宽。谢谢您的回答。C++是标记的,因为据我所知,ARDUNO IDE是基于C++代码的,所以我认为,我的问题可能与C++语法有关。例如,我同意MalSter,对于每个bin来说,这将是一个大的范围。然而,我开始尝试只有16个样本中的一小部分,因为我认为这会使程序更快。计划是在我可以运行代码并查看它有多快之后增加垃圾箱的数量。我尝试使用adafruit中提供的spectrum.py程序,该程序打算与teensyduino一起运行,但“刷新”有点慢。