forked from ThomasFeher/oms
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbinMaskCorrBlock.m
137 lines (130 loc) · 4.31 KB
/
binMaskCorrBlock.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
function result = binMaskCorrBlock(options,sigVec)
corrThreshold = options.sortCorrBlock.corrThreshold;
sigNumOrig = options.sigNum;
sigNum = sigNumOrig;
sigVecSort = zeros(size(sigVec));
frequNum = options.frequNum;
%blockSize should correspond to about 0.3 seconds in time domain
blockSizeInSeconds = options.sortCorrBlock.blockSize;
blockSize = floor(blockSizeInSeconds*options.fs/options.timeShift);
timeShift = floor(blockSize/2);
blockNum = floor((size(sigVec,2)-blockSize)/timeShift);
disp(blockSize);
for blockCnt=1:blockNum
sigNum = sigNumOrig;
blockIndex = (blockCnt-1)*timeShift+1;
sigVecBlock = sigVec(:,blockIndex:blockIndex+blockSize-1,:);
sigVecAbsBlock = abs(sigVecBlock);
sigVecSortBlock = zeros(size(sigVecBlock));
sigVecAbsSortBlock = zeros(size(sigVecBlock));
sigVecSortBlock(:,:,1) = sigVecBlock(:,:,1);%first frequency
sigVecAbsSortBlock(:,:,1) = sigVecAbsBlock(:,:,1);%first frequency
%find loudest signal)
energies = squeeze(sum(sigVecAbsBlock(:,:,:),2));
[maxSig maxFrequ] = find(energies==max(energies(:)));
cntArray = [2:frequNum];
cntArray = circshift(cntArray,[0 1-maxFrequ]);
%start at loudest frequency
for frequCnt=cntArray
sigAddCnt = 0;
%corrlation matrix (only off axis elements)
for sigCnt1=1:sigNum
for sigCnt2=sigCnt1+1:sigNumOrig
corrCoeff(sigCnt1,sigCnt2) = abs(corrcoeff(sigVecAbsBlock(sigCnt1,:,frequCnt),sigVecAbsBlock(sigCnt2,:,frequCnt)));
if(corrCoeff(sigCnt1,sigCnt2)>corrThreshold)
sigVecSortBlock(sigCnt1,:,frequCnt) = 0;
sigVecSortBlock(sigCnt2,:,frequCnt) = 0;
else
sigVecSortBlock(sigCnt1,:,frequCnt) =...
sigVecBlock(sigCnt1,:,frequCnt);
sigVecSortBlock(sigCnt2,:,frequCnt) =...
sigVecBlock(sigCnt2,:,frequCnt);
end
end
end
disp(corrCoeff);
%figure(1);
%for sigCnt=1:sigNum
%subplot(sigNum+sigAddCnt,2,sigCnt*2-1);
%plot(sum(sigVecAbsSortBlock(sigCnt1,:,1:frequCnt-1),3));
%end
%for sigCnt=1:sigNum+sigAddCnt
%subplot(sigNum+sigAddCnt,2,sigCnt*2);
%plot(sigVecAbsBlock(sigCnt,:,frequCnt));
%end
%for sigCnt=1:sigNum
%spectrogram = transp(abs(squeeze(sigVecAbsSortBlock(sigCnt,:,1:frequCnt))));
%spectrogram = spectrogram(end:-1:1,:);
%figure();
%imagesc(spectrogram);
%end
%keyboard
sigNum = sigNum + sigAddCnt;
end
sigNumBefore = size(sigVecSort,1);
sigNumAfter = size(sigVecSortBlock,1);
sigDiff = sigNumAfter - sigNumBefore;
if(sigDiff>0)%more signals than before
sigVecSort = addSignal(sigVecSort,sigDiff);
elseif(sigDiff<0)%less signals than before
sigVecSortBlock = addSignal(sigVecSortBlock,-sigDiff);
end
%sort signals so they fit best to signals of previous blocks
startOverlap = floor(blockIndex+blockSize/2);
endOverlap = blockSize - timeShift;
blockSortVec = sortBlocks(sigVecSort(:,...
startOverlap:blockIndex+blockSize-1,:),...
sigVecSortBlock(:,1:endOverlap,:));
%disp(blockSortVec);
%add block to whole signal
sigVecSort(:,blockIndex:blockIndex+blockSize-1,:) =...
sigVecSort(blockSortVec,blockIndex:blockIndex+blockSize-1,:) +...
sigVecSortBlock;
%for sigCnt=1:sigNum
%spectrogram = transp(abs(squeeze(sigVecSortBlock(sigCnt,:,:))));
%spectrogram = spectrogram(end:-1:1,:);
%figure();
%imagesc(spectrogram);
%end
%keyboard
%for sigCnt=1:sigNum
%spectrogram = transp(abs(squeeze(sigVecBlock(sigCnt,:,:))));
%spectrogram = spectrogram(end:-1:1,:);
%figure();
%imagesc(spectrogram);
%end
end
result.sigVec = sigVecSort;
function sigVecNew = addSignal(sigVec,addNum)
if(nargin<2)
addNum = 1;
end
sigNum = size(sigVec,1);
blockSize = size(sigVec,2);
frequNum = size(sigVec,3);
sigVecNew = zeros(sigNum+addNum,blockSize,frequNum);
sigVecNew(1:sigNum,:,:) = sigVec;
function sortVec = sortBlocks(block1,block2)
sigNum = size(block1,1);
corrCoeff = zeros(sigNum,sigNum);
for frequCnt=1:size(block1,3)
for sigCnt1=1:sigNum
for sigCnt2=1:sigNum
corrCoeff(sigCnt1,sigCnt2) = corrCoeff(sigCnt1,sigCnt2) +...
abs(corrcoeff(block1(sigCnt1,:,frequCnt),...
block2(sigCnt2,:,frequCnt)));
end
end
end
for sigCnt=1:sigNum
[best row column] = matMax(corrCoeff);
sortVec(row) = column;
corrCoeff(row,:) = -inf;
corrCoeff(:,column) = -inf;
end
function [best row column] = matMax(mat)
best = max(mat(:));
best = best(1); %just in case more than one max was found
[row column] = find(mat==best);
row = row(1);
column = column(1);