1 function [ u f psdu ] = S p e c t r a l A n a l y s i s ( u , SampleFrequency , B l o c k S i z e ) 2
3 %Determine t h e number o f d a t a p o i n t s i n u
4 N = length( u ) ;
5
6 %+++++IF THERE ARE ZERO VALUES IN THE DATA, USE INTERPOLATION TO SET A REAL VALUE+++++
7 %C r e a t e a v e c t o r w i t h t h e i n d i c e s o f a l l t h e non z e r o e l e m e n t s i n u 8 NonZeroElements = f i n d( u ) ;
9 %I g n o r e d a t a a t t h e b e g i n n i n g and t h e end w h i c h h a v e z e r o v a l u e 10 u = u ( NonZeroElements ( 1 ) : NonZeroElements (end) ) ;
11 %R e c r e a t e a v e c t o r w i t h t h e i n d i c e s o f a l l t h e non z e r o e l e m e n t s i n u 12 NonZeroElements = f i n d( u ) ; 13 %Loop t h r o u g h t h e e l e m e n t s o f u t o f i n d t h e z e r o v a l u e s 14 f o r i = 1 :length( NonZeroElements )−1 15 i f( NonZeroElements ( i +1)−NonZeroElements ( i )>1) %I f t h e d i f f e r e n c e b e t w e e n two c o n s e c u t i v e e l e m e n t s i s g r e a t e r t h a n 1 , t h e r e must b e a z e r o v a l u e b e t w e e n them
16 NumberOfZeroValues = NonZeroElements ( i +1)−NonZeroElements ( i )−1;
%C a l c u l a t e t h e number o f z e r o v a l u e s b e t w e e n them 17 u ( NonZeroElements ( i ) : NonZeroElements ( i +1) ) = l i n s p a c e( u ( NonZeroElements ( i ) ) , u ( NonZeroElements ( i +1) ) , NumberOfZeroValues +2) ; %R e p l a c e t h e z e r o v a l u e w i t h a l i n e a r i n t e r p o l a t e d v a l u e 18 end 19 end 20
21 %+++++SPLIT THE DATA IN BLOCKS OF SIZE EQUAL TO THE SET BLOCKSIZE+++++ 22 %C a l c u l a t e t h e number o f b l o c k s 23 NumberOfBlocks = f l o o r(N/ B l o c k S i z e ) 24 %D e c l a r e a m a t r i x t o s t o r e t h e b l o c k s i n t h e columns 25 uu = zeros( B l o c k S i z e , NumberOfBlocks ) ; 26 f o r i = 1 : NumberOfBlocks 27 uu ( : , i ) = u ( ( 1 + ( i−1)*B l o c k S i z e ) : i*B l o c k S i z e ) ; %Each column o f t h e m a t r i x u c o n t a i n s a b l o c k o f d a t a w i t h s i z e B l o c k S i z e 28 end 29 u = u ( 1 : NumberOfBlocks*B l o c k S i z e ) ; 30
31 %+++++FOURIER TRANSFORM THE BLOCKS, CALCULATE PSD, CHECK IF THE VARIANCE OF THE TIME HIST . MATCHES THE AREA UNDER PSD CURVE AND THEN AVERAGE +++++
32 %S e t N e q u a l t o t h e B l o c k S i z e f o r t h e F o u r i e r t r a n s f o r m a t i o n and p r o c e s s i n g o f t h e t r a n s f o r m e d d a t a
33 N = B l o c k S i z e ;
34 %D e c l a r e a m a t r i x t o s t o r e t h e F o u r i e r t r a n s f o r m e d d a t a 35 psduu = zeros(N/2+1 , NumberOfBlocks ) ;
36 %Loop t h r o u g h a l l t h e columns o f uu and d e t e r m i n e t h e F o u r i e r t r a n s f o r m f o r e a c h b l o c k
37 f o r i = 1 : NumberOfBlocks
38 U = uu ( : , i ) ; %S e t u e q u a l t o t h e i t h column o f uu 39 u V a r i a n c e = v a r (U) ; %Determine t h e v a r i a n c e o f t h e
40 f f t u = f f t(U) ; %F o u r i e r t r a n s f o r m t h e d a t a o f u
41 f f t u = f f t u ( 1 :N/2+1) ; %Throw away s e c o n d h a l f o f t h e d a t a b e c a u s e o f symmetry
42 psdu = 1 / ( SampleFrequency*N)*abs( f f t u ) . ˆ 2 ; %C a l c u l a t e t h e power s p e c t r a l d e n s i t y
43 psdu ( 2 :end−1) = 2*psdu ( 2 :end−1) ; %M u l t i p l y t h e d a t a w i t h a f a c t o r 2 e x c e p t f o r t h e z e r o f r e q u e n c y and t h e N y q u i s t f r e q u e n c y
44 psduu ( : , i ) = psdu ; %S e t t h e i t h column o f psduu e q u a l t o t h e PSD d a t a o f t h e i t h column o f uu
45
46 %Determine t h e a r e a under t h e p s d c u r v e
47 psduArea = 0 ;
48 f o r j = 2 :length( psdu )−1
49 psduArea = psduArea+psdu ( j )*( SampleFrequency /N) ;
50 end
51 %I f t h e a r e a under t h e p s d c u r v e i s n o t w i t h i n 1% e q u a l t o t h e v a r i a n c e o f t h e t i m e h i s t o r y r e c o r d d i s p l a y e r r o r
52 i f( psduArea / u V a r i a n c e>1.001 | | psduArea / u V a r i a n c e<0 . 9 9 9 )
53 d i s p l a y ( ’ERROR IN SPECTRAL ANALYSIS , AREA UNDER PSD CURVE DOES
NOT MATCH VARIANCE OF TIME HISTORY DATA ’ )
54 end
55
56 end
57 %Average t h e F o u r i e r t r a n s f o r m e d d a t a 58 psdu = mean( psduu , 2 ) ;
59
60 %+++++CREATE A FREQUENCY VECTOR AND IGNORE THE ZERO FREQUENCY+++++ 61 %Due t o a l i a s i n g we can o n l y u s e t h e d a t a up t o t h e N y q u i s t f r e q u e n c y 62 f = ( 0 : SampleFrequency /N: SampleFrequency / 2 ) ’ ;
63 %D e l e t e t h e z e r o f r e q u e n c y o u t o f t h e p s d and f r e q u e n c y v e c t o r 64 f = f ( 2 :end) ; psdu = psdu ( 2 :end) ;
65 66 end