[LAD] fftw3 issue with transform higher than 1024

Justin Smith noisesmith at gmail.com
Sat Jul 25 17:57:28 UTC 2009


On Sat, Jul 25, 2009 at 8:08 AM, Guilherme
Longo<grlongo.ireland at gmail.com> wrote:
> Hi every one.
> This is my first mail to the list.
> Hope I can help you as well.
>
> I am using the fftw3 library to implement a transform in a array of 5120
> elements .
> I have this array from a program that I created modifying the arecord
> program.
>
> If someone could gimme a little help solving that problem.
>
> I have that array been filled with value in this function:
>
> static void compute_max_peak(u_char *data, size_t count)
> {
>    signed int val, max, max_peak = 0, perc;
>    size_t ocount = count;
>    int arrayt[5120][1], l, cc;
>
>    int t = 0;
>    int tcount = 0;
>
>    //zero o array
>    for (cc = 0; cc <= 1; cc++) {
>        for (l = 0; l <= 5119; l++) {
>        arrayt[l][cc] = 0;
>        }
>    }
>
>        signed short *valp = (signed short *)data; //Dados no buffer
>        signed short mask = snd_pcm_format_silence_16(hwparams.format);
> //Frames de silencio
>        count /= 2; // 5120
>        printf("Count = %i\n", count);
>
>        while (count-- > 0) {
>            val = *valp++ ^ mask;
>            val = abs(val);
>                // armazeno dados nos indices [x][0]
>            *    for (cc = 0; cc <= 0; cc++) {
>                    for (l = tcount; l <= tcount; l++) {
>                    printf("TCOUNT = %i <=> cc = %i\n", tcount, cc);
>                    arrayt[l][cc] = val;
>                    }
>                }*
>            tcount++;
>
>            if (max_peak < val) //Armazena a maior amostra em max_peak
>                max_peak = val;
>            printf("val[%i] = %i\n", t, val);
>            t++;
>    }
>
>    fftw_calculation(arrayt);
>
>    for (cc = 1; cc <= 1; cc++) {
>        for (l = 0; l <= 5119; l++) {
>        arrayt[l][cc] = 0;
>        }
>    }*/
>
>    max = 1 << (bits_per_sample-1); //2#15 = 32768
>    printf("Max peak (%li samples): %05i (0x%04x) \n", (long)ocount,
> max_peak, max_peak);
>     perc = max_peak * 100 / max;
>    for (val = 0; val < 20; val++)
>        if (val <= perc / 5)
>            putc('#', stdout);
>        else
>            putc(' ', stdout);
>    printf(" %i%%\n", perc);
>
>    for (cc = 0; cc <= 1; cc++) {
>        for (l = 0; l <= 5119; l++) {
>        printf("arrayt[%i][%i] = %i\n", l, cc, arrayt[l][cc]);
>        }
>    }
> }
>
> and the transform is calculated by this fucntion:
>
> fftw_calculation(int data[5120][1]) {
>
>
>    fftw_complex *out, *in;
>    fftw_plan p;
>    int N, l, cc;
>
>    N = 1024;
>
>    in = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * N);
>        out = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * N);
>
>    in = (fftw_complex *)data;
>
>    for (cc = 0; cc <= 1; cc++) {
>        for (l = 0; l <= 1023; l++) {
>        out[l][cc] = 0;
>        }
>    }
>
>    p = fftw_plan_dft_1d(N, in, out, -1, FFTW_ESTIMATE);
>
>    fftw_execute(p);
>
>
>    for (cc = 0; cc <= 1; cc++) {
>        for (l = 0; l <= 1023; l++) {
>        printf("out[%i][%i] = %i\n", l, cc, out[l][cc]);
>        }
>    }
>
>    //fftw_destroy_plan(p);
>
> }
>
> The problem is, I can't user N as any number higher than 1024, or I get
> segfault.
> But if you see, the array been transformed is a array of [5120][1] elements.
>
> Is there anybody here familiar with the fftw3 implementation.
> Tks in advanced.
>
> _______________________________________________
> Linux-audio-dev mailing list
> Linux-audio-dev at lists.linuxaudio.org
> http://lists.linuxaudio.org/mailman/listinfo/linux-audio-dev
>

I don't know fftw specifically, but I am fairly certain that you need
a table size that is an even power of two for fft in general (maybe
you can adjust your code to use 4096 or 8192?).



More information about the Linux-audio-dev mailing list