[pulseaudio-discuss] I built a noise cancellation setup with two microphones and two different microphone preamplifiers that go to two different channels of a stereo recording.

Alexander Winnig vernehmlassung at googlemail.com
Sat Jul 27 12:39:53 PDT 2013


I have this question, which can also be found at 
http://stackoverflow.com/questions/17744053/noise-cancellation-setup-combining-the-microphones-signals-intelligently. 
There you can also find more detail information + pictures.

Maybe it's interesting for you and you can help.

I built a noise cancellation setup with two microphones and two 
different microphone preamplifiers that go to two different channels of 
a stereo recording.

Here is a sample I'd use as "Datei"

http://filestore.to/?d=U5FN2IH96K

I tried

    /static void *voneinanderabziehen( char *Datei)//
    //{//
    //  char ergebnis[80]; //
    //  sprintf(ergebnis,"%s.neu.raw",Datei);//
    //  FILE* ausgabe = fopen(ergebnis, "wb");//
    //  FILE* f = fopen(Datei, "rb"); //
    //  if (f == NULL)//
    //    return;//
    //  int i = -1;//
    //  int r1 = 0;//
    //  int r2 = 0;//
    //  int l1 = 0;//
    //  int l2 = 0;//
    //  int zaehler = 0;//
    //  int l = 0;//
    //  int r = 0;//
    //  int wo = 0;//
    //  int dif = 0;//
    //  float g = 0.1;//
    //  float RC = 1.0/(1215*2*3.14);//
    //  float dt = 1.0/44100;//
    //  float alpha = dt/(RC+dt);//
    //  float beginn = 0;//
    //  float vorher = 0;//
    //  int jetzt = 0;//
    ////
    //  while(wo !=EOF)//
    //  {//
    //    wo = getc(f);//
    //    if (zaehler == 0)//
    //      beginn = wo;//
    //    zaehler++;//
    ////
    //  } //
    ////  printf("zaehler: %d\n",zaehler); //
    //  wo = 0;//
    //  rewind(f); //
    ////   printf("zurückgedreht\n");//
    ////
    //  vorher = beginn;//
    //  zaehler = 1; //
    ////
    //  while(wo !=EOF)//
    //  {//
    //    wo = getc(f); //
    //    i++;//
    //    if (i == 0)//
    //      r1 = (unsigned)wo;//
    //    if (i == 1)//
    //    {//
    //      r2 = (unsigned)wo;//
    //      r = (r2<<8)+r1; //r1 | r2 << 8; //
    //    }//
    //    if (i == 2)//
    //      l1 = (unsigned)wo;//
    //    if (i == 3)//
    //    {//
    //      l2 = (unsigned)wo;//
    //      l = (l2<<8)+l1; //l1 | l2 << 8; //
    //      //dif = r - (l*2);//
    ////
    //      jetzt = vorher + (alpha*(l - vorher));//
    //      dif = r - g*jetzt;//
    //      vorher = jetzt; //
    //      zaehler++;//
    //      if (dif != 0)//
    //      {//
    //        putc((char) ( (unsigned)dif       & 0xff),ausgabe);//
    //        putc((char) (((unsigned)dif >> 8) & 0xff),ausgabe);//
    //      } //
    //      i = -1;//
    //    }//
    //  } //
    //  fclose(f);//
    //  fclose(ausgabe); //
    //  char output[300]; //
    //  sprintf(output,"rm -frv \"%s\"",Datei);//
    //  system(output);//
    //}//
    /


Which creates moderately distorted sound until I set g to 0. Using 1 for 
g creates highly distorted sound.

l = left channel
r = right Channel

I am reading in the wave raw file Datei in a binary way.
jetzt = vorher + (alpha*(l - vorher)); is a low pass filter.

If you have questions, please refer to the thread mentioned. If you have 
questions beyond the replies there I am happy to answer them here or there.

While we are at it, how do I normalize the final mono output to make it 
as loud as possible without clipping, ie what's the highest/lowest value?

Best

Alexander
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/pulseaudio-discuss/attachments/20130727/58da34b2/attachment.html>


More information about the pulseaudio-discuss mailing list