4 microphones aux sommets d’un tétraèdre régulier imprimé en 3D et 1 au centre, pour quoi faire... déterminer d’où vient un son par corrélation entre les signaux des microphones (je vais aussi tester la version doppler décrite sur un article précédent).
On mesure la différence entre les temps d’arrivée d’un bruit et vu que l’on connaît la position des microphones, on peut calculer la direction d’origine. On devrait même pouvoir obtenir une coordonnée relative mais là ça devient un peut plus difficile (théoriquement possible mais demande une mesure de temps très précise).
4 microphones aux sommets => 3 deltas de temps (on compte l’erreur d’horloge comme négligeable) donc on a 3 équations (non linéaires) pour 3 inconnues (dX, dY, dz).
Le microphone au centre servira à optimiser l’algorithme.
Je vais utiliser un système de son 5.1 comme banc de test.
Pour créer le support, j’ai utilisé OpenJSCAD (http://openjscad.org/), je vous conseille d’aller faire un essais (code à la fin du post).
https://fr.wikipedia.org/wiki/T%C3%A9tra%C3%A8dre_r%C3%A9gulier
4 microphones at the vertices of a 3D printed regular tetrahedron and 1 at the center, for what ... to determine where a sound comes from by correlation between the signals of the microphones (I will also test the Doppler version described on a previous article).
The difference between the arrival times of a noise and the known position of the microphones allow to compute the origin direction. We should be able to obtain a relative coordinate but this is more difficult (theoretically possible but requires a very precise time measurement).
4 microphones at the vertices => 3 deltas of time (we count the clock error as negligible) so we have 3 equations (nonlinear) for 3 unknowns (dX, dY, dz).
The microphone at the center will be used to optimize the algorithm.
I will use a 5.1 sound system as a test bench.
To create the support, I used OpenJSCAD (http://openjscad.org/), I advise you to go for a test (code is at the end of post).
https://en.wikipedia.org/wiki/Tetrahedron
// code du tétraèdre pour OpenJSCAD, copier coller ce qui suit dans http://openjscad.org/
// OpenJSCAD code for tetrahedron, copy past that code to http://openjscad.org/
var xlength_mic = 17;
var ylength_mic = 11;
var zlength_mic = 6;
var xlength_box = xlength_mic + 2 * thinkness;
var ylength_box = ylength_mic + 2 * thinkness;
var zlength_box = zlength_mic + thinkness;
function mic_space()
{
var mic = cube({size: [xlength_mic, ylength_mic, zlength_mic]}).translate([(xlength_box - xlength_mic) / 2, (ylength_box - ylength_mic) / 2, zlength_box - zlength_mic]);
return mic.translate([- xlength_box / 2, - ylength_box / 2, 0]).rotateZ(box_zrotation);
}
function box_support()
{
var box = cube({size: [xlength_box, ylength_box, zlength_box]});
return box.translate([- xlength_box / 2, - ylength_box / 2, 0]).rotateZ(box_zrotation);
}
function main() {
var length = 70.0;
var p0 = [0,0,0];
var p1 = [length,0,0];
var p2 = [0.5*length,sqrt(3)/2*length,0];
var p3 = [0.5*length,(sqrt(3)/6)*length,(sqrt(6)/3)*length];
var p01 = [0,0,0];
var p12 = [0,0,0];
var p20 = [0,0,0];
var pcenter = [0,0,0];
for (var i = 0; i < 3; i++)
{
pcenter[i] = (p0[i] + p1[i] + p2[i] + p3[i]) / 4;
p01[i] = (p0[i] + p1[i]) / 2;
p12[i] = (p1[i] + p2[i]) / 2;
p20[i] = (p2[i] + p0[i]) / 2;
}
var w = new Array();
var arm_01 = cylinder({start: p0, end: p1, radius: 8, resolution: 4});
var arm_02 = cylinder({start: p0, end: p2, radius: 8, resolution: 4});
var arm_03 = cylinder({start: p0, end: p3, radius: 8, resolution: 4});
var arm_12 = cylinder({start: p1, end: p2, radius: 8, resolution: 4});
var arm_13 = cylinder({start: p1, end: p3, radius: 8, resolution: 4});
var arm_23 = cylinder({start: p2, end: p3, radius: 8, resolution: 4});
var arm_c0 = cylinder({start: pcenter, end: p0, radius: 8, resolution: 4});
var arm_c1 = cylinder({start: pcenter, end: p1, radius: 8, resolution: 4});
var arm_c2 = cylinder({start: pcenter, end: p2, radius: 8, resolution: 4});
var arm_c3 = cylinder({start: pcenter, end: p3, radius: 8, resolution: 4});
w.push(sphere({r: 3}).translate(p0));
w.push(sphere({r: 3}).translate(p1));
w.push(sphere({r: 3}).translate(p2));
w.push(sphere({r: 3}).translate(p3));
w.push(sphere({r: 3}).translate(pcenter));
var bottom_empty_space = cube({size: [xlength_box, ylength_box, pcenter[2]]}).translate([- xlength_box / 2, - ylength_box / 2, 0]).rotateZ(box_zrotation).translate([pcenter[0], pcenter[1], 0]);
var middle_height = p3[2] - pcenter[2] - zlength_box;
var middle_empty_space = cube({size: [xlength_box, ylength_box, middle_height]}).translate([- xlength_box / 2, - ylength_box / 2, 0]).rotateZ(box_zrotation).translate([pcenter[0], pcenter[1], pcenter[2] + zlength_box]);
var empty_space = union(bottom_empty_space, middle_empty_space, mic_space().translate(p3), mic_space().translate(pcenter));
var cylinder_imit = cylinder({start: [pcenter[0], pcenter[1], 0], end: [pcenter[0], pcenter[1], p3[2] + zlength_box], r1: 15, r2: 15, fn: 50});
cylinder_imit
w.push(arm_01);
w.push(arm_02);
w.push(arm_03);
w.push(arm_12);
w.push(arm_13);
w.push(arm_23);
w.push(arm_c0);
w.push(arm_c1);
w.push(arm_c2);
w.push(arm_c3);
return w;
}