[LAD] fftw3 issue with transform higher than 1024

From: Guilherme Longo <grlongo.ireland@email-addr-hidden>
Date: Sat Jul 25 2009 - 18:08:27 EEST

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@email-addr-hidden
http://lists.linuxaudio.org/mailman/listinfo/linux-audio-dev
Received on Sat Jul 25 20:15:04 2009

This archive was generated by hypermail 2.1.8 : Sat Jul 25 2009 - 20:15:04 EEST