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.

# Flicker detection with DFT Problem

Started by ●January 10, 2007

Reply by ●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.