我正在创建一个音叉应用程序,您可以将iPhone拍到另一只手的手掌上,或者在柔软的表面上拍摄,以便设置叉子.
所以我想检测每个’凹凸’中包含的能量
(编辑:删除了一吨gumpf)
任何人都可以帮我破解这个吗?
解决方法
感谢freenode #math频道上的一位向导(感谢Igor),我有一个非常好的工作解决方案.
您可以使用标准方法以尽可能最大的频率(100Hz)触发回调,该频率将包含瞬时加速度x,y,z值.
typedef struct { double x,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 }; { 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; } }