cross correlation of analogread of two sound sensor data

hi,i am new into the programming. i am struggling to perform the cross correlation of analogread of two

sound sensor data.

could somebody help me write the code

,i am new into the programming

Cross correlation is not a thing that a beginner should be doing.

What exactly are you trying to do? Is it to do with trying to spot if a sound is the same as a pre-recorded sound? If so cross correlation is only part of the technique you need to use. It is a very complex problem.

i am trying to find the location of unknown sound source ( the sound can be clap or speech ).So, i am going to

use CC in order to find a time delay between the microphone.

See:- Acoustic direction finding using Microphone - Project Guidance - Arduino Forum

But what you really want is one of these:-https://uk.farnell.com/matrix-labs/matrix-voice-esp/dev-kit-iot-voice-recognition/dp/2846913

This is a review of one. Matrix Voice review — The MagPi magazine

If you can set up a microphone so that only claps are detected, just start a timer running when the first microphone registers, and stop it when the second microphone registers.

See this acoustic localization page and this thread.

makibra:
i am trying to find the location of unknown sound source ( the sound can be clap or speech ).So, i am going to

use CC in order to find a time delay between the microphone.

Will it make a big difference to your technique if the samples from the different sources are more than 100us apart?

no ii won't make since i am taking at most one sample every 112 µs. and for alternating between the

channels,on each channel i get one sample every 224 µs.

i understand the CC in theory but the implement in term of code is what i am struggling . i have done research

the initial part of the code which consists reading the value via by analogread and store them into array

the second part is to perform the cc but i couldn't do it that part

could someone help me ?

the implement in term of code is what i am struggling

Post the code you have and explain the problems. See the "How to use this forum" post for instructions.

A web search on "cross correlation c source code" gives this (among other stuff): Cross Correlation

This particular implementation is biased, so it won't do well if the delay range of interest is large relative to the number of samples. That probably not an issue for this application as I understand it.

The problem with using cross correlation for detecting the angle of approach of a sound is that the result is ambiguous.

Imagine if you get that the angle is 45 degrees, you don’t know if that is 45 degrees to the left or right.

the code i have .there is not cross correlation in it .

to tell whether it is the angle right or left, we can say if the cross correlation is positive then the angle upward

to the right or if the cc is negative ,to the left. By using if statement i think we can do it

To find the location of a sound, isn't it easier to use 3 microphones at the top of a triangle ? A correlation function
could localize the sound generation inside the triangle.

you can use 3 microphones in triangular shape but i think the angle will be more 180 degree

Grumpy_Mike:
The problem with using cross correlation for detecting the angle of approach of a sound is that the result is ambiguous.

Imagine if you get that the angle is 45 degrees, you don’t know if that is 45 degrees to the left or right.

Two receive elements resolve to a hyperbola (approximately a cone at range, e.g. 45 degrees) rotated around the axis along which the receive elements are located. In a two dimensional horizontal plane geometry this is a front/back ambiguity. If the microphones are directional, one might be able to rule out the back ambiguity in practice.

makibra:
the code i have .there is not cross correlation in it .

Huh?

ard_newbie:
To find the location of a sound, isn’t it easier to use 3 microphones at the top of a triangle ? A correlation function
could localize the sound generation inside the triangle.

I don’t know about “easier”, but 3 microphones so arranged can give the direction of arrival in 3 dimensions, albeit still with a front/back ambiguity.

MrMark:
I don’t know about “easier”, but 3 microphones so arranged can give the direction of arrival in 3 dimensions, albeit still with a front/back ambiguity.

Are you sure of that ?

Are you sure of that ?

Very common approach. Look up trilateration.

The ambiguity is with respect to the mirror plane containing the three microphones.

function [lags,ck,cc,td] = xcorrTD(x,y)
%
%   TIME-DOMAIN CROSS-CORRELATION FUNCTION
%
%   Description: xcorrTD takes two discrete time signals as input and
%   calculates cross-correlation values, cross-correlation correlation
%   coefficients and delay between two signals. The computation is
%   performed in the time domain. The results of xcorrTD is validated
%   against the MatLAB's xcorr function.
%
%   For cross-correlation in frequency domain see xcorrFD. 
%
%   Syntax:    
%         [lags,ck,cc,td] = xcorrTD(x,y)
%
%   Input: 
%         x = input signal 1 (must be a Nx1 or 1xN vector)
%
%         y = input signal 2 (must be a Nx1 or 1xN vector)
%
%   Output: 
%
%         lags = a vector of lags with a length of 2xN-1 (N = number of
%         data points in signal x or y)
%
%           ck = cross-correlation values (MatLAB xcorr gives them as
%           output)
%
%           cc = correlation coefficients
%
%           td = delay (i.e., number of lags) between two signals  
%
%   Reference: Gubbins, D. (2004). Time Series Analysis and Inverse Theory
%   for Geophysicists, Cambridge University Press, 255 p.
%
%   Example: Input acceleration signals are base and roof motions from a
%   building during earthquake shaking. Let us compute the delay between
%   two signals, which can be used to compute average shear-wave velocity
%   in the building.
%
%       data = importdata('input.txt');
%       x = data(:,2); y = data(:,3);
%       [lag,ck,cc,td] = xcorrTD(x,y);
%       plot(lag,ck,'r'); grid on; 
%       xlabel('Lag'); ylabel('Cross correlation values');
%       title('Cross-correlation in time domain by xcorrTD');
%       print('-dpng','-painters','-r600','xcorrTD.png')
%
%   THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
%   WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
%   MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
%   NO EVENT SHALL THE COPYRIGHT OWNER BE LIABLE FOR ANY DIRECT, INDIRECT,
%   INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
%   BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
%   OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
%   ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
%   TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
%   USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
%   DAMAGE.
%
%   Written by Dr. Erol Kalkan, P.E. (ekalkan@usgs.gov)
%   $Revision: 1.0 $  $Date: 2017/06/14 14:03:00 $
ndata = length(x);
sx = sum(x.^2); sy = sum(y.^2);
maxlag = ndata-1;
cnt = 0;
for lag = -maxlag:maxlag
   cnt = cnt + 1;
   sxy = 0;
   for i=1:ndata
       j = i + lag;
       if j>0 && j<=ndata
           sxy = sxy + x(i) * y(j);
       end
   end
   cc(cnt) = sxy / sqrt(sx*sy);  % correlation coefficient 
   ck(cnt) = sxy;                % cross-correlation value 
   lags(cnt) = lag;
end
[~,i] = max(cc);
td = i - ndata;

Hi,

this is my code but i am really struggling the cross correlation.please help me to convert the matlab

code into arduino.

#define LED_left 2
#define LED_right 4

#define left_mic A0
#define right_mic A2

const unsigned int numReadings = 100;
unsigned int analogVals1[numReadings];
unsigned int analogVals2[numReadings];
unsigned int i = 0;

void setup() {

pinMode(LED_left, OUTPUT);
digitalWrite(LED_left, LOW);

pinMode(LED_right, OUTPUT);
digitalWrite(LED_right, LOW);

Serial.begin(115200);

}

void loop() {
    
     int left =  analogRead(left_mic); 
Serial.println(String(left));
int right =  analogRead(right_mic); 
Serial.println(String(right));

static uint32_t tStart = millis(); // ms; start time
const uint32_t DESIRED_PERIOD = 1000; // ms
uint32_t tNow = millis(); // ms; time now
if (tNow - tStart >= DESIRED_PERIOD)
{
  tStart += DESIRED_PERIOD; // update start time to ensure consistent and near-exact period

  Serial.println("taking sample");
  analogVals1[i] = analogRead(left_mic);
  analogVals2[i] = analogRead(right_mic);
  
  i++;
  if (i>=numReadings)
  {
    i = 0; //reset to beginning of array, so you don't try to save readings outside of the bounds of the array
  }
}
}