An floppy drive audio generator using dsp on live audio

Dependencies:   Terminal asyncADC mbed-dsp mbed

Revision:
0:84c336a81482
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Wed May 24 11:58:43 2017 +0000
@@ -0,0 +1,190 @@
+//#include "mbed.h"
+//#include <algorithm>
+//#include "asyncADC.h"
+//#include "arm_math.h"
+//#include "arm_common_tables.h"
+//#include "moppy.h"
+//#include "Terminal.h"
+//
+//#define AUDIO_PIN       (A0)
+// 
+//Terminal pc(USBTX, USBRX, 115200);
+//DigitalOut process_led(LED3); // Blue
+//Timer timer;
+//
+//#define FFT_SIZE 2048
+//#define SAMPLE_RATE_HZ  10000    // Sample rate in Hertz
+//#include "fft.h"
+//
+//#define BIN_TO_FREQ(bin)  ((bin*(long)SAMPLE_RATE_HZ)/FFT_SIZE)
+//
+//
+//#define FREQ_ANALYSER_SCALAR    (3)
+//#define FREQ_ANALYSER_WIDTH     (FFT_SIZE>>(FREQ_ANALYSER_SCALAR+1))
+//#define FREQ_ANALYSER_HEIGHT    (10)
+//
+////BUFFERS
+//
+//uint16_t adcBuffer[FFT_SIZE*2];
+//float fftBuffer[FFT_SIZE*2];
+//float magnitudes[FFT_SIZE];
+//char pcBuffer1[FREQ_ANALYSER_WIDTH+3];
+//char pcBuffer2[FREQ_ANALYSER_WIDTH+3];
+//
+//
+//// INTERRUPTS
+//
+//volatile int sectionCounter = 0;
+//volatile bool sectionFilled = false;
+//volatile uint32_t sectionStart, sectionEnd;
+//
+//void callback(uint32_t start, uint32_t end) {
+//    sectionFilled = true;
+//    sectionCounter++;
+//    sectionStart = start;
+//    sectionEnd = end;
+//}
+//
+//// UTILS
+//
+//uint32_t ceilToPowerOf2(uint32_t i) {
+//    i--;
+//    i|=(i>>1);
+//    i|=(i>>2);
+//    i|=(i>>4);
+//    i|=(i>>8);
+//    i|=(i>>16);
+//    return i+1;
+//}
+//
+//void trySwp(int16_t *indices, float *magnitudes, int a, int b) {
+//    if(magnitudes[indices[a]]>magnitudes[indices[b]]) {
+//        int x = indices[a];
+//        indices[a] = indices[b];
+//        indices[b] = x;
+//    }
+//}
+//
+//void sort(int16_t *indices, float *magnitudes, int size) {
+//    indices[0] = 0;
+//    for(int i=1; i<size; i++) {
+//        indices[i]=i;
+//        for(int j=i; j-->0;) {
+//            trySwp(indices, magnitudes, j, j+1);
+//        }
+//    }
+//}
+//
+//bool magComparator(int const & a, int const & b) {
+//    return magnitudes[a] > magnitudes[b];
+//}
+//
+//// MAIN
+//
+//int main()
+//{
+//    
+//    pcBuffer1[0] = '|';
+//    pcBuffer1[FREQ_ANALYSER_WIDTH+1] = '|';
+//    pcBuffer1[FREQ_ANALYSER_WIDTH+2] = 0;
+//    memset(pcBuffer2+1, '-', FREQ_ANALYSER_WIDTH);
+//    pcBuffer2[0] = '+';
+//    pcBuffer2[FREQ_ANALYSER_WIDTH+1] = '+';
+//    pcBuffer2[FREQ_ANALYSER_WIDTH+2] = 0;
+//    
+//    process_led = 1;
+//    
+//    pc.cls();
+//    pc.cursor(false);
+//    pc.locate(0,0);
+//    pc.printf("Synchronising Floppy Drives\r\n");
+//    
+//    Moppy moppy(D1, D0, 38400); // tx, rx, baud
+//    
+//    pc.printf("Setup Complete\r\n");
+//    
+//    switch(asyncAnalogToCircularBuffer(AUDIO_PIN, adcBuffer, 2*FFT_SIZE, SAMPLE_RATE_HZ, callback)) {
+//        case E_ASYNC_ADC_ACTIVE:
+//            error("AsyncADC already in use");
+//        case E_DMA_IN_USE:
+//            error("DMA already in use");
+//        case E_INVALID_BUFFER_SIZE:
+//            error("Invalid destination buffer size");
+//    }
+//    
+//    int16_t indices[FFT_SIZE*2];
+//            
+//    timer.start();
+//    
+//    pc.locate(0,16);
+//    pc.printf("%dHz", BIN_TO_FREQ(1));
+//    pc.locate(FREQ_ANALYSER_WIDTH-20,16);
+//    pc.printf("%20dHz", BIN_TO_FREQ(FFT_SIZE/2));
+//    
+//    while(1) {
+//        if(sectionFilled) {
+//            process_led = 0;
+//            
+//            timer.reset();
+//            
+//            //convert to floating point
+//            for(int i=sectionStart, j=0; i<=sectionEnd; i++, j+=2) {
+//                fftBuffer[j] = (float)adcBuffer[i];
+//                fftBuffer[j+1] = 0.0f;
+//            }
+//                
+//            // Calculate FFT if a full sample is available.
+//            // Run FFT on sample data.
+//            arm_cfft_f32(FFT_BUFFER, fftBuffer, 0, 1);
+//            // Calculate magnitude of complex numbers output by the FFT.
+//            arm_cmplx_mag_f32(fftBuffer, magnitudes, FFT_SIZE);
+//            
+//            for(int i=1; i<FFT_SIZE; i++)
+//                indices[i]=i;
+//            std::sort(indices + 1, indices + (FFT_SIZE/2), magComparator);
+//            
+//            //REMEMBER: Ignore Indicies[0]!!!!
+//            moppy.setFrequency(0, BIN_TO_FREQ(indices[1]));
+//            moppy.setFrequency(1, BIN_TO_FREQ(indices[2]));
+//            moppy.setFrequency(2, BIN_TO_FREQ(indices[3]));
+//            moppy.setFrequency(3, BIN_TO_FREQ(indices[4]));
+//            moppy.flush();
+//            
+//            pc.locate(0, 4);
+//            pc.puts(pcBuffer2);
+//            memset(pcBuffer1+1, ' ', FREQ_ANALYSER_WIDTH);
+//            float max = magnitudes[indices[1]];
+//            if(max<1000000) max = 1000000;
+//            for(int i=2; i<FFT_SIZE/2; i++) {
+//                int j = (i>>FREQ_ANALYSER_SCALAR)+1;
+//                if(magnitudes[i] > magnitudes[j])
+//                    magnitudes[j] = magnitudes[i];
+//            }
+//            for(int y=0; y<FREQ_ANALYSER_HEIGHT; y++) {
+//                float thresh = max*(FREQ_ANALYSER_HEIGHT-y)/(FREQ_ANALYSER_HEIGHT+1.0f);//((FREQ_ANALYSER_HEIGHT-1)-y)*max/(FREQ_ANALYSER_HEIGHT+1);
+//                for(int x=1; x<=FREQ_ANALYSER_WIDTH; x++)
+//                    if(pcBuffer1[x]!='#' && magnitudes[x]>thresh)
+//                        pcBuffer1[x]='#';
+//                pc.locate(0, y+5);
+//                pc.puts(pcBuffer1);
+//            }
+//            pc.locate(0, FREQ_ANALYSER_HEIGHT+5);
+//            pc.puts(pcBuffer2);
+//            
+//            
+//            long process_time = timer.read_us();
+//            
+//            
+//            long x = (process_time)/(100*FFT_SIZE/SAMPLE_RATE_HZ);
+//            
+//            pc.locate(0,2);
+//            pc.printf("Process Time:%3d.%02dms  ~%d.%02d%%", process_time/1000, ((process_time+5)/10)%100, x/100, x%100);
+////            pc.printf("\r\n%f", magnitudes[indices[1]]);
+//            
+//            process_led = 1;
+//            
+//            sectionFilled = false;
+//        }
+//        sleep();
+//    }
+//}
\ No newline at end of file