Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   C++ (http://www.velocityreviews.com/forums/f39-c.html)
-   -   Flicker detection with DFT Problem (http://www.velocityreviews.com/forums/t459753-flicker-detection-with-dft-problem.html)

 Eren AYKIN 01-10-2007 12:04 PM

Flicker detection with DFT Problem

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?

Regards.

 Eren AYKIN 01-10-2007 12:07 PM

Re: Flicker detection with DFT Problem

Excuse me, I was going to send this to the comp.dsp mailing list. But I
would appreciate any help from here too ofcourse.
Sorry again.

Eren AYKIN 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.

 RKS 01-12-2007 02:00 AM

Re: Flicker detection with DFT Problem

> long double *in;
> fftwl_complex *out;
> fftwl_plan p;

Just a tip before posting to comp.dsp.

You may also want to give the header file where fftwl_complex and
fftwl_plan are defined. You have to provide complete code if you want
some one to help you. Its important that you dont loose the fractions
in the whole process.

RKS.

 All times are GMT. The time now is 01:54 AM.