Click here to Skip to main content
Click here to Skip to main content

Cross Platform Microphone Audio Processing Utility In Qt

By , 25 Jul 2012
 

Introduction 

This article explains how to record audio from microphone and process the audio sample using DSP algorithms. In this article, I am using the QAudioInput and QAudioOutput classes to record and play back to the input  audio,  and used Low pass filter algorithm to reduce noise in input audio. Here, I have tried to explain the low level audio processing using Qt. Here I am not explaining anycomplex DSP algorithms. It’s just a starting point to a better cross platform audio processing utility. You can implement your own algorithms or any complex algorithms to extend your ideas. I used Qt's audio input and audio output examples to develop this utility. 

Background 

In my recent project, I met with some issues to record audio and playback at a time. I searched about it in the web and saw a lot of forums discussing about to capture audio and play back to the speaker at a time. No one given any proper answer to do this using Qt. After some research work finally I succeeded to record and playback audio at a time. 

Using the code

TARGET specify the output file name  (TARGET  = ApplicationName)

TEMPLATE specify its compiled output type. Assign it to an application (TEMPLATE = app) 

Add all the source and header files are using in your project.

Add Form design resources to FORMS += mainwindow.ui. This will create user interface to your application  

In Qt Creator start a new Qt Widget project. The wizard will create all the necessary files to start a desktop application. To

link against the multimedia module, add  QT += multimedia line to your AppNamae .pro file:  

QT       += core gui
             multimedia
 
TARGET = MyAudio
TEMPLATE = app
 
SOURCES += main.cpp
        mainwindow.cpp
 
HEADERS  += mainwindow.h
FORMS    += mainwindow.ui

Before starting the audio processing initialize Audio Format Frequency, Channel, Sample Rate etc. Use QAudioFormat to initialize audio. 

An audio format specifies how data in an audio stream is arranged, i.e, how the stream is to be  interpreted. The encoding itself is specified by the codec() used for the stream.

In addition to the encoding, QAudioFormat contains other parameters that further specify how the audio data is arranged. These are the frequency, the number of channels, the sample size, the sample type, and the byte order. The following table describes these in more detail 

m_format.setFrequency(8000); //set frequency to 8000
m_format.setChannels(1); //set channels to mono
m_format.setSampleSize(16); //set sample sze to 16 bit
m_format.setSampleType(QAudioFormat::UnSignedInt ); //Sample type as usigned integer sample
m_format.setByteOrder(QAudioFormat::LittleEndian); //Byte order
m_format.setCodec("audio/pcm"); //set codec as simple audio/pcm

QAudioDeviceInfo infoIn(QAudioDeviceInfo::defaultInputDevice());
if (!infoIn.isFormatSupported(m_format))
{
    //Default format not supported - trying to use nearest
    m_format = infoIn.nearestFormat(m_format);
}

QAudioDeviceInfo infoOut(QAudioDeviceInfo::defaultOutputDevice());

if (!infoOut.isFormatSupported(m_format))
{
   //Default format not supported - trying to use nearest
    m_format = infoOut.nearestFormat(m_format);
}

Create audio input and output objects with IO device and audio formats.

The QAudioInput class provides an interface for receiving audio data from an audio input device.

The QAudioOutput class provides an interface for sending audio data to an audio output device.  

m_audioInput = new QAudioInput(m_Inputdevice, m_format, this);
m_audioOutput = new QAudioOutput(m_Outputdevice, m_format, this);

Start audio input and audio output and connect readyRead() SIGNAL to readMore() SLOT. 

The readyRead () signal is emitted once every time new data is available for reading from the device. It will only be emitted again once new data is available, such as when a new payload of network data has arrived on your network socket, or when a new block of data has been appended to your device. 

//Audio output device
m_output= m_audioOutput->start();
 //Audio input device
m_input = m_audioInput->start();
//connect readyRead signal to readMre slot.
//Call readmore when audio samples fill in inputbuffer
connect(m_input, SIGNAL(readyRead()), SLOT(readMore()));

Read sound samples from input device to buffer.

 qint64 l = m_input->read(m_buffer.data(), len);

Implemented Low Pass filter algorithm to reduce noise in the input audio to produce smooth sound.

int iIndex;
if(ui->chkRemoveNoise->checkState() == Qt::Checked)
{
    //Remove noise using Low Pass filter algortm[Simple algorithm used to remove noise]
    for ( iIndex=1; iIndex < len; iIndex++ )
    {
        outdata[ iIndex ] = 0.333 * resultingData[iIndex ] + ( 1.0 - 0.333 ) * outdata[ iIndex-1 ];
    }
}

Apply volume to audio sample for adjusting the output volume. Multiply an integer number to audio sample to adjust its amplitude.

for ( iIndex=0; iIndex < len; iIndex++ )
{
 //Cange volume to each integer data in a sample
 outdata[ iIndex ] = ApplyVolumeToSample( outdata[ iIndex ]);
}

int MainWindow::ApplyVolumeToSample(short iSample)
{
    //Calculate volume, Volume limited to  max 35535 and min -35535
    return std::max(std::min(((iSample * m_iVolume) / 50) ,35535), -35535);
}

Finally play back the modified audio samples to speaker. This will play modified audio from microphone to speaker.

//write modified sond sample to outputdevice for playback audio
m_output->write((char*)outdata, len);

You can implement your own algorithms in readMore() function. Here I implemented Low Pass filter algorithms to reduce noise in input audio. There are lots of complex audio filtering algorithms are available to produce a perfect audio filtering Low Pass is the simplest algorithm in that list. Shows how to change the volume in low level audio processing.

Reference  

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

About the Author

Arun Kumar K S
Software Developer Outsourcing Programmer
India India
I am an OSX\Qt\VC++\.net software developer from India. I am currently employed as Software Engineer in an outsourcing company. The main technologies I used are VC++,MFC,C#.NET,Qt,COM,Windows media Format etc...
 

 

I'm looking to advance my Software Engineering career by learning new technologies and extending my programming experience.

 
EMail : arunkumaraymuo@gmail.com
Skype : arunkumarinskype

Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
Hint: For improved responsiveness ensure Javascript is enabled and choose 'Normal' from the Layout dropdown and hit 'Update'.
You must Sign In to use this message board.
Search this forum  
    Spacing  Noise  Layout  Per page   
GeneralMy vote of 5membersreekumar12347-Jun-13 5:11 
QuestionQtMultimediamembernguyentuanebook14-Feb-13 22:22 
AnswerRe: QtMultimediamemberArun Kumar K S24-Feb-13 17:49 
GeneralRe: QtMultimediamembernguyentuanebook3-Mar-13 16:51 
QuestionToo much noisememberMember 814714818-Dec-12 4:32 
AnswerRe: Too much noisememberArun Kumar K S18-Dec-12 17:59 
GeneralMy vote of 5 [modified]memberMember 944012425-Sep-12 1:12 
GeneralRe: My vote of 5memberArun Kumar K S25-Sep-12 13:25 
GeneralMy vote of 2membertopocc23-Sep-12 6:03 
GeneralRe: My vote of 2 [modified]memberArun Kumar K S23-Sep-12 17:51 
QuestionVote excellent and a suggestionmemberX3m2-Aug-12 4:52 
GeneralMy vote of 5memberxComaWhitex24-Jul-12 18:12 
GeneralRe: My vote of 5memberArun Kumar K S25-Jul-12 22:50 
GeneralMy vote of 5membergndnet17-Jul-12 11:51 
GeneralMy vote of 5memberlintovadakkekudy14-Jul-12 2:41 
GeneralRe: My vote of 5memberArun Kumar K S16-Jul-12 0:04 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Permalink | Advertise | Privacy | Mobile
Web01 | 2.6.130619.1 | Last Updated 25 Jul 2012
Article Copyright 2012 by Arun Kumar K S
Everything else Copyright © CodeProject, 1999-2013
Terms of Use
Layout: fixed | fluid