FrameCompare calculates spectral MSE distance of two fft chains
FrameCompare.kr(buffer1, buffer2, wAmount)
Given two FFT chains, this UGen calculates the MSE between the magnitudes of these two inputs and provides a continuous analytic similarity rating (lower the value, more similar the inputs). In it's current state, only hanning window should be used (wintype: 1).
buffer1 - FFT chain1
buffer2 - FFT chain2
wAmount - Influence of the weight matrix (should be between 0 and 1). Weight matrix helps to minimize errors on regions with more energy. Default: 0.5
s.boot;
(
SynthDef(\f_compare,
{
arg nFreq1 = 220, nQ1 = 0.01, mul = 1, nFreq2 = 2000, nQ2 = 0.01, t_finTrig;
var in1 = BPF.ar(WhiteNoise.ar(mul), nFreq1, nQ1);
var in2 = BPF.ar(WhiteNoise.ar(mul), nFreq2, nQ2);
var chain1 = FFT(LocalBuf(2048), in1, wintype: 1);
var chain2 = FFT(LocalBuf(2048), in2, wintype: 1);
var fc = FrameCompare.kr(chain1, chain2, 0.5);
SendReply.kr(t_finTrig, 'fc_result', [fc]);
FreeSelf.kr(t_finTrig);
Out.ar(0, [in1, in2]);
}).memStore;
r =
OSCresponderNode(nil, 'fc_result',
{|t, r, msg, other|
"FrameCompare result: %".format(msg[3]).postln;
});
)
r.add;
a = Synth(\f_compare);
//wait for a few seconds
a.set(\t_finTrig, 1);
a = Synth(\f_compare, [\nFreq2, 4000, \nQ2, 0.01]);
//wait for a few seconds
a.set(\t_finTrig, 1);
a = Synth(\f_compare, [\nFreq2, 220, \nQ2, 0.5]);
//wait for a few seconds
a.set(\t_finTrig, 1);
//same args for noise filters
a = Synth(\f_compare, [\nFreq2, 220, \nQ2, 0.01]);
//wait for a few seconds
a.set(\t_finTrig, 1); //most similar
r.remove;
a = nil;