introlab / odas

ODAS: Open embeddeD Audition System
MIT License
776 stars 246 forks source link

Inaccurate tracking above 65 degree elevation #167

Open jake266637 opened 5 years ago

jake266637 commented 5 years ago

When performing some accuracy testing on the matrix creator using the ODAS software I noticed that above 65 degrees the software latched onto this very quiet noise (potentially not from a physical source). This sound isn't loud enough to trigger the tracking by itself but can cause the software to continue tracking in that direction for a long time after the initial sound. When the software is latched onto this sound it inaccurately calculates the direction of arrival of the sources of interest. Increasing the active and inactive threshold values seemed to allow this problem to be mostly ignored but this then limits the usefulness of the software. Do you have any ideas for what is causing this problem?

I am using the software to determine the DoA of individual dog barks occurring some distance away from the monitor where I want each individual dog bark to have it's own ID tag so the calculated direction is accurate.

FrancoisGrondin commented 5 years ago

This is strange. Do you think you could provide us with some RAW recordings and the config file you are using?

jake266637 commented 5 years ago

raw audio.zip

active mu was between 0.1-0.35 and inactive mu was usually 0.05 less than that. N_inactive is at 15.

jake266637 commented 5 years ago

Here is the config file. @FrancoisGrondin

Configuration file for MATRIX Creator Raspberry Pi shield

version = "2.1";

Raw

raw: {

fS = 48000;
hopSize = 512;
nBits = 16;
nChannels = 8;

# Input with raw signal from microphones
interface: {
    type = "soundcard";
    card = 1;
    device = 0;
}

}

Mapping

mapping: {

map: (1, 2, 3, 4, 5, 6, 7, 8);

}

General

general: {

epsilon = 1E-20;

size:
{
    hopSize = 128;
    frameSize = 256;
};

samplerate:
{
    mu = 16000;
    sigma2 = 0.01;
};

speedofsound:
{
    mu = 343.0;
    sigma2 = 25.0;
};

mics = (

    # Microphone 1
    {
        mu = ( +0.020091, -0.048504, +0.000 );
        sigma2 = ( +0.000, +0.000, +0.000, +0.000, +0.000, +0.000, +0.000, +0.000, +0.000 );
        direction = ( +0.000, +0.000, +1.000 );
        angle = ( 80.0, 100.0 );
    },

    # Microphone 2
    {
        mu = ( -0.020091, -0.048504, +0.000 );
        sigma2 = ( +0.000, +0.000, +0.000, +0.000, +0.000, +0.000, +0.000, +0.000, +0.000 );
        direction = ( +0.000, +0.000, +1.000 );
        angle = ( 80.0, 100.0 );
    },

    # Microphone 3
    {
        mu = ( -0.048504, -0.020091, +0.000 );
        sigma2 = ( +0.000, +0.000, +0.000, +0.000, +0.000, +0.000, +0.000, +0.000, +0.000 );
        direction = ( +0.000, +0.000, +1.000 );
        angle = ( 80.0, 100.0 );
    },

    # Microphone 4
    {
        mu = ( -0.048504, +0.020091, +0.000 );
        sigma2 = ( +0.000, +0.000, +0.000, +0.000, +0.000, +0.000, +0.000, +0.000, +0.000 );
        direction = ( +0.000, +0.000, +1.000 );
        angle = ( 80.0, 100.0 );
    },

    # Microphone 5
    {
        mu = ( -0.020091, +0.048504, +0.000 );
        sigma2 = ( +0.000, +0.000, +0.000, +0.000, +0.000, +0.000, +0.000, +0.000, +0.000 );
        direction = ( +0.000, +0.000, +1.000 );
        angle = ( 80.0, 100.0 );
    },

    # Microphone 6
    {
        mu = ( +0.020091, +0.048504, +0.000 );
        sigma2 = ( +0.000, +0.000, +0.000, +0.000, +0.000, +0.000, +0.000, +0.000, +0.000 );
        direction = ( +0.000, +0.000, +1.000 );
        angle = ( 80.0, 100.0 );
    },

    # Microphone 7
    {
        mu = ( +0.048504, +0.020091, +0.000 );
        sigma2 = ( +0.000, +0.000, +0.000, +0.000, +0.000, +0.000, +0.000, +0.000, +0.000 );
        direction = ( +0.000, +0.000, +1.000 );
        angle = ( 80.0, 100.0 );
    },

    # Microphone 8
    {
        mu = ( +0.048504, -0.020091, +0.000 );
        sigma2 = ( +0.000, +0.000, +0.000, +0.000, +0.000, +0.000, +0.000, +0.000, +0.000 );
        direction = ( +0.000, +0.000, +1.000 );
        angle = ( 80.0, 100.0 );
    }

);

# Spatial filter to include only a range of direction if required
# (may be useful to remove false detections from the floor)
spatialfilters = (

    {

        direction = ( +0.000, +0.000, +1.000 );
        angle = (90.0, 100.0);

    }

);

nThetas = 181;
gainMin = 0.25;

};

Stationnary noise estimation

sne: {

b = 3;
alphaS = 0.1;
L = 150;
delta = 3.0;
alphaD = 0.1;

}

Sound Source Localization

ssl: {

nPots = 4;
nMatches = 10;
probMin = 0.5;
nRefinedLevels = 1;
interpRate = 4;

# Number of scans: level is the resolution of the sphere
# and delta is the size of the maximum sliding window
# (delta = -1 means the size is automatically computed)
scans = (
    { level = 2; delta = -1; },
    { level = 4; delta = -1; }
);

# Output to export potential sources
potential: {

    format = "json";
    interface: {
        type = "file";
        path= "/home/pi/matrix_creator_explore/jason.raw"
        ip = "127.0.0.1";
        port = 9001;

    };

};

};

Sound Source Tracking

sst: {

# Mode is either "kalman" or "particle"

mode = "kalman";

# Add is either "static" or "dynamic"

add = "dynamic";

# Parameters used by both the Kalman and particle filter

active = (
    { weight = 1.0; mu = 0.15; sigma2 = 0.0025 }
);

inactive = (
    { weight = 1.0; mu = 0.100; sigma2 = 0.0025 }
);

sigmaR2_prob = 0.0025;
sigmaR2_active = 0.0225;
sigmaR2_target = 0.0025;
Pfalse = 0.1;
Pnew = 0.1;
Ptrack = 0.8;

theta_new = 0.9;
N_prob = 1;
theta_prob = 0.8;
N_inactive = ( 15, 15, 15, 15 );
theta_inactive = 0.9;

# Parameters used by the Kalman filter only

kalman: {

    sigmaQ = 0.0001;

};

# Parameters used by the particle filter only

particle: {

    nParticles = 1000;
    st_alpha = 2.0;
    st_beta = 0.04;
    st_ratio = 0.5;
    ve_alpha = 0.05;
    ve_beta = 0.2;
    ve_ratio = 0.3;
    ac_alpha = 0.5;
    ac_beta = 0.2;
    ac_ratio = 0.2;
    Nmin = 0.7;

};

target: (
   # { tag = "myTarget"; x = 0.0; y = 0.0; z = 1.0 }

);

# Output to export tracked sources
tracked: {

    format = "json";

    interface: {
        type = "file";
        path = "/home/pi/matrix_creator_explore/tracked.raw";
       # ip = "<ip>";
       # port = 9000;
    };

};

}

sss: {

# Mode is either "dds", "dgss" or "dmvdr"

mode_sep = "dds";
mode_pf = "ss";

gain_sep = 10.0;
gain_pf = 3.0;

dds: {

};

dgss: {

    mu = 0.01;
    lambda = 0.5;

};

dmvdr: {

};

ms: {

    alphaPmin = 0.07;
    eta = 0.5;
    alphaZ = 0.8;
    thetaWin = 0.3;
    alphaWin = 0.3;
    maxAbsenceProb = 0.9;
    Gmin = 0.01;
    winSizeLocal = 3;
    winSizeGlobal = 23;
    winSizeFrame = 256;

};

ss: {

    Gmin = 0.01;
    Gmid = 0.5;
    Gslope = 10.0;

}

separated: {

    fS = 16000;
    hopSize = 128;
    nBits = 16;
    gain = 200.0;

    interface: {
        type = "file";
        path = "/home/pi/matrix_creator_explore/separated.raw"
       # ip = "<ip>";
       # port = 10000;
    }

};

postfiltered: {

    fS = 16000;
    hopSize = 128;
    nBits = 16;
    gain = 10.0;

    interface: {
        type = "file";
        path = "/home/pi/matrix_creator_explore/postfiltered.raw"
       # ip = "<IP>";
       # port = 10010;
    }

};

};

classify: {

frameSize = 4096;
winSize = 3;
tauMin = 88;
tauMax = 551;
deltaTauMax = 20;
alpha = 0.3;
gamma = 0.05;
phiMin = 0.5;
r0 = 0.2;

category: {

    format = "undefined";

    interface: {
        type = "blackhole";
    }

}

}

FrancoisGrondin commented 4 years ago

I notices recently some hardware have improper phase calibration between their channels (maybe due to the way the codec samples turn by turn each input). This might explain this. I'll try to make a calibration tool to fix that in the near future. Cheers.

jake266637 commented 4 years ago

Hello @FrancoisGrondin

I was wondering if there was any progress on this issue yet and also if you could suggest some parameters I could change to improve the localisation of more impulsive sounds in a noisy environment (dog barks outside). I find that the DOA accuracy is only accurate if the dog bark is the sound that actually triggers the recording on one of the 4 channels.