mobileDevObject = mobiledev; mobileDevObject.MicrophoneEnabled = 1;
mobileDevObject.logging = 1; disp('Sampling background noise...') pause(2) mobileDevObject.logging = 0; audioData = readAudio(mobileDevObject); disp('Maximum sound of the background noise: ') threshold = max(abs(audioData), [], "all")
Sampling background noise... Maximum sound of the background noise: threshold = 0.0122
disp('Speak into the device microphone for a few seconds. For example, say: ') mobileDevObject.logging = 1; tic disp('"Testing MATLAB Mobile Audio"') startTime = 0; totalAudio = [];
Speak into the device microphone for a few seconds. For example, say: "Testing MATLAB Mobile Audio"
while toc < 5 && startTime == 0 pause(.2) audioData = readAudio(mobileDevObject); if max(abs(audioData)) > threshold * 1.5 startTime = toc totalAudio = audioData; else totalAudio = vertcat(totalAudio, audioData); end end
startTime = 1.4202
if startTime ~= 0 numberOfIntervalsStopped = 0; while numberOfIntervalsStopped < 2 && toc < 10 pause(.2) audioData = readAudio(mobileDevObject); if max(abs(audioData)) < threshold * 1.5 numberOfIntervalsStopped = numberOfIntervalsStopped + 1; else numberOfIntervalsStopped = 0; end totalAudio = vertcat(totalAudio,audioData); end end mobileDevObject.logging = 0;
endTime = toc; leftAudio = totalAudio(:,1); n = numel(leftAudio); if n == 0 disp(' ') disp('No audio data recorded. Try to run the script again.') clear mobileDevObject return end sampleRate = mobileDevObject.Microphone.SampleRate;
figure(1); plot(leftAudio) title('Sound wave'); timeElapsed = endTime - startTime ticks = 0:floor(timeElapsed); sampleTicks = ticks * n/timeElapsed; xticks(sampleTicks) xticklabels(ticks) xlabel('Time(s)') ylabel('Amplitude')
timeElapsed = 8.7632
fftData = fft(leftAudio); % Signal length is equal to the number of samples. signalLength = n; % Normalize the FFT data by dividing by signalLength. fftNormal = abs(fftData/signalLength); % The second half of the FFT data is a reflection of the first half % and is not relevant in this case, so remove those values. fftNormal = fftNormal(1:floor(signalLength/2)+1); % Multiply the final values by 2 to account for removed values. fftNormal(2:end-1) = 2*fftNormal(2:end-1); % freqs is the x-axis scale of the graph. freqs = sampleRate*(0:(signalLength/2))/signalLength; % Convert factor from index to frequency. scale = sampleRate/signalLength;
cutoff = 1000/scale; figure(2); plot(freqs(1:floor(cutoff)),fftNormal(1:floor(cutoff))) title("Frequency Domain Graph") xlabel("Frequency (Hz)") ylabel("Amplitude") ax = gca; ax.XAxis.Exponent = 0;
[mVal, mInd] = max(fftNormal); fprintf("Dominant frequency: %d Hz\n",floor(mInd * scale)); if startTime == 0 disp(' ') disp('The voice of the speech is too low compared to the background noise, analysis might not be precise. Try to run the script again and speak louder.'); end clear mobileDevObject
Dominant frequency: 125 Hz