Main Content

Real-Time Audio in MATLAB

Audio Toolbox™ is optimized for real-time audio processing. audioDeviceReader, audioDeviceWriter, audioPlayerRecorder, dsp.AudioFileReader, and dsp.AudioFileWriter are designed for streaming multichannel audio, and they provide necessary parameters so that you can trade off between throughput and latency.

For information on real-time processing and tips on how to optimize your algorithm, see Audio I/O: Buffering, Latency, and Throughput.

This tutorial describes how you can implement audio stream processing in MATLAB®. It outlines the workflow for creating a development test bench and provides examples for each stage of the workflow.

Create a Development Test Bench

This tutorial creates a development test bench in four steps:

  1. Build objects to input and output audio from your test bench.

  2. Create an audio stream loop that processes your audio frame-by-frame.

  3. Add a scope to visualize both the input and output of your audio stream loop.

  4. Add a processing algorithm for your audio stream loop.

This tutorial also discusses tools for visualizing and tuning your processing algorithm in real time.

For an overview of the processing loop, consider the completed test bench below. You can recreate this test bench by walking step-by-step through this tutorial.

 Completed Test Bench Code

1. Create Input/Output System objects

Your audio stream loop can read from a device or a file, and it can write to a device or a file. In this example, you build an audio stream loop that reads audio frame-by-frame from a file and writes audio frame-by-frame to a device. See Quick Start Example for an alternative input/output configuration.

Create a dsp.AudioFileReader System object™ and specify a file. To reduce latency, set the SamplesPerFrame property of the dsp.AudioFileReader System object to a small frame size.

Next, create an audioDeviceWriter System object and specify its sample rate as the sample rate of the file reader.

For more information on how to use System objects, see What Are System Objects?

 View Example Code

2. Create Audio Stream Loop

An audio stream loop processes audio iteratively. It does so by:

  • Reading a frame of an audio signal

  • Processing that frame of audio signal

  • Writing that frame of audio signal to a device or file

  • Moving to the next frame

In this tutorial, the input to the audio stream loop is read from a file. The output is written to a device.

To read an audio file frame-by-frame, call your dsp.AudioFileReader within your audio stream loop, and provide no arguments. To write an audio signal frame-by-frame, call your audioDeviceWriter within your audio stream loop with an audio signal as an argument.

 View Example Code

All System objects have a release function. As a best practice, release your System objects after use, especially if those System objects are communicating with hardware devices such as sound cards.

3. Add Scopes

There are several scopes available. Two common scopes are the timescope and the spectrumAnalyzer. This tutorial uses timescope to visualize the audio signal.

The timescope System object displays an audio signal in the time domain. Create the System object. To aid visualization, specify values for the TimeSpan, BufferLength, and YLimits properties. To visualize an audio signal frame-by-frame, call the timescope System object within your audio stream loop with an audio signal as an argument.

 View Example Code

4. Develop Processing Algorithm

In most applications, you want to process your audio signal within your audio stream loop. The processing stage can be:

  • A block of MATLAB code within your audio stream loop

  • A separate function called within your audio stream loop

  • A System object called within your audio stream loop

In this tutorial, you call the reverberator to process the signal within your audio stream loop.

Create a reverberator System object, and specify the SampleRate property as the sample rate of your file reader. To adjust the reverberation effect, specify values for the PreDelay and WetDryMix properties. To apply the reverberation effect to an audio signal frame-by-frame, call the reverberator within your audio stream loop with an audio signal as an argument.

 View Example Code

Add Tunability

The Audio Toolbox user has several options to add real-time tunability to a processing algorithm. To add tunability to your audio stream loop, you can use:

  • The Audio Test Bench – UI-based exercises for audioPlugin classes and most Audio Toolbox System objects.

  • Built-in functions – Functions in Audio Toolbox for visualizing key aspects of your processing algorithms.

  • A custom-built user interface – See Real-Time Parameter Tuning for a tutorial.

  • A MIDI Controller – Many Audio Toolbox System objects include functions that support MIDI controls. You can use the configureMIDI function in the reverberator System object to synchronize your System object properties to MIDI controls. To use MIDI controls with System objects that do not have a configureMIDI function, see MIDI Control Surface Interface.

  • The User Datagram Protocol (UDP) – You can use UDP within MATLAB for connectionless transmission. You can also use UDP to receive or transmit datagrams between environments. Possible applications include using MATLAB tools to tune your audio processing algorithm while playing and visualizing your audio in a third-party environment. For an example application of UDP communication, see Communicate Between a DAW and MATLAB Using UDP.

Quick Start Example

Audio Stream from Device to File

This example shows how to acquire an audio signal using your microphone using audioDeviceReader, perform basic signal processing, and write your signal to a file using dsp.AudioFileWriter.

Construct input and output objects. Use the sample rate of your input as the sample rate of your output.

deviceReader = audioDeviceReader;
fileWriter = dsp.AudioFileWriter(SampleRate=deviceReader.SampleRate);

Specify an audio processing algorithm. For simplicity, only add gain.

process = @(x) x.*5;

Place the following steps in a while loop for continuous stream processing:

  1. Call your audio device reader like a function with no arguments to acquire one input frame.

  2. Perform your signal processing operation on the input frame.

  3. Call your audio file writer like a function with the processed frame as an argument.

The file is named output.wav and written to current folder by default.

disp("Begin Signal Input...")
Begin Signal Input...
tic
while toc<5
    mySignal = deviceReader();
    myProcessedSignal = process(mySignal);
    fileWriter(myProcessedSignal)
end
disp("End Signal Input")
End Signal Input
release(deviceReader)
release(fileWriter)

Related Topics