├── 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 | 
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 |
--------------------------------------------------------------------------------