[alsa-devel] frequency analysis with alsa and fftw

Markus Vogl markus.vogl at gmx.net
Mon Dec 28 13:16:13 CET 2009


 

> -----Ursprüngliche Nachricht-----
> Von: Jan-Benedict Glaw [mailto:jbglaw at lug-owl.de] 
> Gesendet: Sonntag, 27. Dezember 2009 15:05
> An: Markus Vogl
> Cc: alsa-devel at alsa-project.org
> Betreff: Re: [alsa-devel] frequency analysis with alsa and fftw
> 
> On Sun, 2009-12-27 14:50:20 +0100, Markus Vogl 
> <markus.vogl at gmx.net> wrote:
> > Von: Jan-Benedict Glaw [mailto:jbglaw at lug-owl.de]:
> > > On Sun, 2009-12-27 13:26:31 +0100, Markus Vogl 
> <markus.vogl at gmx.net> wrote:
> > > > my project is to analyse the mic input frequency from 
> my asus eepc 
> > > > 1008ha with ubuntu 9.10  and show it in a terminal window.
> > > > i would use my acoustic 6 string guitar to play in front of my 
> > > > netbook.
> > > >  
> > > > i´ve testet the howto from linuxjornal.com ..
> > > > http://www.linuxjournal.com/article/6735
> > > >  
> > > > ...but i´ve no plan to use the mic input and  then 
> analyse it with 
> > > > fftw.
> > > 
> > > Why do you need to do ALSA programming in the first 
> place? Isn't it 
> > > enough to use any given ALSA-capable audio recorder (eg.
> > > arecord) to record some sound, convert it to raw PCM data 
> (eg. cut 
> > > off the WAV header) and then shift all the data into the FFT lib?
> >
> > i have to do this in realtime (like a guitartuner) and with my 
> > "project" i have to see the frequency shift in realtime in 
> a terminal 
> > window.
> 
> Sure. Just let eg. arecord write to stdout or to a FIFO and 
> read the data from there. You can directly request raw 
> output, all you need to do is to shouvle the data through the 
> FTT lib...

Who can me explain how i can transfer the frame/buffer to the
fftw3.lib? This is from the howto example at linuxjournal
and in the "while loop" is the frame that i can use for DFT 
...or i´m wrong? 

while (loops > 0) {
    loops--;
    rc = snd_pcm_readi(handle, buffer, frames);
    if (rc == -EPIPE) {
      /* EPIPE means overrun */
      fprintf(stderr, "overrun occurred\n");
      snd_pcm_prepare(handle);
    } else if (rc < 0) {
      fprintf(stderr,
              "error from read: %s\n",
              snd_strerror(rc));
    } else if (rc != (int)frames) {
      fprintf(stderr, "short read, read %d frames\n", rc);
    }
    rc = write(1, buffer, size);
    if (rc != size)
      fprintf(stderr,
              "short write: wrote %d bytes\n", rc);
  }

regards
markus



More information about the Alsa-devel mailing list