Output from OouraFFT correct sometimes but completely false other times. Why ?
- by Yan
Hi
I am using Ooura FFT to compute the FFT of the accelerometer data in windows of 1024 samples. The code works fine, but then for some reason it produces very strange outputs, i.e. continuous spectrum with amplitudes of the order of 10^200.
Here is the code:
OouraFFT *myFFT=[[OouraFFT alloc] initForSignalsOfLength:1024 NumWindows:10]; // had to allocate it
UIAcceleration *tempAccel = nil;
double *input=(double *)malloc(1024 * sizeof(double));
double *frequency=(double *)malloc(1024*sizeof(double));
if (input)
{
//NSLog(@"%d",[array count]);
for (int u=0; u<[array count]; u++)
{
tempAccel = (UIAcceleration *)[array objectAtIndex:u];
input[u]=tempAccel.z;
//NSLog(@"%g",input[u]);
}
}
myFFT.inputData=input; // specifies input data to myFFT
[myFFT calculateWelchPeriodogramWithNewSignalSegment]; // calculates FFT
for (int i=0;i<myFFT.dataLength;i++) // loop to copy output of myFFT, length of spectrumData is half of input data, so copy twice
{
if (i<myFFT.numFrequencies)
{
frequency[i]=myFFT.spectrumData[i]; //
}
else
{
frequency[i]=myFFT.spectrumData[myFFT.dataLength-i]; // copy twice
}
}
for (int i=0;i<[array count];i++)
{
TransformedAcceleration *NewAcceleration=[[TransformedAcceleration alloc]init];
tempAccel=(UIAcceleration*)[array objectAtIndex:i];
NewAcceleration.timestamp=tempAccel.timestamp;
NewAcceleration.x=tempAccel.x;
NewAcceleration.y=tempAccel.z;
NewAcceleration.z=frequency[i];
[newcurrentarray addObject:NewAcceleration]; // this does not work
//[self replaceAcceleration:NewAcceleration];
//[NewAcceleration release];
[NewAcceleration release];
}
TransformedAcceleration *a=nil;//[[TransformedAcceleration alloc]init]; // object containing fft of x,y,z accelerations
for(int i=0; i<[newcurrentarray count]; i++)
{
a=(TransformedAcceleration *)[newcurrentarray objectAtIndex:i];
//NSLog(@"%d,%@",i,[a printAcceleration]);
fprintf(fp,[[a printAcceleration] UTF8String]); //this is going wrong somewhow
}
fclose(fp);
[array release];
[myFFT release];
//[array removeAllObjects];
[newcurrentarray release];
free(input);
free(frequency);