我正在创建一个音叉应用程序,在该应用程序中,您可以将iPhone拍到另一只手的掌中或在柔软的表面上轻拍,以设置音叉的音调。
所以我想检测每个“凹凸”中包含的能量
(编辑:删除了一吨gumpf)
有人可以帮我破解这个吗?
最佳答案
感谢freenode的#math频道上的向导之一(感谢Igor),我有一个非常好的工作解决方案。
您使用标准方法以可能的最大频率(100Hz)触发回调,该频率将包含瞬时加速度x,y,z值。
我会让代码自己说出来,好的代码应该总是自己说出来。
typedef
struct {
double x,y,z;
}
vec_d3;
#define RECENT_COUNT 10
#define SMOOTH_IP( x, x_new, fac ) x = fac * x + ( 1. - fac ) * x_new
- (void) accelerometer: (UIAccelerometer *) accelerometer
didAccelerate: (UIAcceleration *) acceleration
{
// smooth incoming acceleration values
static vec_d3 smooth = { DOUBLE_EMPTY, 0, 0 };
{
if ( smooth.x == DOUBLE_EMPTY )
{
smooth.x = acceleration.x;
smooth.y = acceleration.y;
smooth.z = acceleration.z;
return;
}
SMOOTH_IP( smooth.x, acceleration.x, 0.9 );
SMOOTH_IP( smooth.y, acceleration.y, 0.9 );
SMOOTH_IP( smooth.z, acceleration.z, 0.9 );
}
// keep track of last k smoothed acceleration values
static vec_d3 recent[ RECENT_COUNT ];
{
static int ptr = 0;
static BOOL gotEnoughData = NO;
recent[ ptr ] = smooth;
ptr++;
if ( ptr == RECENT_COUNT )
{
ptr = 0;
gotEnoughData = YES;
}
// return if array not filled yet
if ( ! gotEnoughData )
return;
}
// get the resultant variation in acceleration over the whole array
double variation;
{
vec_d3 min = smooth, max = smooth;
for ( int i=0; i < RECENT_COUNT; i++ )
{
min.x = MIN( min.x, recent[ i ].x );
min.y = MIN( min.y, recent[ i ].y );
min.z = MIN( min.z, recent[ i ].z );
max.x = MAX( max.x, recent[ i ].x );
max.y = MAX( max.y, recent[ i ].y );
max.z = MAX( max.z, recent[ i ].z );
}
vec_d3 V = (vec_d3)
{
.x = max.x - min.x,
.y = max.y - min.y,
.z = max.z - min.z
};
variation = sqrt(
V.x * V.x +
V.y * V.y +
V.z * V.z
);
}
// smooth it
static double var_smoothed = DOUBLE_EMPTY;
{
if ( var_smoothed == DOUBLE_EMPTY )
{
var_smoothed = variation;
return;
}
SMOOTH_IP( var_smoothed, variation, 0.9 );
}
// see if it's just passed a peak
{
static double varSmoothed_last = DOUBLE_EMPTY;
if ( varSmoothed_last == DOUBLE_EMPTY )
{
varSmoothed_last = var_smoothed;
return;
}
static double varSmoothed_preLast = DOUBLE_EMPTY;
if ( varSmoothed_preLast == DOUBLE_EMPTY )
{
varSmoothed_preLast = varSmoothed_last;
varSmoothed_last = var_smoothed;
return;
}
#define THRESHOLD_IMPULSE .15
if ( varSmoothed_last > varSmoothed_preLast
&& varSmoothed_last > var_smoothed
&& varSmoothed_last > THRESHOLD_IMPULSE )
{
LOG ( @"PotPeak @ %f", varSmoothed_last );
// hit a peak at imp_last
[self peakedWithImpulse: varSmoothed_last ];
}
varSmoothed_preLast = varSmoothed_last;
varSmoothed_last = var_smoothed;
}
}
关于ios - iOS:根据加速度计输出准确确定碰撞能量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6536922/