#include #include //#define DUMPCHUNK static const char SW[] = __FILE__ "," __DATE__ " " __TIME__; const uint8_t ADC_PIN = A2; const uint16_t ADC_MIDPOINT = 127; ADC adc; const uint16_t AVSIZE = 128; DMAMEM static volatile uint16_t __attribute__((aligned(32))) av1[AVSIZE], av2[AVSIZE]; AnalogBufferDMA abdma(av1,AVSIZE,av2,AVSIZE); const float GOER_FREQ = 7930.0; const float GOER_RATE = GOER_FREQ*4.0; float coef = 2.0*cos(2.0*PI*GOER_FREQ/GOER_RATE); void setup() { Serial.begin(115200); while (!Serial && millis() < 5000) continue; const char* sw = SW; for (const char* p = SW; *p; p++) if (*p=='\\') sw = p+1; Serial.println(sw); pinMode(ADC_PIN,INPUT); adc.adc0->setReference(ADC_REFERENCE::REF_3V3); adc.adc0->setAveraging(0); // set number of averages adc.adc0->setResolution(8); // set bits of resolution adc.adc0->setSamplingSpeed(ADC_SAMPLING_SPEED::MED_SPEED); abdma.init(&adc, ADC_0); adc.adc0->startSingleRead(ADC_PIN); // call this to setup everything before the Timer starts, differential is also possible adc.adc0->startTimer(GOER_RATE); //frequency in Hz} } void loop() { if (abdma.interrupted()) { volatile uint16_t *av = abdma.bufferLastISRFilled(); volatile uint16_t *avend = av + abdma.bufferCountLastISRFilled(); if ((uint32_t)av >= 0x20200000u) arm_dcache_delete((void*)av,sizeof(av1)); processaudiochunk(av,avend); abdma.clearInterrupt(); } } void processaudiochunk (volatile uint16_t *av, volatile uint16_t *avend) { volatile uint16_t *ap = av; float q0, q1 = 0, q2 = 0; while (ap=(insound?40.0:400.0); if (newsound) { if (!insound) { insound = true; #ifdef DUMPCHUNK Serial.printf("%lu",chunkno); volatile uint16_t *ap = av; while (ap