【发布时间】:2015-08-13 04:45:33
【问题描述】:
我正在尝试使用 Arduino FFT library 根据以下代码过滤一些数据以进行 FFT(快速傅立叶变换)
/*
fft_adc_serial.pde
guest openmusiclabs.com 7.7.14
example sketch for testing the fft library.
it takes in data on ADC0 (Analog0) and processes them
with the fft. the data is sent out over the serial
port at 115.2kb.
*/
#define LOG_OUT 1 // use the log output function
#define FFT_N 256 // set to 256 point fft
#include <FFT.h> // include the library
void setup() {
Serial.begin(115200); // use the serial port
TIMSK0 = 0; // turn off timer0 for lower jitter
ADCSRA = 0xe5; // set the adc to free running mode
ADMUX = 0x40; // use adc0
DIDR0 = 0x01; // turn off the digital input for adc0
}
void loop() {
while(1) { // reduces jitter
cli(); // UDRE interrupt slows this way down on arduino1.0
for (int i = 0 ; i < 512 ; i += 2) { // save 256 samples
while(!(ADCSRA & 0x10)); // wait for adc to be ready
ADCSRA = 0xf5; // restart adc
byte m = ADCL; // fetch adc data
byte j = ADCH;
int k = (j << 8) | m; // form into an int
k -= 0x0200; // form into a signed int
k <<= 6; // form into a 16b signed int
fft_input[i] = k; // put real data into even bins
// Serial.print(millis());
// Serial.print("input ");
// Serial.print(i);
// Serial.print(" = ");
Serial.println(k);
fft_input[i+1] = 0; // set odd bins to 0
delay(0.1);
}
fft_window(); // window the data for better frequency response
fft_reorder(); // reorder the data before doing the fft
fft_run(); // process the data in the fft
fft_mag_log(); // take the output of the fft
sei();
Serial.println("start");
for (byte i = 0; i < FFT_N/2; i++) {
if(i<10 || i>20)
{
fft_log_out[i] = 0;
}
Serial.println(fft_log_out[i]);
}
}
}
像这样应用过滤器后:
if(i<10 || i>20)
{
fft_log_out[i] = 0;
}
然后我需要对 FFT 数据进行反演 fft_log_out[]。
我寻找了一个逆 FFT 函数(特别是在 http://wiki.openmusiclabs.com/wiki/FFTFunctions 中),但在任何地方都找不到。
那么如何在 Arduino 中获得逆 FFT?
【问题讨论】:
-
这不是你想要的,只是一个建议。为什么不使用离散滤波器呢?那会更快、更“实时”。