2

私は Ooura FFT を使用して、1024 サンプルのウィンドウで加速度計データの FFT を計算しています。コードは正常に動作しますが、何らかの理由で非常に奇妙な出力、つまり 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);
4

2 に答える 2

1

入力配列と出力配列を calloc する必要があります。このライブラリは Apple の新しい Accelerate フレームワークによって廃止されているため、これは修正されないコードのバグです。

于 2010-05-03T16:32:33.043 に答える
0

こんにちは、加速度計の値をプロットしてみましたか? 急激な変化がある場合、FFT は範囲外になります。

FFTをプロットしてみましたか?それがどのように見えるかの画像を投稿できますか?ほとんどの場合正常に見え、たまに範囲外になる場合は、事前に加速度計のデータを平滑化する必要があります。

また、なぜ SpectrumData を 2 回コピーしているのですか? その配列は、プロット可能なデータを提供するように既に設定されています。

最後に、OouraFFT に提供するデータのセグメントが重複していませんか? 約 50% のオーバーラップでデータのセグメントが供給されるように設計されています。そうしないと、奇妙なエッジ効果が発生する可能性があります。

于 2010-03-21T19:52:43.877 に答える