Skip to main content

Google's webRTC AECM for Android Mobile devices in C++

Now a days many of mobile devices comes with built-in hardware echo canceler.  But the low end devices that cost little doesn't have this feature integrated. And moreover the previous older android devices doesn't have the echo canceler. In my journey of echo cancellation I have came across a valuable library that will do everything for you , if you provide it the necessary gasoline .

I have tested this echo canceler tool with my HTC desire 610. Which is pretty cheap and doesn't have any built-in hardware echo canceler.  I have designed an algorithm for capture and playback, which uses ring-buffer, calculate the delay and use the webRTC aecm modules API.




Here we go --

    InitiateAecm()

    Set the clock cycle rate.
    Set the echo tail length.
    Set the channel count.
    Set the byte per sample. // it's 2 byte per sample

    

    Calculate sample per frame.
           sampleperframe = byte per sample * (clock cycle rate) / 100

    Set the output latency. // device play-out latecny

    Calculate the frame play delay.
            frameplaydelay = output latency * 3 / 4

    Initiate the webRTC echo module with clock cycle rate.

        Calculate Audio Play time.
            ptime = sampleperframe * 1000 / clock cycle rate

    Calculate latency buffer size.   
            lateframecount = frameplaydelay / ptime

    Add these late frame in latency buffer with filling demo audio data (with zero).
         

    Playback()

        Store the played frame in the delay buffer (it will be a FIFO ringbuffer
        with your estimated size).

        Now need to remove the demo frame from latency buffer and add real frame
        to the latency buffer.       
       
        if the latency buffer not filled with real data
            then,
                fetch the data from delay buffer and add it to the latency buffer
                and remove it from delay buffer.
        else
            nothing to do.


    Capture()
       
        if latency buffer not full with real playe frame data
            then,
                nothing to do.

        else
            fetch the data from latency buffer and do the echo cancellation by
            setting this frame as far-end and current capture data as the input.
            remove the used frame data from latency buffer.
           
            if the delay buffer is not empty
                then,
                    fetch the frame data from delay buffer and add it to the
                    latency buffer.

            else
                store a demo frame in the latency buffer. 



       

Comments

  1. Thanks for sharing your honest experience. When I first took a look at my head shots,
    I wasn’t too thrilled with mine but you’ve given me a new perspective!

    Virtual Edge

    ReplyDelete
  2. Where I can see your source code so that i compile and test it on my device.

    ReplyDelete

Post a Comment

Popular posts from this blog

UDP server client in c

Server #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <stdio.h> #include <unistd.h> #include <errno.h> #include <string.h> #include <stdlib.h> int main() {         int sock;         int addr_len, bytes_read;         char recv_data[1024],send_data[1024];         struct sockaddr_in server_addr , client_addr;         if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {             perror("Socket");             exit(1);         }         server_addr.sin_family = AF_INET;         server_addr.sin...

My favourite writer Humayun Ahmed

There is none who can replace him.At least the standard which he create in is life time in the running literature it never be replaceable.The new generation which is all the time busy in playing PC games,chatting ,bands etc. only his writing makes them to take a glance on the literature.For example Himu and Misir ali all the time keep them on track by anti-logic and logic.They also have show-down on the novel.I myself read all of the books of Himu and Misir ali and wait for the new one to come every year.Now I have to wait for life time. Except books he makes our dirty film industry pure by his heart warming ,well versed film.Following him many new producer try to make well and good film (not the dirty one) .He also contribute our drama by his dashing drama's. In writing except romance ,logic ,anti-logic ,he also write many science fiction.His brother Sir Dr. Md. Zafar Iqbal is the man who started science fiction in bangla. The list of books: Selected novels • Lilaboti (2...

[ASTERIK] configure: error: *** uuid support not found (this typically means the uuid development package is missing)

ISSUE: Build error on Asterik , when you want test webrtc feature :) checking for uuid_generate_random in -luuid... no checking for uuid_generate_random in -le2fs-uuid... no checking for uuid_generate_random... no configure: error: *** uuid support not found (this typically means the uuid development package is missing) Fix: This issue arises due to missing of UUID generator specified by rfc4122 . +Linux sudo apt-get install uuid-dev  @Unix yum -y install libuuid-devel Asterik comes with lots of helpful script available on - asterisk/contrib/scripts/ folder of your ASTERIK source. So just use the following command on UNIX console to run the asterik pre-requisite script. contrib/scripts/install_prereq install And you are done! configuring. Now -- Make Asterik.