2010-03-17 45 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框架所淘汰。

相关问题