To check out this repository please hg clone the following URL, or open the URL using EasyMercurial or your preferred Mercurial client.
root / _dbn / inference.m
History | View | Annotate | Download (3.56 KB)
| 1 |
function song = inference(song, bnet, param) |
|---|---|
| 2 |
|
| 3 |
|
| 4 |
if param.dsp.separatenormalising % means that also bass and treble chroma are separate |
| 5 |
evidence = cell(bnet.nnodes_per_slice,song.nBeat); |
| 6 |
if param.dbn.nBass > 0 |
| 7 |
basschromanode = bnet.names('basschroma');
|
| 8 |
evidence(basschromanode,:) = ... |
| 9 |
num2cell(song.segchroma.bass(:,1:param.dbn.nBass)',1); |
| 10 |
end |
| 11 |
|
| 12 |
treblechromanode = bnet.names('treblechroma');
|
| 13 |
evidence(treblechromanode,:) = ... |
| 14 |
num2cell(song.segchroma.treble',1); |
| 15 |
|
| 16 |
if param.dbn.inferencebypart |
| 17 |
fprintf(2,' '); |
| 18 |
song = integratesmallparts(song); |
| 19 |
song.mpe = cell(size(evidence)); |
| 20 |
nIntegratedParts = numel(song.integratedparts); |
| 21 |
if param.dbn.infermpe |
| 22 |
for iIP = 1:nIntegratedParts |
| 23 |
startind = song.integratedparts(iIP).indices; % only one index for integrated parts |
| 24 |
endind = song.integratedparts(iIP).indices + song.integratedparts(iIP).n - 1; |
| 25 |
leftoverlap = min(startind - 1, param.seg.inferenceoverlap); |
| 26 |
rightoverlap = min(song.nBeat - endind, param.seg.inferenceoverlap); |
| 27 |
currevidence = evidence(:,startind - leftoverlap:endind + rightoverlap); |
| 28 |
engine = smoother_engine(jtree_2TBN_inf_engine(bnet)); |
| 29 |
fprintf(1,'\nFinding maximum probability path (part %1.0f of %1.0f, beats %1.0f to %1.0f)... \n', iIP, nIntegratedParts, startind, endind) |
| 30 |
fprintf(2,'\b\b\b\b%3.0f%%',iIP/nIntegratedParts*100); |
| 31 |
currmpe = find_mpeMM(engine, currevidence); |
| 32 |
song.mpe(:,startind:endind) = currmpe(:,leftoverlap + 1:size(currmpe,2)-rightoverlap); |
| 33 |
end |
| 34 |
else |
| 35 |
error('inference by part + mpe not yet supported');
|
| 36 |
end |
| 37 |
else |
| 38 |
|
| 39 |
if param.dbn.infermpe |
| 40 |
engine = smoother_engine(jtree_2TBN_inf_engine(bnet)); |
| 41 |
fprintf(1,'\n__ Finding maximum probability path... _________\n') |
| 42 |
song.mpe = find_mpeMM(engine, evidence); |
| 43 |
else |
| 44 |
engine = filter_engine(jtree_2TBN_inf_engine(bnet)); |
| 45 |
fprintf(1,'\n__ Inference... _________\n') |
| 46 |
tic |
| 47 |
for t = 1:song.nBeat |
| 48 |
t |
| 49 |
param.engine = enter_evidence(engine,[evidence{:,t}],t);
|
| 50 |
end |
| 51 |
toc |
| 52 |
song.inferred = cell(bnet.nnodes_per_slice, song.nBeat); |
| 53 |
for iBeat = 1:song.nBeat |
| 54 |
for iNode = 1:bnet.nnodes_per_slice-2 |
| 55 |
temp = marginal_nodes(engine,iNode,iBeat); |
| 56 |
song.inferred{iNode, iBeat} = temp.T;
|
| 57 |
end |
| 58 |
end |
| 59 |
end |
| 60 |
end |
| 61 |
else |
| 62 |
chromanode = bnet.names('chroma');
|
| 63 |
|
| 64 |
evidence = cell(bnet.nnodes_per_slice,song.nBeat); |
| 65 |
|
| 66 |
evidence(chromanode,:) = ... |
| 67 |
num2cell([song.segchroma.bass, song.segchroma.treble]',1); |
| 68 |
|
| 69 |
if param.dbn.inferencebypart |
| 70 |
else |
| 71 |
engine = smoother_engine(jtree_2TBN_inf_engine(bnet)); |
| 72 |
if param.dbn.infermpe |
| 73 |
fprintf(1,'\n__ Finding maximum probability path... _________\n') |
| 74 |
song.mpe = find_mpe(engine, evidence); |
| 75 |
else |
| 76 |
fprintf(1,'\n__ Inference... _________\n') |
| 77 |
tic |
| 78 |
param.engine = enter_evidence(engine,evidence); |
| 79 |
toc |
| 80 |
song.inferred = cell(bnet.nnodes_per_slice, song.nBeat); |
| 81 |
for iBeat = 1:beat.n |
| 82 |
for iNode = 1:bnet.nnodes_per_slice-1 |
| 83 |
temp = marginal_nodes(engine,iNode,iBeat); |
| 84 |
song.inferred{iNode, iBeat} = temp.T;
|
| 85 |
end |
| 86 |
end |
| 87 |
end |
| 88 |
end |
| 89 |
end |