Hello, I've solved my problem. It was a bug with the DAW I'm using (Ardour) which doesn't deal well with multichannel imported tracks : While playing, all the channels were a copy of the first one, so the HOA encoding was obviously wrong.
Thank you anyway, Pierre > Hello everyone, > > I'm trying to implement an HOA decoder for spherical microphones and I'm > getting some numerical issues : > > The principle is the following : I have the temporal signals of all the > capsules of the microphone : it's temporal vector of signals, let's call it > "I" (size n x 1) > > I have to multiply this vector by a Matrix "M" (size m x n) to obtain my HOA > components. > > So I have to do this operation at each discrete time t : > > B = M.I > > I've used the solution proposed by Aaron Heller to implement the matrix > multiplication : > > // bus with gains > gain(c) = R(c) with { > R((c,cl)) = R(c),R(cl); > R(1) = _; > R(0) = !; > //R(0) = !:0; // if you need to preserve the number of outputs > R(float(0)) = R(0); > R(float(1)) = R(1); > R(c) = *(c); > }; > > // n = number of inputs > // m = number of output > matrix(n,m) = par(i,n,_) <: par(i,m,gain(a(i)):>_); > > a(0) = (0.5, -0.5, 1.1, 1.2,0); > a(1) = (1,2,3,4,-1); > a(2) = (0.5,0.5,0,0.25,1/3); > a(3) = (0,0,0,.1, sqrt(2)); > > process = matrix(5,4); > > It's working but I have got some unexplained numerical problems : > > In my matrix "M", the sum of the components of each rows = 0 except the > first row. So if all inputs signals are exactly the same, the outputs > will be 0 except the first output. > > But, if the signals are not the same, I should have m outputs signals not > null. But I don't when I'm playing my input wav : only the first output is > not null ! > > So I've tried the following : > > I take a constant signal as input signal : the n samples at discrete time t > (extract from my input wav signal) > > matrix(n,m)= > (0.143993,0.147716,0.118169,0.141023,0.155442,0.112583,0.166597,0.178432,0.1 > 35545,0.186261,0.181142,0.168309,0.137996,0.14302,0.139751,0.157548,0.159706 > ,0.133034,0.168049,0.124931,0.160939,0.161888,0.146289,0.140364,0.188028,0.1 > 68121,0.160577,0.152144,0.156805,0.145675,0.196994,0.134682)<: > par(i,m,gain(a(i)):>_); > > I measure the output and I've got something everywhere ! But when I play the > wav entirely, no outputs except the first one ! > > I've implemented this matrix operation in PureData (without the use of > Faust) and it's working when I'm playing the input wav (the M matrix is > exactly the same) > > My observations are the following with my Faust code : when the inputs > signals are slightly different, I've got output signal everywhere, but when > they are not exactly identical but close enough, I just have the first > output > > > Here is my Faust code for a M = 3*32 matrix : > > import("math.lib"); > import("music.lib"); > > // bus with gains > gain(c) = R(c) with { > R((c,cl)) = R(c),R(cl); > R(1) = _; > R(0) = !; > //R(0) = !:0; // if you need to preserve the number of outputs > R(float(0)) = R(0); > R(float(1)) = R(1); > R(c) = *(c); > }; > > //vmeter(x) = attach(x, envelop(x) : vbargraph("[unit:dB]", -70, > 10)); > //envelop = abs : max(db2linear(-70)) : linear2db : > min(10) : max ~ > -(80.0/SR); > > vmeter(x) = attach(x, envelop(x) : vbargraph("[unit:dB]", -100, > 10)); > envelop = abs : max(db2linear(-100)) : linear2db : > min(10) : max ~ > -(80.0/SR); > > // n = number of inputs > // m = number of output > > matrix(n,m) = hgroup("Inputs",par(i,n,vgroup("%i", > vmeter)))<:par(i,m,gain(a(i)):>hgroup("Outputs",vgroup("%i",vmeter))); > > //matrixtest(n,m) = par(i,n,1) <: par(i,m,gain(a(i)):>_); > > //matrixtest2(n,m)= > (0.143993,0.147716,0.118169,0.141023,0.155442,0.112583,0.166597,0.178432,0.1 > 35545,0.186261,0.181142,0.168309,0.137996,0.14302,0.139751,0.157548,0.159706 > ,0.133034,0.168049,0.124931,0.160939,0.161888,0.146289,0.140364,0.188028,0.1 > 68121,0.160577,0.152144,0.156805,0.145675,0.196994,0.134682)<: > par(i,m,gain(a(i)):>_); > > a(0)=(0.03125,0.03125,0.03125,0.03125,0.03125,0.03125,0.03125,0.03125,0.0312 > 5,0.03125,0.03125,0.03125,0.03125,0.03125,0.03125,0.03125,0.03125,0.03125,0. > 03125,0.03125,0.03125,0.03125,0.03125,0.03125,0.03125,0.03125,0.03125,0.0312 > 5,0.03125,0.03125,0.03125,0.03125); > > a(1)=(0.0505636,0.0460428,0.0505636,0.0460428,0.028456,0.03125,0.0193136,0.0 > 3125,0.028456,0.03125,0.0193136,0.03125,0,0,0,0,-0.0505636,-0.0460428,-0.050 > 5636,-0.0460428,-0.028456,-0.03125,-0.0193136,-0.03125,-0.028456,-0.03125,-0 > .0193136,-0.03125,0,0,0,0); > > a(2)=(7.53456*10^-10,0.028456,0,-0.028456,0,0.03125,0.0505636,0.03125,0,-0.0 > 3125,-0.0505636,-0.03125,0.0193136,0.0460428,0.0460428,0.0193136,7.53456*10^ > -10,-0.028456,7.53456*10^-10,0.028456,0,-0.03125,-0.0505636,-0.03125,0,0.031 > 25,0.0505636,0.03125,-0.0193136,-0.0460428,-0.0460428,-0.0193136); > > process = matrix(32,25); > //process=matrixtest2(32,25); > > Thanks for your help > > Pierre Lecomte > PhD student ------------------------------------------------------------------------------ Comprehensive Server Monitoring with Site24x7. Monitor 10 servers for $9/Month. Get alerted through email, SMS, voice calls or mobile push notifications. Take corrective actions from your mobile device. http://p.sf.net/sfu/Zoho _______________________________________________ Faudiostream-users mailing list Faudiostream-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/faudiostream-users