Electrical – Obtain audio information from mic and play in MATLAB

audioMATLABmicrophonesound

I am trying to make a basic VoIP implementation and I am stuck obtaining sound samples from the mic and playing the read data on a computer. I tried to sample the voice from the microphone and send it to the serial terminal using a very minimal code:

void setup() {
    Serial.begin(9600);
}

void loop() {
    int sensorValue = analogRead(A0);
    Serial.println(sensorValue);
    delayMicroseconds(122);
}

The delayMicroseconds(122) causes the sample rate to be around 8192 Hz. I also tried with a sample rate of 1000 Hz. The data plot obtained looks good, however, when I try to play it with the MATLAB command

sound(csvread('samples.csv'), 8192);

I do not really hear what it should be (I just hear random noise). I am attaching a graph of the obtained data and my microphone circuit. (I also tried subtracting the average from the array so the values are centered around zero, but no use).

Data Obtained:

enter image description here

Microphone Circuit:

enter image description here

Best Answer

Input:

Your signal looks like it doesn't have much dynamic range. You may want to look into amplifying it before it reaches the arduino's ADC.

The AVR based Arduinos have a 10 bit ADC -- 0 to 1024. At 5 volts Vref that is

\$ \frac{5volts}{ 1024 counts} = 4.9 \frac{mVolt }{ count}\$

Your signal ranges from ~150 to ~225. This is 75 counts of range or 7% of the ADC's resolution. Your input signal varies by about 366mV peak to peak.

It should vary by about 2.5v peak to peak.

Output:

Matlab's documentation on audio files states the following:

The MATLAB sound and soundsc functions support only single- or double-precision values between -1 and 1.

Your arduino code is printing values from 0-1024. Integers. You will need to normalize them and remove the DC bias: make the signal have an average of 0, and a range of [-1 1].

input = double(csvread('samples.csv')); input = input - 512; % convert the [0 to 1024] range to [-512 to 512] input = input ./ 512; % convert the [-512 to 512] range to [-1 to 1] sound(input, 8192);