36 #ifndef __INCLUDE_HHT_H__
37 #define __INCLUDE_HHT_H___
39 #ifndef __INCLUDE_MIST_H__
44 #ifndef __INCLUDE_FFT_H__
61 bool emd_envelope(
const array< T > &x,
const array< T > &y,
size_t xsize, array< T > &yout)
65 if( x.size( ) < xsize || y.size( ) < xsize )
70 array< T > u( xsize );
71 array< T > y2( xsize );
73 y2[ 0 ] = u[ 0 ] = 0.0;
76 for(
size_t i = 1 ; i < xsize - 1 ; i++ )
78 sig = ( x[ i ] - x[ i - 1 ] ) / ( x[ i + 1 ] - x[ i - 1 ] );
79 p = sig * y2[ i - 1 ] + 2.0;
80 y2[ i ] = ( sig - 1.0 ) / p;
81 u[ i ] = ( y[ i + 1 ] - y[ i ] ) / ( x[ i + 1 ] - x[ i ] ) - ( y[ i ] - y[ i - 1 ] ) / ( x[ i ] - x[ i - 1 ] );
82 u[ i ] = ( 6.0 * u[ i ] / ( x[ i + 1 ] - x[ i - 1 ] ) - sig * u[ i - 1 ] ) / p;
87 y2[ xsize - 1 ] = ( un - qn * u[ xsize - 2 ] ) / ( qn * y2[ xsize - 2 ] + 1.0 );
89 for(
size_t i = xsize - 1 ; i > 0 ; i-- )
91 y2[ i - 1 ] = y2[ i - 1 ] * y2[ i ] + u[ i - 1 ];
97 for(
size_t i = 0 ; i < yout.size( ) ; i++ )
99 if( x[ k + 1 ] < static_cast< T >( i ) )
103 h = x[ k + 1 ] - x[ k ];
104 a = ( x[ k + 1 ] -
static_cast< T
>( i ) ) / h;
105 b = (
static_cast< T
>( i ) - x[ k ] ) / h;
106 yout[ i ] = a * y[ k ] + b * y[ k + 1 ] + ( ( a * a * a - a ) * y2[ k ] + ( b * b * b - b ) * y2[ k + 1 ] ) * ( h * h ) / 6.0;
129 double f_index = std::log( static_cast< double >( in.
size( ) ) ) / std::log( 2.0 );
136 for(
size_t i = 0 ; i < in.
size( ) ; i ++ )
141 for(
size_t i = in.
size( ) ; i < as.
size( ) ; i ++ )
152 while( j > 0 && ( in[ in.
size( ) - 1 ] - in[ j ] ) * ( in[ in.
size( ) - 1 ] - in[ j + 1 ] ) > 0 )
156 if( j < in.
size( ) / 4 )
161 for(
size_t i = in.
size( ) ; i < ( in.
size( ) + as.
size( ) ) / 2 ; i ++ )
165 as[ i ] = std::complex< T >( in[ j -- ], as[ i ].imag( ) );
170 while( j < in.
size( ) - 1 && ( in[ 0 ] - in[ j ] ) * ( in [ 0 ] - in[ j - 1 ] ) > 0 )
174 if( j > in.
size( ) * 3 / 4 )
179 for(
size_t i = as.
size( ) - 1 ; i >= ( in.
size( ) + as.
size( ) ) / 2 ; i -- )
183 as[ i ] = std::complex< T >( in[ j ++ ], as[ i ].imag( ) );
191 for(
size_t i = 1 ; i < as.
size( ) / 2 ; i ++ )
197 for(
size_t i = as.
size( ) / 2 ; i < as.
size( ) ; i ++ )
204 out.resize( in.
size( ) );
206 for(
size_t i = 0 ; i < in.
size( ) ; i++ )
208 out[ i ] = std::complex< T >( in[ i ], as[ i ].imag( ) );
233 template <
class T1,
class T2 >
236 std::vector< T2 > imf_v;
240 std::copy( in.
begin( ), in.
end( ), r.begin( ) );
241 size_t minmax_old = in.
size( );
251 size_t max_i = 0, min_i = 0;
257 max_x[ 0 ] = min_x[ 0 ] = 0.0;
258 max_x[ 1 ] = min_x[ 1 ] =
static_cast< T1
>( in.
size( ) - 1 );
261 for(
size_t i = 1 ; i < in.
size( ) - 1 ; i ++ )
263 if( h[ i ] > h[ i - 1 ] && h[ i ] > h[ i + 1 ] )
266 max_x[ max_i ] =
static_cast< T1
>( i );
267 max_y[ max_i ] = h[ i ];
270 if( h[ i ] < h[ i - 1 ] && h[ i ] < h[ i + 1 ] )
273 min_x[ min_i ] =
static_cast< T1
>( i );
274 min_y[ min_i ] = h[ i ];
285 if( max_x[ 1 ] < min_x[ 1 ] )
287 if( min_i > 0 && min_y[ 1 ] < h[ 0 ] )
289 min_x[ 0 ] = max_x[ 1 ] * 2.0 - min_x[ 1 ];
290 min_y[ 0 ] = min_y[ 1 ];
297 max_x[ 0 ] = min_x[ 0 ] * 2.0 - max_x[ 1 ];
298 max_y[ 0 ] = max_y[ 1 ];
302 if( max_i > 0 && max_y[ 1 ] > h[ 0 ] )
304 max_x[ 0 ] = min_x[ 1 ] * 2.0 - max_x[ 1 ];
305 max_y[ 0 ] = max_y[ 1 ];
312 min_x[ 0 ] = max_x[ 0 ] * 2.0 - min_x[ 1 ];
313 min_y[ 0 ] = min_y[ 1 ];
325 if( max_x[ max_i ] > min_x[ min_i ] )
327 if( min_i > 0 && min_y[ min_i ] < h[ in.
size( ) - 1 ] )
329 min_x[ min_i + 1 ] = max_x[ max_i ] * 2.0 - min_x[ min_i ];
330 min_y[ min_i + 1 ] = min_y[ min_i ];
334 min_x[ min_i + 1 ] =
static_cast< T1
>( in.
size( ) - 1 );
335 min_y[ min_i + 1 ] = h[ in.
size( ) - 1 ];
337 max_x[ max_i + 1 ] = min_x[ min_i + 1 ] * 2.0 - max_x[ max_i ];
338 max_y[ max_i + 1 ] = max_y[ max_i ];
342 if( max_i > 0 && max_y[ max_i ] > h[ in.
size( ) - 1 ] )
344 max_x[ max_i + 1 ] = min_x[ min_i ] * 2.0 - max_x[ max_i ];
345 max_y[ max_i + 1 ] = max_y[ max_i ];
349 max_x[ max_i + 1 ] =
static_cast< T1
>( in.
size( ) - 1 );
350 max_y[ max_i + 1 ] = h[ in.
size( ) - 1 ];
352 min_x[ min_i + 1 ] = max_x[ max_i + 1 ] * 2.0 - min_x[ min_i ];
353 min_y[ min_i + 1 ] = min_y[ min_i ];
355 if( max_x[ max_i + 1 ] < static_cast< T1 >( in.
size( ) - 1 ) )
357 max_x[ max_i + 1 ] =
static_cast< T1
>( in.
size( ) - 1 );
359 if( min_x[ min_i + 1 ] < static_cast< T1 >( in.
size( ) - 1 ) )
361 min_x[ min_i + 1 ] =
static_cast< T1
>( in.
size( ) - 1 );
367 emd_envelope( max_x, max_y, max_i + 2, max_e );
368 emd_envelope( min_x, min_y, min_i + 2, min_e );
373 for(
size_t i = 0 ; i < in.
size( ) ; i ++ )
375 mean_e[ i ] = ( max_e[ i ] + min_e[ i ] ) / 2.0;
376 h_new[ i ] = h[ i ] - mean_e[ i ];
377 sd1 += ( h[ i ] - h_new[ i ] ) * ( h[ i ] - h_new[ i ] ) / ( h[ i ] * h[ i ] + 0.00001 );
381 if( static_cast< double >( sd1 ) < sd )
389 if( minmax < 1 || minmax > minmax_old )
395 for(
size_t i = 0 ; i < in.
size( ) ; i ++ )
399 imf_v.push_back( h );
403 imf.
resize( imf_v.size( ) + 1 );
404 for(
size_t i = 0 ; i < imf_v.size( ) ; i ++ )
406 imf[ i ] = imf_v[ i ];
408 imf( imf_v.size( ) ) = r;
410 return ( imf_v.size( ) );
420 #endif // __INCLUDE_HHT_H__