Iphone Oouraft的输出有时正确,但有时完全错误。为什么?
我使用Ooura FFT计算1024个样本窗口中加速度计数据的FFT。该代码工作正常,但由于某种原因,它会产生非常奇怪的输出,即振幅为10^200量级的连续光谱 代码如下:Iphone Oouraft的输出有时正确,但有时完全错误。为什么?,iphone,algorithm,fft,Iphone,Algorithm,Fft,我使用Ooura FFT计算1024个样本窗口中加速度计数据的FFT。该代码工作正常,但由于某种原因,它会产生非常奇怪的输出,即振幅为10^200量级的连续光谱 代码如下: OouraFFT *myFFT=[[OouraFFT alloc] initForSignalsOfLength:1024 NumWindows:10]; // had to allocate it UIAcceleration *tempAccel = nil; double *input=(dou
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);
OouraFFT*myFFT=[[OouraFFT alloc]initForSignalsOfLength:1024 NumWindows:10];//我必须分配它
UIAcceleration*tempAccel=零;
double*输入=(double*)malloc(1024*sizeof(double));
double*频率=(double*)malloc(1024*sizeof(double));
如果(输入)
{
//NSLog(@“%d”,数组计数];
对于(int u=0;u嘿,你试过绘制加速计值吗?如果有任何突变,FFT将超出范围
你试过绘制FFT吗?你能发布它的图像吗?如果大部分时间看起来正常,而不是偶尔超出范围,我打赌你应该事先平滑你的加速计数据
另外,为什么要复制spectrumData两次?该阵列已设置为向您提供可绘制数据
最后,您是否重叠了提供给Oouraft的数据段?它被设计为以大约50%的重叠度馈送数据段。否则,您可能会得到奇怪的边缘效果。您需要调用输入和输出阵列。这是我代码中的一个无法修复的错误,因为苹果新的加速框架使该库过时工作。您好,谢谢您的回复。我复制了两次spectrumData,使其与输入数据的大小相同。在matlab中,我使用fftshit绘制了频谱。我附上了一些图片。这些错误不是偶然发生的,它们经常发生。无法上载图像。它说我需要一个10的新用户声誉才能上载he image.干杯!我不明白你为什么希望spectrumData与输入数据的大小相同。计算时,它的虚数部分和实数部分结合在一起,这就是为什么它只有大小的一半。只复制一次。你的输入数据重叠了吗?请访问oscopeapp.com,在你的电子邮件中给我留言,我们可以在那里交换图片。“数组”包含哪些值?您尚未声明它吗?