chalala

Dependencies:   FastAnalogIn NVIC_set_all_priorities mbed-dsp mbed

Fork of ProyFinal by Enrique Garcia

Revision:
0:2ccf3099b859
Child:
1:7655383ca5fd
diff -r 000000000000 -r 2ccf3099b859 main.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Tue Dec 01 01:08:58 2015 +0000
@@ -0,0 +1,204 @@
+#include "mbed.h"
+#include "NVIC_set_all_priorities.h"
+#include <ctype.h>
+#include "arm_math.h"
+#include "arm_const_structs.h"
+#include "FastAnalogIn.h"
+#include <string>
+
+PwmOut myled(LED_GREEN);
+Serial pc(USBTX, USBRX);
+FastAnalogIn   Audio(PTC0);
+
+////Parametros////
+int SAMPLE_RATE_HZ = 4000;  
+const int FFT_SIZE = 256;     
+
+////Otras Variables////
+const static arm_cfft_instance_f32 *S;
+Ticker samplingTimer;
+float samples[FFT_SIZE*2];
+float magnitudes[FFT_SIZE];
+int sampleCounter = 0;
+//*********//
+
+////Utilidades////
+void printArr(int bigsize, float arr[]){
+    int size = (bigsize/sizeof(arr[0]));
+    pc.printf("\r\n [");
+    int limit = size - 1;
+    for (int i = 0; i < size; i++){
+        i == limit ? pc.printf("%.3f", arr[i]): pc.printf("%.3f ,", arr[i]);
+    }
+    pc.printf("] \n");
+}
+
+int frequencyToBin(float frequency)
+{
+    float binFrequency = float(SAMPLE_RATE_HZ) / float(FFT_SIZE);
+    return int(frequency / binFrequency);
+}
+//*********//
+
+////Sampling////
+
+void samplingCallback()
+{
+    // Read from the ADC and store the sample data
+    samples[sampleCounter] = (1023 * Audio) - 511.0f;
+    // 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, 1000000/SAMPLE_RATE_HZ);
+}
+
+bool samplingIsDone()
+{
+    return sampleCounter >= FFT_SIZE*2;
+}
+
+//**********//
+
+//Funciones para DTMF//
+int col1 = frequencyToBin(1209);
+int col2 = frequencyToBin(1336);
+int col3 = frequencyToBin(1477);
+int row1 = frequencyToBin(697);
+int row2 = frequencyToBin(770);
+int row3 = frequencyToBin(852);
+int row4 = frequencyToBin(941);
+string valC1[] = {"1", "4", "7", "*"};
+string valC2[] = {"2", "5", "8", "0"};
+string valC3[] = {"3", "6", "9", "#"};
+
+
+int maxCol(){
+    int col = 0;
+    float max = 0.0;
+    if (magnitudes[col1] > max){
+        max = magnitudes[col1];
+        col = 1;    
+    }
+    if(magnitudes[col2] > max){
+        max = magnitudes[col2];
+        col = 2;   
+    }  
+    if(magnitudes[col3] > max){
+        col = 3;   
+    }   
+    return col;
+}
+
+int maxRow(){
+    int row = 0;
+    float max = 0.0;
+    if (magnitudes[row1] > max){
+        max = magnitudes[row1];
+        row = 1;    
+    }
+    if(magnitudes[row2] > max){
+        max = magnitudes[row2];
+        row = 2;   
+    }  
+    if(magnitudes[row3] > max){
+        max = magnitudes[row3];
+        row = 3;   
+    }   
+    if(magnitudes[row4] > max){
+        row = 4;   
+    }   
+    return row;
+}
+
+string valor(){
+    int R = maxRow() - 1;
+    int C = maxCol();
+    //pc.printf("Las coordenadas son: %i, %i \n", R, C); //debug
+    string salida = "no";
+    switch (C){
+        case 1:
+            salida = valC1[R];
+            break;
+        case 2:
+            salida = valC2[R];
+            break;
+        case 3:
+            salida = valC3[R];
+            break;
+    }
+    return salida;
+}
+//**********//
+
+int main(){
+    myled = 0.999;
+    
+    NVIC_set_all_irq_priorities(1);
+    NVIC_SetPriority(UART0_IRQn, 0);
+    // Set up serial port.
+    pc.baud (9600);
+    
+    // Begin sampling audio
+    samplingBegin();
+
+    // 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;
+    }
+    
+    while(true){
+        // Calculate FFT if a full sample is available.
+        if (samplingIsDone()) {
+            // Run FFT on sample data.
+            arm_cfft_f32(S, samples, 0, 1);
+            // Calculate magnitude of complex numbers output by the FFT.
+            arm_cmplx_mag_f32(samples, magnitudes, FFT_SIZE);
+            // Restart audio sampling.
+            samplingBegin();
+            //Correr identificacion de tonos
+            
+            printf(valor().c_str());
+            printf("\r\n");
+        }
+
+        
+    }
+}