Ura

Dependencies:   CMSIS_DSP_401 mbed

Committer:
Sergeev
Date:
Sat Nov 29 16:36:16 2014 +0000
Revision:
9:748d94f021f6
Parent:
8:027ed43684af
??????

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 7:a4cff60f035b 5 #include "stm32f4xx_hal.h"
Sergeev 7:a4cff60f035b 6 #include <stdio.h>
Sergeev 7:a4cff60f035b 7
Sergeev 7:a4cff60f035b 8
Sergeev 7:a4cff60f035b 9 /* SPI handler declaration */
Sergeev 9:748d94f021f6 10 SPI_HandleTypeDef SpiHandle;//pemennaya dlia hraneniya
Sergeev 1:9b1df0b2507d 11
Sergeev 9:748d94f021f6 12 void arm_cfft_f32(
Sergeev 9:748d94f021f6 13 const arm_cfft_instance_f32 * S,
Sergeev 1:9b1df0b2507d 14 float32_t * p1,
Sergeev 1:9b1df0b2507d 15 uint8_t ifftFlag,
Sergeev 9:748d94f021f6 16 uint8_t bitReverseFlag);//fynktsiya
Sergeev 0:b712470aea1d 17
Sergeev 5:173ae8477ae1 18 Serial pc(USBTX, USBRX);//:D ПРИВЕТ!!!!
Sergeev 1:9b1df0b2507d 19
Sergeev 9:748d94f021f6 20 AnalogIn left(A2);//microfony
Sergeev 1:9b1df0b2507d 21 AnalogIn right(A3);
Sergeev 5:173ae8477ae1 22 AnalogIn center(A3);
Sergeev 7:a4cff60f035b 23
Sergeev 7:a4cff60f035b 24 int flag = 0;
Sergeev 1:9b1df0b2507d 25
Sergeev 8:027ed43684af 26 const int SAMPLE_RATE_HZ = 40000; // Sample rate of the audio in hertz.
Sergeev 6:0de27f5ec409 27 const int FFT_SIZE = 16; // Size of the FFT.
Sergeev 1:9b1df0b2507d 28
Sergeev 9:748d94f021f6 29 const static arm_cfft_instance_f32 *S1;//ykazateli na prametru preobrazovaniya fyrie
Sergeev 6:0de27f5ec409 30 const static arm_cfft_instance_f32 *S2;
Sergeev 6:0de27f5ec409 31 const static arm_cfft_instance_f32 *S3;
Sergeev 3:1f56b8f439a1 32 //static arm_cfft_radix2_instance_f32 *S;
Sergeev 1:9b1df0b2507d 33 Ticker samplingTimer;
Sergeev 9:748d94f021f6 34 float samples[FFT_SIZE*2];//dannue s analog vhodov
Sergeev 5:173ae8477ae1 35 float samples2[FFT_SIZE*2];
Sergeev 5:173ae8477ae1 36 float samples3[FFT_SIZE*2];
Sergeev 5:173ae8477ae1 37
Sergeev 1:9b1df0b2507d 38 float magnitudes[FFT_SIZE];
Sergeev 5:173ae8477ae1 39 float magnitudes2[FFT_SIZE];
Sergeev 5:173ae8477ae1 40 float magnitudes3[FFT_SIZE];
Sergeev 1:9b1df0b2507d 41 int sampleCounter = 0;
Sergeev 5:173ae8477ae1 42
Sergeev 9:748d94f021f6 43 const int SAMPLE_QUANTITY = 1000000/(16*(1000000/SAMPLE_RATE_HZ));//dlitelnost sempla po vremeni v milisek
Sergeev 9:748d94f021f6 44
Sergeev 9:748d94f021f6 45 float magnitudes_per_second[SAMPLE_QUANTITY];//sohran magnitydy
Sergeev 9:748d94f021f6 46 int index_of_magnitudes[SAMPLE_QUANTITY];//mesto v masive magnitydu
Sergeev 9:748d94f021f6 47 int index_of_samples;
Sergeev 8:027ed43684af 48
Sergeev 9:748d94f021f6 49 float magnitudes_per_second2[SAMPLE_QUANTITY];//sohran magnitydy
Sergeev 9:748d94f021f6 50 int index_of_magnitudes2[SAMPLE_QUANTITY];//mesto v masive magnitydu
Sergeev 9:748d94f021f6 51 int index_of_samples2;
Sergeev 9:748d94f021f6 52
Sergeev 9:748d94f021f6 53 float magnitudes_per_second3[SAMPLE_QUANTITY];//sohran magnitydy
Sergeev 9:748d94f021f6 54 int index_of_magnitudes3[SAMPLE_QUANTITY];//mesto v masive magnitydu
Sergeev 9:748d94f021f6 55 int index_of_samples3;
Sergeev 9:748d94f021f6 56
Sergeev 1:9b1df0b2507d 57 void samplingCallback()
Sergeev 9:748d94f021f6 58 {
Sergeev 1:9b1df0b2507d 59 // Read from the ADC and store the sample data
Sergeev 3:1f56b8f439a1 60 samples[sampleCounter] = 1000*left.read();
Sergeev 5:173ae8477ae1 61 samples2[sampleCounter] = 1000*left.read();
Sergeev 5:173ae8477ae1 62 samples3[sampleCounter] = 1000*left.read();
Sergeev 1:9b1df0b2507d 63 // Complex FFT functions require a coefficient for the imaginary part of the input.
Sergeev 1:9b1df0b2507d 64 // Since we only have real data, set this coefficient to zero.
Sergeev 1:9b1df0b2507d 65 samples[sampleCounter+1] = 0.0;
Sergeev 5:173ae8477ae1 66 samples2[sampleCounter+1] = 0.0;
Sergeev 5:173ae8477ae1 67 samples3[sampleCounter+1] = 0.0;
Sergeev 1:9b1df0b2507d 68 // Update sample buffer position and stop after the buffer is filled
Sergeev 9:748d94f021f6 69
Sergeev 9:748d94f021f6 70 sampleCounter += 2;//pri razbitti dannuh ostavliaem mesto dila mnimoy 4sti
Sergeev 9:748d94f021f6 71
Sergeev 1:9b1df0b2507d 72 if (sampleCounter >= FFT_SIZE*2) {
Sergeev 1:9b1df0b2507d 73 samplingTimer.detach();
Sergeev 9:748d94f021f6 74 }//obrabotano sobutie taimera
Sergeev 1:9b1df0b2507d 75 }
Sergeev 1:9b1df0b2507d 76
Sergeev 1:9b1df0b2507d 77 void samplingBegin()
Sergeev 1:9b1df0b2507d 78 {
Sergeev 1:9b1df0b2507d 79 // Reset sample buffer position and start callback at necessary rate.
Sergeev 1:9b1df0b2507d 80 sampleCounter = 0;
Sergeev 9:748d94f021f6 81 samplingTimer.attach_us(&samplingCallback, (float)(1000000/SAMPLE_RATE_HZ));//na4ala poly4eniya dannuh s microfona po taimery
Sergeev 1:9b1df0b2507d 82 }
Sergeev 1:9b1df0b2507d 83
Sergeev 1:9b1df0b2507d 84 bool samplingIsDone()
Sergeev 1:9b1df0b2507d 85 {
Sergeev 9:748d94f021f6 86 return sampleCounter >= FFT_SIZE*2;//koli4estvo poly4enuh semplov
Sergeev 0:b712470aea1d 87 }
Sergeev 1:9b1df0b2507d 88
Sergeev 1:9b1df0b2507d 89 int main()
Sergeev 0:b712470aea1d 90 {
Sergeev 9:748d94f021f6 91
Sergeev 9:748d94f021f6 92 static uint32_t cnt1=0;//s4et4ik vremeni
Sergeev 9:748d94f021f6 93
Sergeev 1:9b1df0b2507d 94 // Init arm_ccft_32
Sergeev 9:748d94f021f6 95 switch (FFT_SIZE)//vupolniaem operatsiy pobitovogo i
Sergeev 1:9b1df0b2507d 96 {
Sergeev 1:9b1df0b2507d 97 case 16:
Sergeev 6:0de27f5ec409 98 S1 = & arm_cfft_sR_f32_len16;
Sergeev 6:0de27f5ec409 99 S2 = & arm_cfft_sR_f32_len16;
Sergeev 6:0de27f5ec409 100 S3 = & arm_cfft_sR_f32_len16;
Sergeev 1:9b1df0b2507d 101 break;
Sergeev 1:9b1df0b2507d 102 case 32:
Sergeev 6:0de27f5ec409 103 S1 = & arm_cfft_sR_f32_len32;
Sergeev 6:0de27f5ec409 104 S2 = & arm_cfft_sR_f32_len32;
Sergeev 6:0de27f5ec409 105 S3 = & arm_cfft_sR_f32_len32;
Sergeev 1:9b1df0b2507d 106 break;
Sergeev 1:9b1df0b2507d 107 case 64:
Sergeev 6:0de27f5ec409 108 S1 = & arm_cfft_sR_f32_len64;
Sergeev 6:0de27f5ec409 109 S2 = & arm_cfft_sR_f32_len64;
Sergeev 6:0de27f5ec409 110 S3 = & arm_cfft_sR_f32_len64;
Sergeev 1:9b1df0b2507d 111 break;
Sergeev 1:9b1df0b2507d 112 case 128:
Sergeev 6:0de27f5ec409 113 S1 = & arm_cfft_sR_f32_len128;
Sergeev 6:0de27f5ec409 114 S2 = & arm_cfft_sR_f32_len128;
Sergeev 6:0de27f5ec409 115 S3 = & arm_cfft_sR_f32_len128;
Sergeev 1:9b1df0b2507d 116 break;
Sergeev 1:9b1df0b2507d 117 case 256:
Sergeev 6:0de27f5ec409 118 S1 = & arm_cfft_sR_f32_len256;
Sergeev 6:0de27f5ec409 119 S2 = & arm_cfft_sR_f32_len256;
Sergeev 6:0de27f5ec409 120 S3 = & arm_cfft_sR_f32_len256;
Sergeev 1:9b1df0b2507d 121 break;
Sergeev 1:9b1df0b2507d 122 case 512:
Sergeev 6:0de27f5ec409 123 S1 = & arm_cfft_sR_f32_len512;
Sergeev 6:0de27f5ec409 124 S2 = & arm_cfft_sR_f32_len512;
Sergeev 6:0de27f5ec409 125 S3 = & arm_cfft_sR_f32_len512;
Sergeev 1:9b1df0b2507d 126 break;
Sergeev 1:9b1df0b2507d 127 case 1024:
Sergeev 6:0de27f5ec409 128 S1 = & arm_cfft_sR_f32_len1024;
Sergeev 6:0de27f5ec409 129 S2 = & arm_cfft_sR_f32_len1024;
Sergeev 6:0de27f5ec409 130 S3 = & arm_cfft_sR_f32_len1024;
Sergeev 1:9b1df0b2507d 131 break;
Sergeev 1:9b1df0b2507d 132 case 2048:
Sergeev 6:0de27f5ec409 133 S1 = & arm_cfft_sR_f32_len2048;
Sergeev 6:0de27f5ec409 134 S2 = & arm_cfft_sR_f32_len2048;
Sergeev 6:0de27f5ec409 135 S3 = & arm_cfft_sR_f32_len2048;
Sergeev 1:9b1df0b2507d 136 break;
Sergeev 1:9b1df0b2507d 137 case 4096:
Sergeev 6:0de27f5ec409 138 S1 = & arm_cfft_sR_f32_len4096;
Sergeev 6:0de27f5ec409 139 S2 = & arm_cfft_sR_f32_len4096;
Sergeev 6:0de27f5ec409 140 S3 = & arm_cfft_sR_f32_len4096;
Sergeev 1:9b1df0b2507d 141 break;
Sergeev 1:9b1df0b2507d 142 }
Sergeev 1:9b1df0b2507d 143 float maxValue = 0.0f;
Sergeev 5:173ae8477ae1 144 float maxValue2 = 0.0f;
Sergeev 5:173ae8477ae1 145 float maxValue3 = 0.0f;
Sergeev 9:748d94f021f6 146
Sergeev 1:9b1df0b2507d 147 unsigned int testIndex = 0;
Sergeev 5:173ae8477ae1 148 unsigned int testIndex2 = 0;
Sergeev 5:173ae8477ae1 149 unsigned int testIndex3 = 0;
Sergeev 1:9b1df0b2507d 150
Sergeev 1:9b1df0b2507d 151 // Begin sampling audio
Sergeev 1:9b1df0b2507d 152 samplingBegin();
Sergeev 1:9b1df0b2507d 153
Sergeev 1:9b1df0b2507d 154 while(1)
Sergeev 9:748d94f021f6 155 // Calculate FFT if a full sample is available. vu4islenie bustrogo fyrie preobrazovaniya /rez v samples
Sergeev 1:9b1df0b2507d 156 if (samplingIsDone())
Sergeev 9:748d94f021f6 157 {
Sergeev 1:9b1df0b2507d 158 // Run FFT on sample data.
Sergeev 6:0de27f5ec409 159 arm_cfft_f32(S1, samples, 0, 1);
Sergeev 6:0de27f5ec409 160 arm_cfft_f32(S2, samples2, 0, 1);
Sergeev 6:0de27f5ec409 161 arm_cfft_f32(S3, samples3, 0, 1);
Sergeev 7:a4cff60f035b 162 samples[0]=0;
Sergeev 7:a4cff60f035b 163 samples2[0]=0;
Sergeev 7:a4cff60f035b 164 samples3[0]=0;
Sergeev 9:748d94f021f6 165
Sergeev 1:9b1df0b2507d 166 arm_cmplx_mag_f32(samples, magnitudes, FFT_SIZE);
Sergeev 5:173ae8477ae1 167 arm_cmplx_mag_f32(samples2, magnitudes2, FFT_SIZE);
Sergeev 5:173ae8477ae1 168 arm_cmplx_mag_f32(samples3, magnitudes3, FFT_SIZE);
Sergeev 9:748d94f021f6 169
Sergeev 1:9b1df0b2507d 170 arm_max_f32(magnitudes, FFT_SIZE, &maxValue, &testIndex);
Sergeev 5:173ae8477ae1 171 arm_max_f32(magnitudes2, FFT_SIZE, &maxValue2, &testIndex2);
Sergeev 5:173ae8477ae1 172 arm_max_f32(magnitudes3, FFT_SIZE, &maxValue3, &testIndex3);
Sergeev 9:748d94f021f6 173
Sergeev 8:027ed43684af 174
Sergeev 9:748d94f021f6 175
Sergeev 7:a4cff60f035b 176 {
Sergeev 7:a4cff60f035b 177 if (HAL_GetTick() > (cnt1 + 1000))
Sergeev 7:a4cff60f035b 178 {
Sergeev 7:a4cff60f035b 179 cnt1=HAL_GetTick();
Sergeev 7:a4cff60f035b 180 if (flag==0){
Sergeev 9:748d94f021f6 181 pc.printf(" MAX value at magnitudes 1[%d] : %+8.2f\r\n", testIndex, maxValue);
Sergeev 7:a4cff60f035b 182 pc.printf(" MAX value at magnitudes 2[%d] : %+8.2f\r\n", testIndex2, maxValue2);
Sergeev 9:748d94f021f6 183 pc.printf(" MAX value at magnitudes 3[%d] : %+8.2f\r\n", testIndex3, maxValue3);
Sergeev 7:a4cff60f035b 184 flag++;
Sergeev 7:a4cff60f035b 185 }
Sergeev 7:a4cff60f035b 186 else if (flag==1){
Sergeev 7:a4cff60f035b 187
Sergeev 7:a4cff60f035b 188 flag++;
Sergeev 7:a4cff60f035b 189 }
Sergeev 7:a4cff60f035b 190 else if (flag==2){
Sergeev 7:a4cff60f035b 191
Sergeev 7:a4cff60f035b 192 flag=0;
Sergeev 7:a4cff60f035b 193 }
Sergeev 7:a4cff60f035b 194 }
Sergeev 9:748d94f021f6 195
Sergeev 9:748d94f021f6 196
Sergeev 5:173ae8477ae1 197 double delta_t = 0;
Sergeev 5:173ae8477ae1 198 if ((testIndex < testIndex2) and (testIndex < testIndex3) and (testIndex2 < testIndex3))
Sergeev 5:173ae8477ae1 199 delta_t = (testIndex3 - testIndex)*0.000025;
Sergeev 5:173ae8477ae1 200 else if ((testIndex < testIndex2)and(testIndex < testIndex3)and(testIndex2 > testIndex3))
Sergeev 5:173ae8477ae1 201 delta_t = (testIndex2 - testIndex)*0.000025;
Sergeev 5:173ae8477ae1 202 else if ((testIndex2 < testIndex3)and(testIndex2 < testIndex)and(testIndex < testIndex3))
Sergeev 5:173ae8477ae1 203 delta_t = (testIndex3 - testIndex2)*0.000025;
Sergeev 5:173ae8477ae1 204 else if ((testIndex2 < testIndex3)and(testIndex2 < testIndex)and(testIndex > testIndex3))
Sergeev 5:173ae8477ae1 205 delta_t = (testIndex - testIndex3)*0.000025;
Sergeev 5:173ae8477ae1 206 else if (testIndex2 < testIndex)
Sergeev 5:173ae8477ae1 207 delta_t = (testIndex - testIndex3)*0.000025;
Sergeev 5:173ae8477ae1 208 else
Sergeev 5:173ae8477ae1 209 delta_t = (testIndex - testIndex2)*0.000025;
Sergeev 5:173ae8477ae1 210 double fi = asin(330*delta_t/0.33);
Sergeev 7:a4cff60f035b 211
Sergeev 8:027ed43684af 212
Sergeev 8:027ed43684af 213 magnitudes_per_second[index_of_samples]=maxValue;
Sergeev 8:027ed43684af 214 index_of_magnitudes[testIndex]=testIndex;
Sergeev 9:748d94f021f6 215
Sergeev 9:748d94f021f6 216 magnitudes_per_second2[index_of_samples2]=maxValue2;
Sergeev 9:748d94f021f6 217 index_of_magnitudes2[testIndex2]=testIndex2;
Sergeev 9:748d94f021f6 218
Sergeev 9:748d94f021f6 219 magnitudes_per_second3[index_of_samples3]=maxValue3;
Sergeev 9:748d94f021f6 220 index_of_magnitudes3[testIndex3]=testIndex3;
Sergeev 9:748d94f021f6 221
Sergeev 7:a4cff60f035b 222 if (HAL_GetTick() > (cnt1 + 1000))
Sergeev 7:a4cff60f035b 223 {
Sergeev 7:a4cff60f035b 224 cnt1=HAL_GetTick();
Sergeev 7:a4cff60f035b 225 if (flag==0){
Sergeev 9:748d94f021f6 226 float max_magnitude_per_second = 0;
Sergeev 9:748d94f021f6 227
Sergeev 9:748d94f021f6 228 float max_magnitude_per_second2 = 0;
Sergeev 9:748d94f021f6 229
Sergeev 9:748d94f021f6 230 float max_magnitude_per_second3 = 0;
Sergeev 9:748d94f021f6 231
Sergeev 9:748d94f021f6 232
Sergeev 9:748d94f021f6 233 unsigned int index_max_of_mag;
Sergeev 9:748d94f021f6 234 unsigned int index_max_of_mag2;
Sergeev 9:748d94f021f6 235 unsigned int index_max_of_mag3;
Sergeev 9:748d94f021f6 236
Sergeev 9:748d94f021f6 237 arm_max_f32(magnitudes_per_second, FFT_SIZE, &max_magnitude_per_second, &index_max_of_mag);
Sergeev 9:748d94f021f6 238 arm_max_f32(magnitudes_per_second2, FFT_SIZE, &max_magnitude_per_second2, &index_max_of_mag2);
Sergeev 9:748d94f021f6 239 arm_max_f32(magnitudes, FFT_SIZE, &max_magnitude_per_second3, &index_max_of_mag3);
Sergeev 9:748d94f021f6 240
Sergeev 9:748d94f021f6 241 pc.printf(" MAX value at magnitudes 1[%d] : %+8.2f\r\n", index_max_of_mag, max_magnitude_per_second);//Я НЯШКА А АНЯ ВЛАСЮК КОЗА:DDDDDDDDDDDDD
Sergeev 9:748d94f021f6 242 pc.printf(" MAX value at magnitudes 2[%d] : %+8.2f\r\n", index_max_of_mag2, max_magnitude_per_second2);
Sergeev 9:748d94f021f6 243 pc.printf(" MAX value at magnitudes 3[%d] : %+8.2f\r\n", index_max_of_mag3, max_magnitude_per_second3);
Sergeev 7:a4cff60f035b 244 pc.printf(" Angle is : %+8.2f\r\n", fi);
Sergeev 8:027ed43684af 245 index_of_samples = 0;
Sergeev 7:a4cff60f035b 246 flag++;
Sergeev 7:a4cff60f035b 247 }
Sergeev 7:a4cff60f035b 248 else if (flag==1){
Sergeev 7:a4cff60f035b 249
Sergeev 7:a4cff60f035b 250 flag++;
Sergeev 7:a4cff60f035b 251 }
Sergeev 7:a4cff60f035b 252 else if (flag==2){
Sergeev 7:a4cff60f035b 253
Sergeev 7:a4cff60f035b 254 flag=0;
Sergeev 7:a4cff60f035b 255 }
Sergeev 7:a4cff60f035b 256 }
Sergeev 8:027ed43684af 257 else
Sergeev 8:027ed43684af 258 index_of_samples++;
Sergeev 9:748d94f021f6 259 index_of_samples2++;
Sergeev 9:748d94f021f6 260 index_of_samples3++;
Sergeev 7:a4cff60f035b 261
Sergeev 7:a4cff60f035b 262
Sergeev 1:9b1df0b2507d 263 samplingBegin();
Sergeev 1:9b1df0b2507d 264 }
Sergeev 1:9b1df0b2507d 265 }
Sergeev 6:0de27f5ec409 266 }