Ura

Dependencies:   CMSIS_DSP_401 mbed

main.cpp

Committer:
Sergeev
Date:
2014-10-07
Revision:
3:1f56b8f439a1
Parent:
2:707eb5bc5dfc
Child:
4:397e8f4699df

File content as of revision 3:1f56b8f439a1:

#include "mbed.h"
#include <ctype.h>
#include "arm_math.h"
#include "arm_const_structs.h"
 
void arm_cfft_f32( 
   const arm_cfft_instance_f32 * S, 
   float32_t * p1,
   uint8_t ifftFlag,
   uint8_t bitReverseFlag);

Serial pc(USBTX, USBRX);
 
AnalogIn   left(A2);
AnalogIn   right(A3);
 
int SAMPLE_RATE_HZ = 40000;             // Sample rate of the audio in hertz.
const int FFT_SIZE = 16;                // Size of the FFT.
 
const static arm_cfft_instance_f32 *S;
//static arm_cfft_radix2_instance_f32 *S;
Ticker samplingTimer;
float samples[FFT_SIZE*2];
float magnitudes[FFT_SIZE];
int sampleCounter = 0;
 
void samplingCallback()
{    
    // Read from the ADC and store the sample data
    samples[sampleCounter] = 1000*left.read();
    // Complex FFT functions require a coefficient for the imaginary part of the input.
    // Since we only have real data, set this coefficient to zero.
    samples[sampleCounter+1] = 0.0;
    // Update sample buffer position and stop after the buffer is filled
        
    sampleCounter += 2;
    
    if (sampleCounter >= FFT_SIZE*2) {
        samplingTimer.detach();
    }
}
 
void samplingBegin()
{
    // Reset sample buffer position and start callback at necessary rate.
    sampleCounter = 0;
    samplingTimer.attach_us(&samplingCallback, (float)(1000000/SAMPLE_RATE_HZ));
}
 
bool samplingIsDone()
{
    return sampleCounter >= FFT_SIZE*2;
}
 
int main()
{
    // Set up serial port.
    //pc.baud (38400);
 
    // Init arm_ccft_32
    switch (FFT_SIZE)
    {
    case 16:
        S = & arm_cfft_sR_f32_len16;
        break;
    case 32:
        S = & arm_cfft_sR_f32_len32;
        break;
    case 64:
        S = & arm_cfft_sR_f32_len64;
        break;
    case 128:
        S = & arm_cfft_sR_f32_len128;
        break;
    case 256:
        S = & arm_cfft_sR_f32_len256;
        break;
    case 512:
        S = & arm_cfft_sR_f32_len512;
        break;
    case 1024:
        S = & arm_cfft_sR_f32_len1024;
        break;
    case 2048:
        S = & arm_cfft_sR_f32_len2048;
        break;
    case 4096:
        S = & arm_cfft_sR_f32_len4096;
        break;
    }
    float maxValue = 0.0f;
    unsigned int testIndex = 0;
 
    // Begin sampling audio
    samplingBegin();
 
    while(1)
    {
        // Calculate FFT if a full sample is available.
        if (samplingIsDone())
        {            
            // Run FFT on sample data.
            //arm_cfft_radix2_f32(arm_cfft_radix2_instance_f32*S, samples);
            arm_cfft_f32(S, samples, 0, 1);
            samples[0] = samples[0]/1000;
            /* Initialize the CFFT/CIFFT module */
            //arm_cfft_radix2_init_f32(S, 128, 0, 1);
            //arm_cfft_radix2_f32(S, samples);
            for(int i = 0;i < FFT_SIZE*2;++i)
                pc.printf("     Samples[%d]: %8.2f ",i,samples[i]);
            pc.printf("\r\n");
            // Calculate magnitude of complex numbers output by the FFT.
            arm_cmplx_mag_f32(samples, magnitudes, FFT_SIZE);
            for(int i = 0;i < FFT_SIZE;++i)
                pc.printf("     Magnitude: %d = %8.2f ;", i, magnitudes[i]);
            pc.printf("       \r\n");
            arm_max_f32(magnitudes, FFT_SIZE, &maxValue, &testIndex);
            pc.printf("     MAX value at magnitudes[%d] : %+8.2f\r\n", testIndex, maxValue);
            // Wait for user confirmation to restart audio sampling.
            //pc.getc();
            wait(1);
            samplingBegin();
        }
    }
}