Вывод из OouraFFT корректен иногда, но полностью ложен в других случаях. Зачем? - PullRequest
2 голосов
/ 17 марта 2010

Я использую БПФ Ooura для вычисления БПФ данных акселерометра в окнах из 1024 выборок. Код работает нормально, но затем он почему-то выдает очень странные выходные данные, то есть непрерывный спектр с амплитудами порядка 10 ^ 200.

Вот код:

 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);

Ответы [ 2 ]

1 голос
/ 03 мая 2010

Вам необходимо вычислить входные и выходные массивы. Это ошибка в моем коде, которая НЕ будет исправлена, поскольку эта библиотека устарела в новой платформе Apple Accelerate.

0 голосов
/ 21 марта 2010

Привет, вы пробовали построить значения акселерометра? Если есть какие-либо резкие изменения, БПФ выйдет за пределы диапазона.

Вы пытались построить FFT? Можете ли вы опубликовать изображения того, как это выглядит? Если в большинстве случаев он выглядит нормально, а иногда выходит за пределы диапазона, держу пари, вам следует заранее сгладить данные акселерометра.

Кроме того, почему вы копируете спектрДанных дважды? Этот массив уже настроен для предоставления вам графических данных.

Наконец, перекрываете ли вы сегменты данных, которые вы предоставляете OouraFFT? Он предназначен для подачи сегментов данных с перекрытием около 50%. В противном случае вы можете получить странные краевые эффекты.

...