Reply by Eren AYKIN January 10, 20072007-01-10
Whatever input value I give, the output is always like -2,0,0...
Also I needed to write fftwl_malloc instead of fftw_malloc and
fftwl_free instead of fftw_free

erenay yazdi:
> Hello Everybody, > I'm not very experienced with DFT and FFTW library and I want to ask > your opinion about the results I get. > My aim is to determine if the sample input sequence is flickering with > some frequency. > In my project, I'm capturing frames from a video and geting the mean > pixel value of some pixels with a certain property. I get one mean > value for each frame. I want to check if these mean pixel values are > flickering with the time or staying flat in comparison (not changing > very much). For example: > if I'm capturing 25 frames per second, I can detect if the pixel mean > values are changing with a frequency close to 10Hz. if the input sample > to be used in DFT is like: 230, 212, 236, 214, 243,... > then I can say that values are changing up and down (flickering) with a > frequency near 10 Hz. If the output array has some positive values > corresponding to 8,9,10,11,12Hz's I can classify this input sequence as > flickering. > > In order to detect some frequencies in the sample input, I have used > the following code: > //n is the number of input samples > // averageRed is the array that holds the mean pixel values of each > frame > > long double *in; > fftwl_complex *out; > fftwl_plan p; > in = (long double*) fftw_malloc(sizeof(long double) * n); > for (int i=0; i<n; i++){ > in[i] = (long double)averageRed[i]; > } > > out = (fftwl_complex*) fftw_malloc(sizeof(fftwl_complex) * > averageIndex); > p = fftwl_plan_dft_r2c_1d(n, in, out, FFTW_ESTIMATE); > fftwl_execute(p); > fftwl_destroy_plan(p); > fftw_free(in); > for (int i=0; i<averageIndex; i++){ > fprintf(output, "output %d -> %f, %f\n", i, out[i][0], out[i][1]); > } > > fftw_free(out); > > The resuls of this calculation are as follows: > First 15 input to the transform: 223.000000,195.000000, 238.000000, > 217.625000, 232.600000, 218.857143, 215.333333, 233.000000, 225.800000, > 223.600000, 226.2857, 182.500000, 222.200000, 213.750000, 213.400000, > ... > First 10 Outputs of the transform: > output 0 -> -2.000000, 0.000000 > output 1 -> 0.000000, -2.000000 > output 2 -> 0.000000, -0.000000 > output 3 -> -2.000000, 0.000000 > output 4 -> -0.000000, -2.000000 > output 5 -> 0.000000, -0.000000 > output 6 -> -2.000000, 0.000000 > output 7 -> -0.000000, -2.000000 > output 8 -> 0.000000, -0.000000 > output 9 -> -2.000000, 0.000000 > output 10 -> -0.000000, -2.000000 > > My questions are: > 1-) It goes like: -2,0,0 until 264th output and later values are all 0 > but the input array had 353 samples. Shouldn't it go until 176th frame > instead of the 264th? > *2-) The output values doesn't seem right to me. I think real parts > should not be negative and they should'nt repeat the same pattern! > 3-) I should normalize the output by multiplying each output value by > 25/353 (sample rate/N) right? > > Hope that I can get some help about this. > Regards.
Reply by erenay January 10, 20072007-01-10
Hello Everybody,
I'm not very experienced with DFT and FFTW library and I want to ask
your opinion about the results I get.
My aim is to determine if the sample input sequence is flickering with
some frequency.
In my project, I'm capturing frames from a video and geting the mean
pixel value of some pixels with a certain property. I get one mean
value for each frame. I want to check if these mean pixel values are
flickering with the time or staying flat in comparison (not changing
very much). For example:
if I'm capturing 25 frames per second, I can detect if the pixel mean
values are changing with a frequency close to 10Hz. if the input sample
to be used in DFT is like: 230, 212, 236, 214, 243,...
then I can say that values are changing up and down (flickering) with a
frequency near 10 Hz. If the output array has some positive values
corresponding to 8,9,10,11,12Hz's I can classify this input sequence as
flickering.

In order to detect some frequencies in the sample input, I have used
the following code:
//n is the number of input samples
// averageRed is the array that holds the mean pixel values of each
frame

long double *in;
fftwl_complex *out;
fftwl_plan p;
in = (long double*) fftw_malloc(sizeof(long double) * n);
for (int i=0; i<n; i++){
  in[i] = (long double)averageRed[i];
}

out = (fftwl_complex*) fftw_malloc(sizeof(fftwl_complex) *
averageIndex);
p = fftwl_plan_dft_r2c_1d(n, in, out, FFTW_ESTIMATE);
fftwl_execute(p);
fftwl_destroy_plan(p);
fftw_free(in);
for (int i=0; i<averageIndex; i++){
  fprintf(output, "output %d -> %f,  %f\n", i, out[i][0], out[i][1]);
}

fftw_free(out);

The resuls of this calculation are as follows:
First 15 input to the transform: 223.000000,195.000000, 238.000000,
217.625000, 232.600000, 218.857143, 215.333333, 233.000000, 225.800000,
223.600000, 226.2857, 182.500000,  222.200000, 213.750000, 213.400000,
...
First 10 Outputs of the transform:
output 0 -> -2.000000,  0.000000
output 1 -> 0.000000,  -2.000000
output 2 -> 0.000000,  -0.000000
output 3 -> -2.000000,  0.000000
output 4 -> -0.000000,  -2.000000
output 5 -> 0.000000,  -0.000000
output 6 -> -2.000000,  0.000000
output 7 -> -0.000000,  -2.000000
output 8 -> 0.000000,  -0.000000
output 9 -> -2.000000,  0.000000
output 10 -> -0.000000,  -2.000000

My questions are:
1-) It goes like: -2,0,0 until 264th output and later values are all 0
but the input array had 353 samples. Shouldn't it go until 176th frame
instead of the 264th?
*2-) The output values doesn't seem right to me. I think real parts
should not be negative and they should'nt repeat the same pattern!
3-) I should normalize the output by multiplying each output value by
25/353 (sample rate/N) right?

Hope that I can get some help about this.
Regards.