2010-03-17 162 views
2

我正在使用Ooura FFT計算1024個採樣窗口中的加速度計數據的FFT。代碼工作正常,但出於某種原因,它會產生非常奇怪的輸出,即連續頻譜的幅度爲10^200。OouraFFT的輸出有時會糾正,但有時會完全失敗。爲什麼?

下面是代碼:

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

「數組」包含什麼值?,您還沒有聲明它? – Warrior 2010-10-27 07:28:18

回答

0

嘿,你嘗試過密謀加速計值?如果有任何突然的變化,FFT將超出範圍。

您是否嘗試過繪製FFT?你能發佈圖片的樣子嗎?如果大多數時間看起來很正常,偶爾會超出範圍,我打賭你應該事先平滑加速計數據。

另外,你爲什麼要複製spectrumData兩次?該陣列已經設置爲向您提供繪圖數據。

最後,你是否重疊了你提供給OouraFFT的數據段?它被設計用於重疊大約50%的數據段。否則你可能會產生奇怪的邊緣效應。

+0

嗨,感謝您的回覆。 我正在複製spectrumData兩次,使其與輸入數據具有相同的大小。在matlab中,我使用fftshit繪製了譜圖。我附上了一些照片。這些錯誤偶爾不會發生,它們經常發生。 – Yan 2010-03-22 11:35:53

+0

無法上傳圖像。它表示,我需要聲譽爲10的新用戶才能上傳圖片。 乾杯 – Yan 2010-03-22 12:00:05

+0

不明白爲什麼您希望spectrumData與輸入數據的大小相同。在計算時,它的虛部和實部相結合,這就是爲什麼它的大小是原來的一半。只複製一次。 你重疊你的inputData嗎? 訪問oscopeapp.com,給我留下你的電子郵件評論,我們可以從那裏交換圖片。 – alexbw 2010-03-22 18:41:52

1

您需要calloc輸入和輸出數組。這是我的代碼中的一個bug,不會被修復,因爲這個庫已經被Apple的新Accelerate框架所淘汰。

相關問題