├── DemoFigure.jpg ├── PC5_20090606_050000_0010.wav ├── segment.m ├── LICENSE ├── compute_Dir_Spec_From_MWSG.m ├── Demo.m ├── README.md ├── compute_MWSG_Spec.m └── GroundTruth.txt /DemoFigure.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nithinraok/MWSG_IEEE_Paper/HEAD/DemoFigure.jpg -------------------------------------------------------------------------------- /PC5_20090606_050000_0010.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nithinraok/MWSG_IEEE_Paper/HEAD/PC5_20090606_050000_0010.wav -------------------------------------------------------------------------------- /segment.m: -------------------------------------------------------------------------------- 1 | function [d]=segment(Spect) 2 | %% 3 | % Generate segmented vector(PdframesC) based on the threshold on Input 4 | % Spectrogram (Spect) 5 | % Refrence Paper : Bird acoustic activity detection based on morphological filtering 6 | % of the spectrogram 7 | % Where 8 | % Spect : Spectrogram 9 | % d : Predicted frame array 10 | 11 | d=zeros(1,size(Spect,2)); 12 | W=sum(Spect); 13 | [counts,bin]=hist(W); 14 | [Countmax,b]=max(counts); 15 | if b<10 %considered 10 bins 16 | threshold=bin(b+1); 17 | else 18 | threshold=bin(b); 19 | end 20 | d(W>=threshold)=1; 21 | 22 | end -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 Nithin Rao 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /compute_Dir_Spec_From_MWSG.m: -------------------------------------------------------------------------------- 1 | function [x_D1,x_D2,x_D3,x_D4,DAll]=compute_Dir_Spec_From_MWSG(Spect,len) 2 | 3 | %% 4 | % Calculate four directional spectrogram and summed up 5 | % directional spectrogram calculated on a mentioned patch of len 6 | % Where 7 | % Spect : spectrogram 8 | % x_D1 : spectrogram which is replaced by values in the patch of 9 | % length len at angle 0 degrees 10 | % x_D2 : spectrogram which is replaced by values in the patch of 11 | % length len at angle 45 degrees 12 | % x_D3 : spectrogram which is replaced by values in the patch of 13 | % length len at angle 90 degrees 14 | % x_D4 : spectrogram which is replaced by values in the patch of 15 | % length len at angle 135 degrees 16 | 17 | M=Spect; 18 | [nrows,ncols]=size(M); 19 | l=round(len/2);m=floor(len/2); 20 | Mnew=zeros(nrows+2*m,ncols+2*m); 21 | 22 | Mnew(1:m,m+1:ncols+m)=M(1:m,:); 23 | Mnew(nrows+m+1:nrows+2*m,m+1:ncols+m)=M(nrows-m+1:nrows,:); 24 | Mnew(m+1:nrows+m,1:m)=M(:,1:m); 25 | Mnew(m+1:nrows+m,ncols+m+1:ncols+2*m)=M(:,ncols-m+1:ncols); 26 | Mnew(m+1:nrows+m,m+1:ncols+m)=M; 27 | 28 | P=Mnew; 29 | 30 | D0=P;D90=P;D135=P;D45=P; 31 | [M,N]=size(P); 32 | P2=fliplr(P); 33 | 34 | for i=round(len/2):M-floor(len/2) 35 | for j=round(len/2):N-floor(len/2) 36 | widt=floor(len/2); 37 | 38 | D0(i,j)= sum(P(i-widt:i+widt,j)); 39 | D90(i,j)=sum(P(i,j-widt:j+widt)); 40 | 41 | temp1=diag(P,j-i); 42 | k=min(i,j); 43 | 44 | D135(i,j)=sum(temp1(k-widt:k+widt)); 45 | 46 | temp2=diag(P2,(N-(j-1)-i)); 47 | 48 | k1=min(N-j+1,i); 49 | 50 | D45(i,j)=sum(temp2(k1-widt:k1+widt)); 51 | end 52 | end 53 | x_D1=D0(l:M-m,l:N-m); 54 | x_D2=D45(l:M-m,l:N-m); 55 | x_D3=D90(l:M-m,l:N-m); 56 | x_D4=D135(l:M-m,l:N-m); 57 | DAll = D0+D45+D135+D90; 58 | 59 | end -------------------------------------------------------------------------------- /Demo.m: -------------------------------------------------------------------------------- 1 | %% 2 | % This file is included to demonstrate the steps of algorithm we used to 3 | % detect Bird sounds using Multiple Window Savitzky-Golay(MWSG) Filter 4 | close all; 5 | clear all; 6 | clc; 7 | %% Step 1 MWSG Filter 8 | % Compute the MWSG spectrogram for the given audio signal 9 | disp('Reading wav File'); 10 | [signal,fs]=audioread('PC5_20090606_050000_0010.wav'); %% MLSP audio file 11 | % Parameters 12 | M=21; %Matrix length required to calculate SG coefficents 13 | P=3; %Order required to calculate SG coefficents 14 | nfft=512; %FFT Order 15 | shift=256; % Shift 16 | winlength=512;% Window Length 17 | disp('Computing MWSG Spectrogram'); 18 | MWSG=compute_MWSG_Spec(signal,fs,M,P); 19 | %% Step 2 Directionality 20 | % Calculate the directional spectrograms based on MWSG Spectrogram 21 | % Parameters 22 | len=11; % No of array values to be summed up in the required direction 23 | disp('Computing directional Spectrograms on MWSG Spectrogram'); 24 | [x_D1,x_D2,x_D3,x_D4,DAll]=compute_Dir_Spec_From_MWSG(MWSG,len); 25 | %% Step 3 Segmentation 26 | % Calculating Predicted frames for each directed spectrogam 27 | disp('Computing Predicted Frames'); 28 | d1=segment(x_D1); % Predicted frames at 0 degrees directed spectrogram 29 | d2=segment(x_D2); % Predicted frames at 0 degrees directed spectrogram 30 | d3=segment(x_D3); % Predicted frames at 0 degrees directed spectrogram 31 | d4=segment(x_D4); % Predicted frames at 0 degrees directed spectrogram 32 | % Final Predicted frames(d) = max(each directional predicted frame) 33 | d= (d1+d3+d2+d4); 34 | d(d>0)=1; 35 | 36 | %% Figures 37 | % Just to get Frequency and Time Points 38 | [~,F,T,~]=spectrogram(signal,winlength,shift,nfft,fs); 39 | % Loading ground truth frames 40 | disp('Reading GroundTruth'); 41 | load('GroundTruth.txt'); 42 | disp('Displaying Figures'); 43 | figure; 44 | subplot(3,1,1); 45 | time=(1:length(signal))/fs; 46 | plot(time,signal); % Signal 47 | title('Signal'); 48 | xlabel('Time in sec'); 49 | ylabel('Amplitute'); 50 | subplot(3,1,2); 51 | surf(T,F,10*log10(MWSG),'EdgeColor','none'); %MWSG Spectrogram 52 | view(0,90); 53 | axis tight; 54 | title('MWSG Spectrogram'); 55 | xlabel('Time in sec'); 56 | ylabel('Frequency in Hz'); 57 | subplot(3,1,3); 58 | plot(T,GroundTruth,'r'); % GroundTruth Frames 59 | hold on; 60 | plot(T,d,'b'); % Predicted Frames 61 | hold off; 62 | ylim([0 2]); 63 | xlabel('Time in sec'); 64 | legend('GroundTruth','Predicted Frames'); 65 | 66 | 67 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # MWSG_IEEE_Paper 2 | Codes for paper "Spectrogram enhancement using multiple window Savitzky Golay (MWSG) filter for robust bird sound detection" which is published in IEEE Transactions on Speech,Audio and Language Processing March 2017 3 |
IEEE Xplorer [Link](http://ieeexplore.ieee.org/document/7933047/) 4 |
MatLab Version used : R2014a. 5 | 6 | ![Image](https://raw.githubusercontent.com/nithinraok/MWSG_IEEE_Paper/master/DemoFigure.jpg) 7 | Description of each MatLab file present in the folder is described below: 8 | 9 | # compute_MWSG_Spec.m 10 | calculate Multiple Window Savitzky Golay(SG) Filter of 11 | Matrix Length M and Order P default M=21 P=3 12 | High Pass filtered at 1Khz. 13 |
DSP System ToolBox of MatLab is required 14 | to run this program 15 |
Parameters 16 |
signal : I/P audio file 17 |
fs : Sampling frequency 18 |
M : Matrix Length required for SG Coefficients 19 |
P : Order for SG Coefficients 20 |
MWSG : Multiple Window Savitzky Golay(SG) Filtered Spectrogram 21 | 22 | 23 | # compute_Dir_Spec_From_MWSG.m 24 | Calculate four directional spectrogram and summed up 25 | directional spectrogram calculated on a mentioned patch of len 26 |
Parameters 27 |
Spect : spectrogram 28 |
x_D1 : spectrogram which is replaced by values in the patch of 29 | length len at angle 0 degrees 30 |
x_D2 : spectrogram which is replaced by values in the patch of 31 | length len at angle 45 degrees 32 |
x_D3 : spectrogram which is replaced by values in the patch of 33 | length len at angle 90 degrees 34 |
x_D4 : spectrogram which is replaced by values in the patch of 35 | length len at angle 135 degrees 36 | 37 | 38 | # segment.m 39 | Generate segmented vector(PdframesC) based on the threshold on Input 40 | Spectrogram (Spect) 41 |
Refrence Paper : Bird acoustic activity detection based on morphological filtering 42 | of the spectrogram 43 |
Parameters 44 |
Spect : Spectrogram 45 |
d : Predicted frame array 46 | 47 | 48 | 49 | # Demo.m 50 | This file is included to demonstrate the steps of algorithm we used to 51 | detect Bird sounds using Multiple Window Savitzky-Golay(MWSG) Filter 52 | 53 | # GroundTruth.txt 54 | This file contains the ground truth of the audio file 'PC5_20090606_050000_0010' which is taken from 55 | MLSP dataset and is used to demonstrate our algorithm. 56 |
Ground truth is frame wise 0s and 1s 57 | 58 | -------------------------------------------------------------------------------- /compute_MWSG_Spec.m: -------------------------------------------------------------------------------- 1 | function [MWSG]=compute_MWSG_Spec(signal,fs,M,P) 2 | %% 3 | % calculate Multiple Window Savitzky Golay(SG) Filter of 4 | % Matrix Length M and Order P default M=21 P=3 5 | % High Pass filtered at 1Khz. DSP System ToolBox of MatLab is required 6 | % to run this program 7 | % Where 8 | % signal : I/P audio file 9 | % fs : Sampling frequency 10 | % M : Matrix Length required for SG Coefficients 11 | % P : Order for SG Coefficients 12 | % MWSG : Multiple Window Savitzky Golay(SG) Filtered Spectrogram 13 | %% 14 | switch nargin 15 | case 1 16 | fs=16000; %16Khz default 17 | M=21; 18 | P=3; 19 | case 2 20 | M=21; 21 | P=3; 22 | case 3 23 | P=3; 24 | end 25 | %% 26 | % Calculate Savitzky Golay Coefficients of MatrixLength M and Order P 27 | [~,~,~,~,sgCoeff]=SavGolCoeff(P,M); 28 | %% Parameters for High Pass filtering 29 | passBandFreq=(1000)/(fs/2); 30 | stopBandFreq=(900)/(fs/2); 31 | passBandAttn=1; %dB 32 | stopBandAttn=60; %dB 33 | D = fdesign.highpass('Fst,Fp,Ast,Ap',stopBandFreq,passBandFreq,stopBandAttn,passBandAttn); 34 | H=design(D,'equiripple'); 35 | signal=signal(:,1); %considering only 1 channel if its dual channel 36 | signal=filter(H,signal); 37 | %% 38 | % multiWindowSpec stores the spectrogram generated using multiWindow 39 | % method 40 | multiWindowSpec = multiWindow(signal,fs); 41 | %% 42 | % Passing the multiWindow Spectrogram to SGonImg function to calculate 43 | % Multiple Window Savitzky Golay Spectrogram followed by 2D median 44 | % filtering using 3x3 neighbourhood 45 | P1 = SGonImg(multiWindowSpec,sgCoeff); 46 | P1=P1-min(P1(:)); 47 | MWSG=medfilt2(P1,[3 3]); 48 | 49 | end 50 | 51 | function [NamesCoefs, NamesTerms, XPow, YPow, SGnew] = SavGolCoeff(nOrder,nSize) 52 | % Compute Savitzky-Golay coefficients 53 | % John Krumm, Microsoft Research, August 2001 54 | % Requires MatLabSymbolic Math Toolbox 55 | % On return: 56 | % NamesCoefs(i,:) gives the name of coefficient i, e.g. a23 57 | % NamesTerms(i,:) gives the name of the polynomial term i, e.g. (x^2)(y^3) 58 | % XPow(i) and YPow(i) give exponents on x and y for coefficient i 59 | % SG(:,:,i) gives the nSize x nSize filter for computing coefficient i 60 | 61 | % Set up polynomial terms for a given order 62 | Terms = []; 63 | NamesCoefs = []; 64 | NamesTerms = []; 65 | XPow = []; 66 | YPow = []; 67 | syms x y real; 68 | for j=0:nOrder 69 | for i=0:nOrder-j 70 | Terms = [Terms; (x^i)*(y^j)]; 71 | XPow = [XPow; i]; 72 | YPow = [YPow; j]; 73 | end 74 | end 75 | 76 | % Compute A matrix for a nSize x nSize window 77 | A = []; 78 | for y = -(nSize-1)/2:(nSize-1)/2 % important to loop through in same scan order as image patch pixels 79 | for x = -(nSize-1)/2:(nSize-1)/2 80 | %sprintf ('%f %f',x,y) 81 | A = [A; subs(Terms')]; 82 | end 83 | end 84 | 85 | % Compute coefficient matrix 86 | C = inv(A'*A)*A'; 87 | 88 | % Pull out coefficients 89 | SG = []; 90 | [nTerms, nDum] = size(Terms); 91 | for i=1:nTerms 92 | SG(:,:,i) = reshape(C(i,:),[nSize,nSize]); 93 | end 94 | % Print 95 | %for i=1:nTerms 96 | % NamesCoefs(i,:) 97 | % NamesTerms(i,:) 98 | % SG(:,:,i) 99 | %end 100 | SGnew=SG(:,:,1); 101 | end 102 | 103 | function out_spec = multiWindow(signal,fs) 104 | %% 105 | % Function to generate spectrogram using multiple window length method 106 | % FFT size =512; 107 | winlength=[32 64 128 256 512]; 108 | shift=256; 109 | nfft=512; 110 | tempcols=[]; 111 | for i=1:length(winlength) 112 | noverlap=winlength(i)-shift; 113 | if winlength(i)>=256 114 | temp{i}=abs(spectrogram(signal,winlength(i),noverlap,nfft,fs)); 115 | else 116 | t1=abs(spectrogram(signal,winlength(i),winlength(i)-32,nfft,fs)); 117 | factor=round(256/32); 118 | temp{i}=t1(:,1:factor:end); 119 | end 120 | tempcols=[tempcols;size(temp{i},2)]; 121 | end 122 | nrows=nfft/2 +1; 123 | ncols=min(tempcols); 124 | M=zeros(nrows,ncols); 125 | for i=1:length(winlength) 126 | M=M+temp{i}(:,1:ncols); 127 | end 128 | out_spec=M; 129 | end 130 | 131 | function outimg = SGonImg(InImg,SGCoeff) 132 | %% 133 | % Function to generate Savitzky Golay 2D filtered Image using 134 | % Savitzky Golay Coefficients on Input Image (here InImg) 135 | SG=SGCoeff(:,:,1); 136 | outimg=conv2(InImg,SG,'same'); 137 | end 138 | -------------------------------------------------------------------------------- /GroundTruth.txt: -------------------------------------------------------------------------------- 1 | 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 2 | --------------------------------------------------------------------------------