Important changes to forums and questions
All forums and questions are now archived. To start a new conversation or read the latest updates go to forums.mbed.com.
10 years, 3 months ago.
mbed-dsp FFT question
Can someone help me understand why when I do a FFT of a 60Hz test signal, my Maximum BIN is always 2X what it should be? See the code below, I have changed the SAMPLE_RATE to change the BIN resolution and the FFT always comes out as double. In the code below I set the SAMPLE_RATE to 2048 and the FFT size to 2048. That should give me a BIN resolution of 1Hz. So my max BIN location should be 60, but it comes out as 120. I have also tried a 10kHz SAMPLE_RATE that should have resulted in a Max bin of 12 or 13, but it comes out as 25. Am I missing something?
#include "mbed.h"
#include "dsp.h"
#include "arm_const_structs.h"
#define SAMPLE_RATE 2048
#define SAMPLE_SIZE 2048
#define FFT_SIZE SAMPLE_SIZE
#define INPUT_FREQ 60
#define INPUT1_PHASE 0
float32_t input1[SAMPLE_SIZE];
float32_t complex1[SAMPLE_SIZE * 2];
float32_t input1_mag[FFT_SIZE];
float32_t input1_maxValue;
uint32_t input1_maxIndex = 0;
const static arm_cfft_instance_f32 *S1;
Serial debug_pc(USBTX, USBRX);
int main() {
float32_t input1_RMS;
int i;
debug_pc.baud(115200);
/* --- Generate Test Signals --- */
Sine_f32 sine_input1( INPUT_FREQ, SAMPLE_RATE, 1.0, INPUT1_PHASE, SAMPLE_SIZE);
sine_input1.generate(input1);
for(i=0;i<(SAMPLE_SIZE * 2) + 1;i=i+2) {
/* --- Add IMAG value to complex sample --- */
complex1[i] = input1[i];
complex1[i+1] = 0.0;
}
/* --- Calculate RMS of signal --- */
arm_rms_f32(input1, SAMPLE_SIZE, &input1_RMS);
printf("Input1 RMS: %1.4f\r\n", input1_RMS);
/* --- Calculate Complex FFT --- */
S1 = & arm_cfft_sR_f32_len2048;
arm_cfft_f32(S1, complex1, 0, 1);
/* --- Get Max BIN --- */
arm_cmplx_mag_f32(complex1, input1_mag, FFT_SIZE);
/* Calculates maxValue and returns corresponding BIN value */
arm_max_f32(input1_mag, FFT_SIZE, &input1_maxValue, &input1_maxIndex);
printf("Input1 Max Bin: %d\r\n", input1_maxIndex);
printf("Input1 Max Value: %1.4f\r\n", input1_maxValue);
for(i=0;i<(SAMPLE_SIZE) + 1;i=i+2) { //Don't display the top half of the FFT BINS
printf("BIN %d, RE:%1.4f, IM: %1.4f\r\n", i / 2, complex1[i], complex1[i+1]);
}
My problem is on line 40, I was skipping every other input sample. It should be like: