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;
}