огшор

Dependencies:   CMSIS_DSP_401 mbed

Fork of fir_f32 by Nikolay Sergeev

Committer:
Sergeev
Date:
Tue Oct 07 15:20:49 2014 +0000
Revision:
3:1f56b8f439a1
Parent:
2:707eb5bc5dfc
Child:
4:397e8f4699df
Uraa

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Sergeev 0:b712470aea1d 1 #include "mbed.h"
Sergeev 1:9b1df0b2507d 2 #include <ctype.h>
Sergeev 0:b712470aea1d 3 #include "arm_math.h"
Sergeev 1:9b1df0b2507d 4 #include "arm_const_structs.h"
Sergeev 1:9b1df0b2507d 5
Sergeev 1:9b1df0b2507d 6 void arm_cfft_f32(
Sergeev 1:9b1df0b2507d 7 const arm_cfft_instance_f32 * S,
Sergeev 1:9b1df0b2507d 8 float32_t * p1,
Sergeev 1:9b1df0b2507d 9 uint8_t ifftFlag,
Sergeev 1:9b1df0b2507d 10 uint8_t bitReverseFlag);
Sergeev 0:b712470aea1d 11
Sergeev 1:9b1df0b2507d 12 Serial pc(USBTX, USBRX);
Sergeev 1:9b1df0b2507d 13
Sergeev 1:9b1df0b2507d 14 AnalogIn left(A2);
Sergeev 1:9b1df0b2507d 15 AnalogIn right(A3);
Sergeev 1:9b1df0b2507d 16
Sergeev 1:9b1df0b2507d 17 int SAMPLE_RATE_HZ = 40000; // Sample rate of the audio in hertz.
Sergeev 1:9b1df0b2507d 18 const int FFT_SIZE = 16; // Size of the FFT.
Sergeev 1:9b1df0b2507d 19
Sergeev 1:9b1df0b2507d 20 const static arm_cfft_instance_f32 *S;
Sergeev 3:1f56b8f439a1 21 //static arm_cfft_radix2_instance_f32 *S;
Sergeev 1:9b1df0b2507d 22 Ticker samplingTimer;
Sergeev 1:9b1df0b2507d 23 float samples[FFT_SIZE*2];
Sergeev 1:9b1df0b2507d 24 float magnitudes[FFT_SIZE];
Sergeev 1:9b1df0b2507d 25 int sampleCounter = 0;
Sergeev 1:9b1df0b2507d 26
Sergeev 1:9b1df0b2507d 27 void samplingCallback()
Sergeev 3:1f56b8f439a1 28 {
Sergeev 1:9b1df0b2507d 29 // Read from the ADC and store the sample data
Sergeev 3:1f56b8f439a1 30 samples[sampleCounter] = 1000*left.read();
Sergeev 1:9b1df0b2507d 31 // Complex FFT functions require a coefficient for the imaginary part of the input.
Sergeev 1:9b1df0b2507d 32 // Since we only have real data, set this coefficient to zero.
Sergeev 1:9b1df0b2507d 33 samples[sampleCounter+1] = 0.0;
Sergeev 1:9b1df0b2507d 34 // Update sample buffer position and stop after the buffer is filled
Sergeev 3:1f56b8f439a1 35
Sergeev 1:9b1df0b2507d 36 sampleCounter += 2;
Sergeev 2:707eb5bc5dfc 37
Sergeev 1:9b1df0b2507d 38 if (sampleCounter >= FFT_SIZE*2) {
Sergeev 1:9b1df0b2507d 39 samplingTimer.detach();
Sergeev 1:9b1df0b2507d 40 }
Sergeev 1:9b1df0b2507d 41 }
Sergeev 1:9b1df0b2507d 42
Sergeev 1:9b1df0b2507d 43 void samplingBegin()
Sergeev 1:9b1df0b2507d 44 {
Sergeev 1:9b1df0b2507d 45 // Reset sample buffer position and start callback at necessary rate.
Sergeev 1:9b1df0b2507d 46 sampleCounter = 0;
Sergeev 3:1f56b8f439a1 47 samplingTimer.attach_us(&samplingCallback, (float)(1000000/SAMPLE_RATE_HZ));
Sergeev 1:9b1df0b2507d 48 }
Sergeev 1:9b1df0b2507d 49
Sergeev 1:9b1df0b2507d 50 bool samplingIsDone()
Sergeev 1:9b1df0b2507d 51 {
Sergeev 1:9b1df0b2507d 52 return sampleCounter >= FFT_SIZE*2;
Sergeev 0:b712470aea1d 53 }
Sergeev 1:9b1df0b2507d 54
Sergeev 1:9b1df0b2507d 55 int main()
Sergeev 0:b712470aea1d 56 {
Sergeev 1:9b1df0b2507d 57 // Set up serial port.
Sergeev 3:1f56b8f439a1 58 //pc.baud (38400);
Sergeev 1:9b1df0b2507d 59
Sergeev 1:9b1df0b2507d 60 // Init arm_ccft_32
Sergeev 1:9b1df0b2507d 61 switch (FFT_SIZE)
Sergeev 1:9b1df0b2507d 62 {
Sergeev 1:9b1df0b2507d 63 case 16:
Sergeev 1:9b1df0b2507d 64 S = & arm_cfft_sR_f32_len16;
Sergeev 1:9b1df0b2507d 65 break;
Sergeev 1:9b1df0b2507d 66 case 32:
Sergeev 1:9b1df0b2507d 67 S = & arm_cfft_sR_f32_len32;
Sergeev 1:9b1df0b2507d 68 break;
Sergeev 1:9b1df0b2507d 69 case 64:
Sergeev 1:9b1df0b2507d 70 S = & arm_cfft_sR_f32_len64;
Sergeev 1:9b1df0b2507d 71 break;
Sergeev 1:9b1df0b2507d 72 case 128:
Sergeev 1:9b1df0b2507d 73 S = & arm_cfft_sR_f32_len128;
Sergeev 1:9b1df0b2507d 74 break;
Sergeev 1:9b1df0b2507d 75 case 256:
Sergeev 1:9b1df0b2507d 76 S = & arm_cfft_sR_f32_len256;
Sergeev 1:9b1df0b2507d 77 break;
Sergeev 1:9b1df0b2507d 78 case 512:
Sergeev 1:9b1df0b2507d 79 S = & arm_cfft_sR_f32_len512;
Sergeev 1:9b1df0b2507d 80 break;
Sergeev 1:9b1df0b2507d 81 case 1024:
Sergeev 1:9b1df0b2507d 82 S = & arm_cfft_sR_f32_len1024;
Sergeev 1:9b1df0b2507d 83 break;
Sergeev 1:9b1df0b2507d 84 case 2048:
Sergeev 1:9b1df0b2507d 85 S = & arm_cfft_sR_f32_len2048;
Sergeev 1:9b1df0b2507d 86 break;
Sergeev 1:9b1df0b2507d 87 case 4096:
Sergeev 1:9b1df0b2507d 88 S = & arm_cfft_sR_f32_len4096;
Sergeev 1:9b1df0b2507d 89 break;
Sergeev 1:9b1df0b2507d 90 }
Sergeev 1:9b1df0b2507d 91 float maxValue = 0.0f;
Sergeev 1:9b1df0b2507d 92 unsigned int testIndex = 0;
Sergeev 1:9b1df0b2507d 93
Sergeev 1:9b1df0b2507d 94 // Begin sampling audio
Sergeev 1:9b1df0b2507d 95 samplingBegin();
Sergeev 1:9b1df0b2507d 96
Sergeev 1:9b1df0b2507d 97 while(1)
Sergeev 1:9b1df0b2507d 98 {
Sergeev 1:9b1df0b2507d 99 // Calculate FFT if a full sample is available.
Sergeev 1:9b1df0b2507d 100 if (samplingIsDone())
Sergeev 3:1f56b8f439a1 101 {
Sergeev 1:9b1df0b2507d 102 // Run FFT on sample data.
Sergeev 1:9b1df0b2507d 103 //arm_cfft_radix2_f32(arm_cfft_radix2_instance_f32*S, samples);
Sergeev 1:9b1df0b2507d 104 arm_cfft_f32(S, samples, 0, 1);
Sergeev 3:1f56b8f439a1 105 samples[0] = samples[0]/1000;
Sergeev 3:1f56b8f439a1 106 /* Initialize the CFFT/CIFFT module */
Sergeev 3:1f56b8f439a1 107 //arm_cfft_radix2_init_f32(S, 128, 0, 1);
Sergeev 3:1f56b8f439a1 108 //arm_cfft_radix2_f32(S, samples);
Sergeev 1:9b1df0b2507d 109 for(int i = 0;i < FFT_SIZE*2;++i)
Sergeev 3:1f56b8f439a1 110 pc.printf(" Samples[%d]: %8.2f ",i,samples[i]);
Sergeev 2:707eb5bc5dfc 111 pc.printf("\r\n");
Sergeev 1:9b1df0b2507d 112 // Calculate magnitude of complex numbers output by the FFT.
Sergeev 1:9b1df0b2507d 113 arm_cmplx_mag_f32(samples, magnitudes, FFT_SIZE);
Sergeev 1:9b1df0b2507d 114 for(int i = 0;i < FFT_SIZE;++i)
Sergeev 3:1f56b8f439a1 115 pc.printf(" Magnitude: %d = %8.2f ;", i, magnitudes[i]);
Sergeev 3:1f56b8f439a1 116 pc.printf(" \r\n");
Sergeev 1:9b1df0b2507d 117 arm_max_f32(magnitudes, FFT_SIZE, &maxValue, &testIndex);
Sergeev 3:1f56b8f439a1 118 pc.printf(" MAX value at magnitudes[%d] : %+8.2f\r\n", testIndex, maxValue);
Sergeev 1:9b1df0b2507d 119 // Wait for user confirmation to restart audio sampling.
Sergeev 1:9b1df0b2507d 120 //pc.getc();
Sergeev 1:9b1df0b2507d 121 wait(1);
Sergeev 1:9b1df0b2507d 122 samplingBegin();
Sergeev 1:9b1df0b2507d 123 }
Sergeev 1:9b1df0b2507d 124 }
Sergeev 0:b712470aea1d 125 }