Proyecto de cancelación activa de ruido

Hola soy nuevo en este mundillo. Llevo un tiempo desarrollando un proyecto para el instituto, una cancelación activa de ruido. Los objetivos no son muy ambiciosos pero debe funcionar correctamente.

Estoy utilizando un Arduino Due por las salidas DAC. Lo que hago principalmente es desfasar 180 grados o, pi rad, la onda sonido que capta un micrófono. Luego lo envío hacia un altavoz para que se produzca la interferencia destructiva.
Aunque todo esto parezca muy sencillo estoy teniendo bastantes problemas.

Para empezar la velocidad de muestreo es muy importante que sea alta y por ello he intentado aumentarla. He leído el datasheet del SAM3x y el foro en inglés para escribir los registros y, he podido subir un poco esta velocidad. Pero el analogRead que escribo(ADC_CDR[pin]) no funciona y el prescaler no he encontrado como cambiarlo.

A parte, a la hora de reproducir la señal desfasada en el altavoz de este sale algo muy ruidoso. He probado varios filtros digitales y he podido atenuar esos valores tan grandes pero, aún así del altavoz sale lo mismo.
Además si golpeo el micrófono el altavoz no reacciona a estos.

He probado bastantes cosas como los filtros digitales, diferentes códigos, la corrección del offset... y nada. Si alguien pudiera aportar algo seria de gran ayuda.

Muchas gracias!

Materiales que he utilizado:
-Electret microphone adafruit- MAX9814 with AGC
-Arduino Due
-Altavoces pioneer hi-fi con amplificador
-1x resistencia de 10kohm
-Cable jack jack
-Cable jack "pelado" para poder conectarlo a la breadboard

float values[1000], filter;
int n = 0, offset = 50;
float amplitud, out;

void setup() 
{
 Serial.begin(9600);
 analogWriteResolution(12);
 
 ADC->ADC_CHER = 0x80; //abre ADC en el pin A0
  ADC->ADC_MR |= ADC_MR_FREERUN_ON    //FREE RUN
  | ADC_MR_LOWRES_BITS_12 //RESOLUCIÓN
  | ADC_MR_PRESCAL(1)     //PRESCALER (NO FUNCIONA BIEN)
  | ADC_MR_SETTLING_AST3  //TIEMPO DE LECTURA O CONVERSIÓN DEL ADC
  | ADC_MR_TRACKTIM(10)   //TIEMPO DE TRACKEO DEL ADC
  | ADC_MR_TRANSFER(2);   //TIEMPO DE TRANSFERENCIA
}

void loop() 
{
  //Lectura del micrófono
  values[n] = analogRead(A0);
  n++;
  //filtro mediana
  filter = values[n]*0.5+values[n-1]*0.3+values[n-3]*0.1+values[n-4]*0.1;
  //Corrección del offset
  filter = filter-offset;
  //Cálculo de la amplitud del sonido restando el valor que obtenemos del micrófono 
  //con el del valor 1550, que es el equivalente 0 de la onda
  amplitud = filter - 1550;
  //onda desfasada
  out = 1550 - amplitud;
  //Envio al DAC hacia el altavoz
  analogWrite(DAC1, out);

  //print de los valores que obtenemos
  Serial.print(values[n]);
  Serial.print(",");
  Serial.print(filter);
  Serial.print(",");
  Serial.println(out);
 }

PD: el 1550 del código equivalea 1,5v que es el valor que corresponde a una medida de 0 del micrófono

Hay uno o dos hilos donde indico como llegar a 1 MegaS/seg

Solo búscalo en la lupa (Arriba derecha).

Gracias por rsponder. Pero ese post ya lo vi, y como dije los registros del prescaler y el analogRead no me funcionan.