draft

Dependencies:   FastAnalogIn HSI2RGBW_PWM NVIC_set_all_priorities mbed-dsp mbed MMA8451Q

Fork of KL25Z_FFT_Demo by Frank Vannieuwkerke

Committer:
yangyulounk
Date:
Sun Apr 24 21:50:46 2016 +0000
Revision:
3:a8238ddc2868
Parent:
2:035d551759a5
Child:
4:5d4bcc4751d7
draft

Who changed what in which revision?

UserRevisionLine numberNew contents of line
frankvnk 0:0c037aff5039 1 // Audio Spectrum Display
frankvnk 0:0c037aff5039 2 // Copyright 2013 Tony DiCola (tony@tonydicola.com)
frankvnk 0:0c037aff5039 3 // Code ported from the guide at http://learn.adafruit.com/fft-fun-with-fourier-transforms?view=all
frankvnk 0:0c037aff5039 4
frankvnk 0:0c037aff5039 5 #include "mbed.h"
frankvnk 0:0c037aff5039 6 #include "NVIC_set_all_priorities.h"
frankvnk 0:0c037aff5039 7 #include <ctype.h>
frankvnk 0:0c037aff5039 8 #include "arm_math.h"
frankvnk 2:035d551759a5 9 #include "arm_const_structs.h"
frankvnk 0:0c037aff5039 10 #include "hsi2rgbw_pwm.h"
frankvnk 1:736b34e0f484 11 #include "FastAnalogIn.h"
frankvnk 0:0c037aff5039 12
frankvnk 0:0c037aff5039 13 Serial pc(USBTX, USBRX);
frankvnk 0:0c037aff5039 14
frankvnk 1:736b34e0f484 15 FastAnalogIn Audio(PTC2);
frankvnk 0:0c037aff5039 16
frankvnk 0:0c037aff5039 17 //#define RGBW_ext // Disable this line when you want to use the KL25Z on-board RGB LED.
frankvnk 0:0c037aff5039 18
frankvnk 0:0c037aff5039 19 #ifndef RGBW_ext
frankvnk 0:0c037aff5039 20 // HSI to RGB conversion with direct output to PWM channels - on-board RGB LED
frankvnk 0:0c037aff5039 21 hsi2rgbw_pwm led(LED_RED, LED_GREEN, LED_BLUE);
frankvnk 0:0c037aff5039 22 #else
frankvnk 0:0c037aff5039 23 // HSI to RGBW conversion with direct output to external PWM channels - RGBW LED
frankvnk 0:0c037aff5039 24 hsi2rgbw_pwm led(PTD4, PTA12, PTA4, PTA5); //Red, Green, Blue, White
frankvnk 0:0c037aff5039 25 #endif
frankvnk 0:0c037aff5039 26
frankvnk 0:0c037aff5039 27 // Dummy ISR for disabling NMI on PTA4 - !! DO NOT REMOVE THIS !!
frankvnk 0:0c037aff5039 28 // More info at https://mbed.org/questions/1387/How-can-I-access-the-FTFA_FOPT-register-/
frankvnk 0:0c037aff5039 29 extern "C" void NMI_Handler() {
frankvnk 0:0c037aff5039 30 DigitalIn test(PTA4);
frankvnk 0:0c037aff5039 31 }
frankvnk 0:0c037aff5039 32
frankvnk 0:0c037aff5039 33
frankvnk 0:0c037aff5039 34 ////////////////////////////////////////////////////////////////////////////////
frankvnk 0:0c037aff5039 35 // CONFIGURATION
frankvnk 0:0c037aff5039 36 // These values can be changed to alter the behavior of the spectrum display.
frankvnk 0:0c037aff5039 37 // KL25Z limitations
frankvnk 0:0c037aff5039 38 // -----------------
frankvnk 0:0c037aff5039 39 // - When used with the Spectrogram python script :
frankvnk 0:0c037aff5039 40 // There is a substantial time lag between the music and the screen output.
frankvnk 2:035d551759a5 41 // Max allowed SAMPLE_RATE_HZ is 40000
frankvnk 2:035d551759a5 42 // Max allowed FFT_SIZE is 64
frankvnk 0:0c037aff5039 43 ////////////////////////////////////////////////////////////////////////////////
frankvnk 0:0c037aff5039 44
frankvnk 2:035d551759a5 45 int SLOWDOWN = 4; // Create an optical delay in spectrumLoop - useful when only one RGB led is used.
frankvnk 0:0c037aff5039 46 // Only active when nonzero.
frankvnk 0:0c037aff5039 47 // A value >= 1000 and <= 1000 + PIXEL_COUNT fixes the output to a single frequency
frankvnk 0:0c037aff5039 48 // window = a single color.
yangyulounk 3:a8238ddc2868 49 int SAMPLE_RATE_HZ = 10000; // Sample rate of the audio in hertz.
frankvnk 2:035d551759a5 50 float SPECTRUM_MIN_DB = 30.0; // Audio intensity (in decibels) that maps to low LED brightness.
frankvnk 1:736b34e0f484 51 float SPECTRUM_MAX_DB = 80.0; // Audio intensity (in decibels) that maps to high LED brightness.
frankvnk 0:0c037aff5039 52 int LEDS_ENABLED = 1; // Control if the LED's should display the spectrum or not. 1 is true, 0 is false.
frankvnk 0:0c037aff5039 53 // Useful for turning the LED display on and off with commands from the serial port.
frankvnk 1:736b34e0f484 54 const int FFT_SIZE = 64; // Size of the FFT.
yangyulounk 3:a8238ddc2868 55 const int PIXEL_COUNT = 8; // Number of pixels. You should be able to increase this without
frankvnk 0:0c037aff5039 56 // any other changes to the program.
frankvnk 0:0c037aff5039 57 const int MAX_CHARS = 65; // Max size of the input command buffer
frankvnk 0:0c037aff5039 58
yangyulounk 3:a8238ddc2868 59 //const int tempCurrentLevel[8] = {0b00000001, 0b00000011, 0b00000111, 0b00001111, 0b00011111, 0b00111111, 0b01111111, 0b11111111};
yangyulounk 3:a8238ddc2868 60
yangyulounk 3:a8238ddc2868 61
frankvnk 0:0c037aff5039 62 ////////////////////////////////////////////////////////////////////////////////
frankvnk 0:0c037aff5039 63 // INTERNAL STATE
frankvnk 0:0c037aff5039 64 // These shouldn't be modified unless you know what you're doing.
frankvnk 0:0c037aff5039 65 ////////////////////////////////////////////////////////////////////////////////
frankvnk 2:035d551759a5 66 const static arm_cfft_instance_f32 *S;
frankvnk 0:0c037aff5039 67 Ticker samplingTimer;
frankvnk 0:0c037aff5039 68 float samples[FFT_SIZE*2];
frankvnk 0:0c037aff5039 69 float magnitudes[FFT_SIZE];
frankvnk 0:0c037aff5039 70 int sampleCounter = 0;
frankvnk 0:0c037aff5039 71 char commandBuffer[MAX_CHARS];
frankvnk 0:0c037aff5039 72 float frequencyWindow[PIXEL_COUNT+1];
frankvnk 0:0c037aff5039 73 float hues[PIXEL_COUNT];
frankvnk 0:0c037aff5039 74 bool commandRecv = 0;
frankvnk 0:0c037aff5039 75 ////////////////////////////////////////////////////////////////////////////////
frankvnk 0:0c037aff5039 76 // UTILITY FUNCTIONS
frankvnk 0:0c037aff5039 77 ////////////////////////////////////////////////////////////////////////////////
frankvnk 0:0c037aff5039 78
frankvnk 0:0c037aff5039 79 void rxisr() {
frankvnk 0:0c037aff5039 80 char c = pc.getc();
frankvnk 0:0c037aff5039 81 // Add any characters that aren't the end of a command (semicolon) to the input buffer.
frankvnk 0:0c037aff5039 82 if (c != ';') {
frankvnk 0:0c037aff5039 83 c = toupper(c);
frankvnk 0:0c037aff5039 84 strncat(commandBuffer, &c, 1);
frankvnk 0:0c037aff5039 85 } else {
frankvnk 0:0c037aff5039 86 // Parse the command because an end of command token was encountered.
frankvnk 0:0c037aff5039 87 commandRecv = 1;
frankvnk 0:0c037aff5039 88 }
frankvnk 0:0c037aff5039 89 }
frankvnk 0:0c037aff5039 90
frankvnk 0:0c037aff5039 91 // Compute the average magnitude of a target frequency window vs. all other frequencies.
frankvnk 0:0c037aff5039 92 void windowMean(float* magnitudes, int lowBin, int highBin, float* windowMean, float* otherMean)
frankvnk 0:0c037aff5039 93 {
frankvnk 0:0c037aff5039 94 *windowMean = 0;
frankvnk 0:0c037aff5039 95 *otherMean = 0;
frankvnk 0:0c037aff5039 96 // Notice the first magnitude bin is skipped because it represents the
frankvnk 0:0c037aff5039 97 // average power of the signal.
frankvnk 0:0c037aff5039 98 for (int i = 1; i < FFT_SIZE/2; ++i) {
frankvnk 0:0c037aff5039 99 if (i >= lowBin && i <= highBin) {
frankvnk 0:0c037aff5039 100 *windowMean += magnitudes[i];
frankvnk 0:0c037aff5039 101 } else {
frankvnk 0:0c037aff5039 102 *otherMean += magnitudes[i];
frankvnk 0:0c037aff5039 103 }
frankvnk 0:0c037aff5039 104 }
frankvnk 0:0c037aff5039 105 *windowMean /= (highBin - lowBin) + 1;
frankvnk 0:0c037aff5039 106 *otherMean /= (FFT_SIZE / 2 - (highBin - lowBin));
frankvnk 0:0c037aff5039 107 }
frankvnk 0:0c037aff5039 108
frankvnk 0:0c037aff5039 109 // Convert a frequency to the appropriate FFT bin it will fall within.
frankvnk 0:0c037aff5039 110 int frequencyToBin(float frequency)
frankvnk 0:0c037aff5039 111 {
frankvnk 0:0c037aff5039 112 float binFrequency = float(SAMPLE_RATE_HZ) / float(FFT_SIZE);
frankvnk 0:0c037aff5039 113 return int(frequency / binFrequency);
frankvnk 0:0c037aff5039 114 }
frankvnk 0:0c037aff5039 115
frankvnk 0:0c037aff5039 116
frankvnk 0:0c037aff5039 117 ////////////////////////////////////////////////////////////////////////////////
frankvnk 0:0c037aff5039 118 // SPECTRUM DISPLAY FUNCTIONS
frankvnk 0:0c037aff5039 119 ///////////////////////////////////////////////////////////////////////////////
frankvnk 0:0c037aff5039 120
frankvnk 0:0c037aff5039 121 void spectrumSetup()
frankvnk 0:0c037aff5039 122 {
frankvnk 0:0c037aff5039 123 // Set the frequency window values by evenly dividing the possible frequency
frankvnk 0:0c037aff5039 124 // spectrum across the number of neo pixels.
frankvnk 0:0c037aff5039 125 float windowSize = (SAMPLE_RATE_HZ / 2.0) / float(PIXEL_COUNT);
frankvnk 0:0c037aff5039 126 for (int i = 0; i < PIXEL_COUNT+1; ++i) {
frankvnk 0:0c037aff5039 127 frequencyWindow[i] = i*windowSize;
frankvnk 0:0c037aff5039 128 }
frankvnk 0:0c037aff5039 129 // Evenly spread hues across all pixels.
frankvnk 0:0c037aff5039 130 for (int i = 0; i < PIXEL_COUNT; ++i) {
frankvnk 0:0c037aff5039 131 hues[i] = 360.0*(float(i)/float(PIXEL_COUNT-1));
frankvnk 0:0c037aff5039 132 }
frankvnk 0:0c037aff5039 133 }
frankvnk 0:0c037aff5039 134
frankvnk 0:0c037aff5039 135 void spectrumLoop()
frankvnk 0:0c037aff5039 136 {
frankvnk 0:0c037aff5039 137 // Update each LED based on the intensity of the audio
frankvnk 0:0c037aff5039 138 // in the associated frequency window.
frankvnk 0:0c037aff5039 139 static int SLrpt = 0, SLpixcnt = 0;
yangyulounk 3:a8238ddc2868 140 int SLpixend = 8;
frankvnk 0:0c037aff5039 141 float intensity, otherMean;
yangyulounk 3:a8238ddc2868 142
yangyulounk 3:a8238ddc2868 143 int intensity_4x8[32]={0};
yangyulounk 3:a8238ddc2868 144 int offset=0;
yangyulounk 3:a8238ddc2868 145
frankvnk 0:0c037aff5039 146 for (int i = SLpixcnt; i < SLpixend; ++i) {
frankvnk 0:0c037aff5039 147 windowMean(magnitudes,
frankvnk 0:0c037aff5039 148 frequencyToBin(frequencyWindow[i]),
frankvnk 0:0c037aff5039 149 frequencyToBin(frequencyWindow[i+1]),
frankvnk 0:0c037aff5039 150 &intensity,
frankvnk 0:0c037aff5039 151 &otherMean);
yangyulounk 3:a8238ddc2868 152 printf("%d: %d \n",i, (int)intensity);
yangyulounk 3:a8238ddc2868 153
yangyulounk 3:a8238ddc2868 154
yangyulounk 3:a8238ddc2868 155
yangyulounk 3:a8238ddc2868 156
yangyulounk 3:a8238ddc2868 157
yangyulounk 3:a8238ddc2868 158
yangyulounk 3:a8238ddc2868 159
yangyulounk 3:a8238ddc2868 160 /*
yangyulounk 3:a8238ddc2868 161
yangyulounk 3:a8238ddc2868 162 intensity_4x8[i*4+offset]=intensity;
yangyulounk 3:a8238ddc2868 163 offset=(offset+1)%4;
yangyulounk 3:a8238ddc2868 164 */ }
yangyulounk 3:a8238ddc2868 165 /*
yangyulounk 3:a8238ddc2868 166 for (int k=0;k<32;k++){
yangyulounk 3:a8238ddc2868 167 printf("%d: %d ",k, intensity_4x8[k]);
yangyulounk 3:a8238ddc2868 168 printf("\n");
yangyulounk 3:a8238ddc2868 169
frankvnk 0:0c037aff5039 170 }
yangyulounk 3:a8238ddc2868 171 */}
frankvnk 0:0c037aff5039 172
frankvnk 0:0c037aff5039 173
frankvnk 0:0c037aff5039 174 ////////////////////////////////////////////////////////////////////////////////
frankvnk 0:0c037aff5039 175 // SAMPLING FUNCTIONS
frankvnk 0:0c037aff5039 176 ////////////////////////////////////////////////////////////////////////////////
frankvnk 0:0c037aff5039 177
frankvnk 0:0c037aff5039 178 void samplingCallback()
frankvnk 0:0c037aff5039 179 {
frankvnk 0:0c037aff5039 180 // Read from the ADC and store the sample data
frankvnk 1:736b34e0f484 181 samples[sampleCounter] = (1023 * Audio) - 511.0f;
frankvnk 0:0c037aff5039 182 // Complex FFT functions require a coefficient for the imaginary part of the input.
frankvnk 0:0c037aff5039 183 // Since we only have real data, set this coefficient to zero.
frankvnk 0:0c037aff5039 184 samples[sampleCounter+1] = 0.0;
frankvnk 0:0c037aff5039 185 // Update sample buffer position and stop after the buffer is filled
frankvnk 0:0c037aff5039 186 sampleCounter += 2;
frankvnk 0:0c037aff5039 187 if (sampleCounter >= FFT_SIZE*2) {
frankvnk 0:0c037aff5039 188 samplingTimer.detach();
frankvnk 0:0c037aff5039 189 }
frankvnk 0:0c037aff5039 190 }
frankvnk 0:0c037aff5039 191
frankvnk 0:0c037aff5039 192 void samplingBegin()
frankvnk 0:0c037aff5039 193 {
frankvnk 0:0c037aff5039 194 // Reset sample buffer position and start callback at necessary rate.
frankvnk 0:0c037aff5039 195 sampleCounter = 0;
frankvnk 0:0c037aff5039 196 samplingTimer.attach_us(&samplingCallback, 1000000/SAMPLE_RATE_HZ);
frankvnk 0:0c037aff5039 197 }
frankvnk 0:0c037aff5039 198
frankvnk 0:0c037aff5039 199 bool samplingIsDone()
frankvnk 0:0c037aff5039 200 {
frankvnk 0:0c037aff5039 201 return sampleCounter >= FFT_SIZE*2;
frankvnk 0:0c037aff5039 202 }
frankvnk 0:0c037aff5039 203
frankvnk 0:0c037aff5039 204
frankvnk 0:0c037aff5039 205 ////////////////////////////////////////////////////////////////////////////////
frankvnk 0:0c037aff5039 206 // COMMAND PARSING FUNCTIONS
frankvnk 0:0c037aff5039 207 // These functions allow parsing simple commands input on the serial port.
frankvnk 0:0c037aff5039 208 // Commands allow reading and writing variables that control the device.
frankvnk 0:0c037aff5039 209 //
frankvnk 0:0c037aff5039 210 // All commands must end with a semicolon character.
frankvnk 0:0c037aff5039 211 //
frankvnk 0:0c037aff5039 212 // Example commands are:
frankvnk 0:0c037aff5039 213 // GET SAMPLE_RATE_HZ;
frankvnk 0:0c037aff5039 214 // - Get the sample rate of the device.
frankvnk 0:0c037aff5039 215 // SET SAMPLE_RATE_HZ 400;
frankvnk 0:0c037aff5039 216 // - Set the sample rate of the device to 400 hertz.
frankvnk 0:0c037aff5039 217 //
frankvnk 0:0c037aff5039 218 ////////////////////////////////////////////////////////////////////////////////
frankvnk 0:0c037aff5039 219
frankvnk 0:0c037aff5039 220 void parseCommand(char* command)
frankvnk 0:0c037aff5039 221 {
frankvnk 0:0c037aff5039 222 if (strcmp(command, "GET MAGNITUDES") == 0) {
frankvnk 0:0c037aff5039 223 for (int i = 0; i < FFT_SIZE; ++i) {
frankvnk 0:0c037aff5039 224 printf("%f\r\n", magnitudes[i]);
frankvnk 0:0c037aff5039 225 }
frankvnk 0:0c037aff5039 226 } else if (strcmp(command, "GET SAMPLES") == 0) {
frankvnk 0:0c037aff5039 227 for (int i = 0; i < FFT_SIZE*2; i+=2) {
frankvnk 0:0c037aff5039 228 printf("%f\r\n", samples[i]);
frankvnk 0:0c037aff5039 229 }
frankvnk 0:0c037aff5039 230 } else if (strcmp(command, "GET FFT_SIZE") == 0) {
frankvnk 0:0c037aff5039 231 printf("%d\r\n", FFT_SIZE);
frankvnk 0:0c037aff5039 232 } else if (strcmp(command, "GET SAMPLE_RATE_HZ") == 0) {
frankvnk 0:0c037aff5039 233 printf("%d\r\n", SAMPLE_RATE_HZ);
frankvnk 0:0c037aff5039 234 } else if (strstr(command, "SET SAMPLE_RATE_HZ") != NULL) {
frankvnk 0:0c037aff5039 235 SAMPLE_RATE_HZ = (typeof(SAMPLE_RATE_HZ)) atof(command+(sizeof("SET SAMPLE_RATE_HZ")-1));
frankvnk 0:0c037aff5039 236 } else if (strcmp(command, "GET LEDS_ENABLED") == 0) {
frankvnk 0:0c037aff5039 237 printf("%d\r\n", LEDS_ENABLED);
frankvnk 0:0c037aff5039 238 } else if (strstr(command, "SET LEDS_ENABLED") != NULL) {
frankvnk 0:0c037aff5039 239 LEDS_ENABLED = (typeof(LEDS_ENABLED)) atof(command+(sizeof("SET LEDS_ENABLED")-1));
frankvnk 0:0c037aff5039 240 } else if (strcmp(command, "GET SPECTRUM_MIN_DB") == 0) {
frankvnk 0:0c037aff5039 241 printf("%f\r\n", SPECTRUM_MIN_DB);
frankvnk 0:0c037aff5039 242 } else if (strstr(command, "SET SPECTRUM_MIN_DB") != NULL) {
frankvnk 0:0c037aff5039 243 SPECTRUM_MIN_DB = (typeof(SPECTRUM_MIN_DB)) atof(command+(sizeof("SET SPECTRUM_MIN_DB")-1));
frankvnk 0:0c037aff5039 244 } else if (strcmp(command, "GET SPECTRUM_MAX_DB") == 0) {
frankvnk 0:0c037aff5039 245 printf("%f\r\n", SPECTRUM_MAX_DB);
frankvnk 0:0c037aff5039 246 } else if (strstr(command, "SET SPECTRUM_MAX_DB") != NULL) {
frankvnk 0:0c037aff5039 247 SPECTRUM_MAX_DB = (typeof(SPECTRUM_MAX_DB)) atof(command+(sizeof("SET SPECTRUM_MAX_DB")-1));
frankvnk 0:0c037aff5039 248 } else if (strcmp(command, "GET SLOWDOWN") == 0) {
frankvnk 0:0c037aff5039 249 printf("%d\r\n", SLOWDOWN);
frankvnk 0:0c037aff5039 250 } else if (strstr(command, "SET SLOWDOWN") != NULL) {
frankvnk 0:0c037aff5039 251 SLOWDOWN = (typeof(SLOWDOWN)) atoi(command+(sizeof("SET SLOWDOWN")-1));
frankvnk 0:0c037aff5039 252 }
frankvnk 0:0c037aff5039 253
frankvnk 0:0c037aff5039 254 // Update spectrum display values if sample rate was changed.
frankvnk 0:0c037aff5039 255 if (strstr(command, "SET SAMPLE_RATE_HZ ") != NULL) {
frankvnk 0:0c037aff5039 256 spectrumSetup();
frankvnk 0:0c037aff5039 257 }
frankvnk 0:0c037aff5039 258
frankvnk 0:0c037aff5039 259 // Turn off the LEDs if the state changed.
frankvnk 0:0c037aff5039 260 if (LEDS_ENABLED == 0) {
frankvnk 0:0c037aff5039 261 }
frankvnk 0:0c037aff5039 262 }
frankvnk 0:0c037aff5039 263
frankvnk 0:0c037aff5039 264 void parserLoop()
frankvnk 0:0c037aff5039 265 {
frankvnk 0:0c037aff5039 266 // Process any incoming characters from the serial port
frankvnk 0:0c037aff5039 267 while (pc.readable()) {
frankvnk 0:0c037aff5039 268 char c = pc.getc();
frankvnk 0:0c037aff5039 269 // Add any characters that aren't the end of a command (semicolon) to the input buffer.
frankvnk 0:0c037aff5039 270 if (c != ';') {
frankvnk 0:0c037aff5039 271 c = toupper(c);
frankvnk 0:0c037aff5039 272 strncat(commandBuffer, &c, 1);
frankvnk 0:0c037aff5039 273 } else {
frankvnk 0:0c037aff5039 274 // Parse the command because an end of command token was encountered.
frankvnk 0:0c037aff5039 275 parseCommand(commandBuffer);
frankvnk 0:0c037aff5039 276 // Clear the input buffer
frankvnk 0:0c037aff5039 277 memset(commandBuffer, 0, sizeof(commandBuffer));
frankvnk 0:0c037aff5039 278 }
frankvnk 0:0c037aff5039 279 }
frankvnk 0:0c037aff5039 280 }
frankvnk 0:0c037aff5039 281
frankvnk 0:0c037aff5039 282 ////////////////////////////////////////////////////////////////////////////////
frankvnk 0:0c037aff5039 283 // MAIN FUNCTION
frankvnk 0:0c037aff5039 284 ////////////////////////////////////////////////////////////////////////////////
frankvnk 0:0c037aff5039 285
frankvnk 0:0c037aff5039 286 int main()
frankvnk 0:0c037aff5039 287 {
frankvnk 0:0c037aff5039 288 NVIC_set_all_irq_priorities(1);
frankvnk 0:0c037aff5039 289 NVIC_SetPriority(UART0_IRQn, 0);
frankvnk 0:0c037aff5039 290 // Set up serial port.
yangyulounk 3:a8238ddc2868 291 pc.baud (9600);
frankvnk 0:0c037aff5039 292 pc.attach(&rxisr);
frankvnk 0:0c037aff5039 293 #ifndef RGBW_ext
frankvnk 0:0c037aff5039 294 led.invertpwm(1); //On-board KL25Z RGB LED uses common anode.
frankvnk 0:0c037aff5039 295 #endif
frankvnk 0:0c037aff5039 296 // Clear the input command buffer
frankvnk 0:0c037aff5039 297 memset(commandBuffer, 0, sizeof(commandBuffer));
frankvnk 0:0c037aff5039 298
frankvnk 0:0c037aff5039 299 // Initialize spectrum display
frankvnk 0:0c037aff5039 300 spectrumSetup();
frankvnk 0:0c037aff5039 301
frankvnk 0:0c037aff5039 302 // Begin sampling audio
frankvnk 0:0c037aff5039 303 samplingBegin();
frankvnk 0:0c037aff5039 304
frankvnk 2:035d551759a5 305 // Init arm_ccft_32
frankvnk 2:035d551759a5 306 switch (FFT_SIZE)
frankvnk 2:035d551759a5 307 {
frankvnk 2:035d551759a5 308 case 16:
frankvnk 2:035d551759a5 309 S = & arm_cfft_sR_f32_len16;
frankvnk 2:035d551759a5 310 break;
frankvnk 2:035d551759a5 311 case 32:
frankvnk 2:035d551759a5 312 S = & arm_cfft_sR_f32_len32;
frankvnk 2:035d551759a5 313 break;
frankvnk 2:035d551759a5 314 case 64:
frankvnk 2:035d551759a5 315 S = & arm_cfft_sR_f32_len64;
frankvnk 2:035d551759a5 316 break;
frankvnk 2:035d551759a5 317 case 128:
frankvnk 2:035d551759a5 318 S = & arm_cfft_sR_f32_len128;
frankvnk 2:035d551759a5 319 break;
frankvnk 2:035d551759a5 320 case 256:
frankvnk 2:035d551759a5 321 S = & arm_cfft_sR_f32_len256;
frankvnk 2:035d551759a5 322 break;
frankvnk 2:035d551759a5 323 case 512:
frankvnk 2:035d551759a5 324 S = & arm_cfft_sR_f32_len512;
frankvnk 2:035d551759a5 325 break;
frankvnk 2:035d551759a5 326 case 1024:
frankvnk 2:035d551759a5 327 S = & arm_cfft_sR_f32_len1024;
frankvnk 2:035d551759a5 328 break;
frankvnk 2:035d551759a5 329 case 2048:
frankvnk 2:035d551759a5 330 S = & arm_cfft_sR_f32_len2048;
frankvnk 2:035d551759a5 331 break;
frankvnk 2:035d551759a5 332 case 4096:
frankvnk 2:035d551759a5 333 S = & arm_cfft_sR_f32_len4096;
frankvnk 2:035d551759a5 334 break;
frankvnk 2:035d551759a5 335 }
frankvnk 2:035d551759a5 336
frankvnk 0:0c037aff5039 337 while(1) {
frankvnk 0:0c037aff5039 338 // Calculate FFT if a full sample is available.
frankvnk 0:0c037aff5039 339 if (samplingIsDone()) {
frankvnk 0:0c037aff5039 340 // Run FFT on sample data.
frankvnk 2:035d551759a5 341 // Run FFT on sample data.
frankvnk 2:035d551759a5 342 arm_cfft_f32(S, samples, 0, 1);
frankvnk 0:0c037aff5039 343 // Calculate magnitude of complex numbers output by the FFT.
frankvnk 0:0c037aff5039 344 arm_cmplx_mag_f32(samples, magnitudes, FFT_SIZE);
frankvnk 0:0c037aff5039 345
frankvnk 0:0c037aff5039 346 if (LEDS_ENABLED == 1) {
frankvnk 0:0c037aff5039 347 spectrumLoop();
frankvnk 0:0c037aff5039 348 }
frankvnk 0:0c037aff5039 349
frankvnk 0:0c037aff5039 350 // Restart audio sampling.
frankvnk 0:0c037aff5039 351 samplingBegin();
frankvnk 0:0c037aff5039 352 }
frankvnk 0:0c037aff5039 353
frankvnk 0:0c037aff5039 354 // Parse any pending commands.
frankvnk 0:0c037aff5039 355 if(commandRecv) {
frankvnk 0:0c037aff5039 356 // pc.attach(NULL);
frankvnk 0:0c037aff5039 357 parseCommand(commandBuffer);
frankvnk 0:0c037aff5039 358 commandRecv = 0;
frankvnk 0:0c037aff5039 359 // Clear the input buffer
frankvnk 0:0c037aff5039 360 memset(commandBuffer, 0, sizeof(commandBuffer));
frankvnk 0:0c037aff5039 361 // pc.attach(&rxisr);
frankvnk 0:0c037aff5039 362 }
frankvnk 0:0c037aff5039 363 }
frankvnk 0:0c037aff5039 364 }