$30 off During Our Annual Pro Sale. View Details »

Audio Fundamentals - Basics

Audio Fundamentals - Basics

Slides for a workshop on audio fundamentals.

Chinmay Pendharkar

May 10, 2013
Tweet

More Decks by Chinmay Pendharkar

Other Decks in Technology

Transcript

  1. Audio Fundamentals
    Chinmay Pendharkar, Sonoport, 2013

    View Slide

  2. View Slide

  3. Sound Waves

    View Slide

  4. Analog vs Digital Audio

    View Slide

  5. Analog vs Digital Audio

    View Slide

  6. Digitization

    View Slide

  7. Digitization - Why?
    ● Easier to manipulate digital audio
    ● Easier to store digital audio
    ● Easier to transport digital audio
    ● Get back perfect original analog audio

    View Slide

  8. Digital Audio
    Analog
    Audio
    Analog - Digital
    Conversion
    Digital - Analog
    Conversion
    Digital
    Audio

    View Slide

  9. Sampling Frequency

    View Slide

  10. Sampling Frequency

    View Slide

  11. Sampling Theorem

    View Slide

  12. Sampling Theorem

    View Slide

  13. Sampling Theorem
    2 x (Max Frequency of Content) ≤ Sampling Frequency
    for perfect reconstruction of analog signal from digital

    View Slide

  14. Sampling Frequency
    2 x (Max Frequency of Content) ≤ Sampling Frequency.
    2 x ( 20000 Hz ) ≤ 44100 Hz .
    Upper Limit of Human Hearing

    View Slide

  15. Sampling
    ● Sampling Frequency > 44100 : Oversampling
    ● Sampling Frequency < 44100 : Undersampling
    ● 44100Hz =>
    ○ 44100 samples per second
    ○ 44100 data points per second
    ● Less computation vs Audio Fidelity

    View Slide

  16. Quantization / Bit Depth
    uint_16

    View Slide

  17. Quantization
    0x0000 (0)
    0xFFFF (65535)
    96dBFS
    ~ 120dB Human
    Hearing Range
    65535
    65534
    65533
    65532
    0

    View Slide

  18. Digital Audio
    Discretization of Time - Sampling
    Discretization of Amplitude -
    Quantization

    View Slide

  19. Digital Audio
    Common Formats:
    Sampling Rate : 44100 Hz
    Bit Depth : 16 bits
    Sampling Rate : 192000 Hz
    Bit Depth : 24 bits
    "CD Audio"
    "Mastering
    Quality"

    View Slide

  20. Digital Audio Formats
    ● Uncompressed
    ○ AIFF
    ○ WAV
    ● Compressed (Lossless)
    ○ FLAC
    ○ ALAC
    ● Compressed (Lossy)
    ○ MP3
    ○ AAC

    View Slide

  21. Real Time Audio on PC/Mac

    View Slide

  22. Audio Stacks
    Audio Hardware
    Drivers
    Operating System Audio API
    User Program/Application

    View Slide

  23. Audio
    Stack -
    Windows

    View Slide

  24. Audio Stack - OSX/iOS

    View Slide

  25. Audio Stack - Linux

    View Slide

  26. Audio
    Stack -
    Android

    View Slide

  27. Audio Stacks
    Audio Hardware
    Drivers
    Operating System Audio API
    User Program/Application

    View Slide

  28. Audio Stack
    Audio Hardware DAC
    Digital Analog Converter

    View Slide

  29. Audio Stacks
    44.1kHz / 16bits ~= 172 kB per second
    DAC
    Digital Data Buffer
    "Magic"
    OS

    View Slide

  30. DAC Schemes
    DAC
    Digital Data Buffer #1
    OS
    Digital Data Buffer #2
    "Magic"
    1s

    View Slide

  31. Buffer Size - Latency
    ● Time taken = Max time to fill next buffer
    ● Time taken = Min time to new sound output
    Stereo = 2 channels

    View Slide

  32. Buffer Size - Latency
    Ideally we want....
    ● Fill up next buffer well before current is fully
    output. (No clicks/silence)
    ● Have no delay between audio being sent to
    the OS and output. (No buffering)

    View Slide

  33. Buffer Size - Latency
    Typical Buffer Sizes
    ● 256 * 2 * 2 = 1024 bytes = 5.8ms latency
    ● 512 *2 * 2 = 2048 byes = 11.6ms latency
    ● 1024 * 2 * 2 = 4096 byes = 23.2ms latency
    Assuming 2 channel stereo and 16bit depth

    View Slide

  34. Callback vs R/W IO
    Two common schemes for audio drivers.
    ● Read-Write
    ● Callback

    View Slide

  35. Read-Write
    ● Direct R/W access to "digital data buffer".
    ● Blocking
    ● PaError Pa_WriteStream ( PaStream *
    stream, void * buffer, long frames )
    ● PaError Pa_ReadStream ( PaStream *
    stream, void * buffer, long frames )

    View Slide

  36. Callback
    ● Callback when more data is needed.
    ● Non-Blocking
    ● PaError Pa_OpenStream (PaStream **
    stream, ... , double sampleRate, long
    framesPerBuffer, ... ,PaStreamCallback *
    streamCallback, void * userData)
    ● typedef int PaStreamCallback(const void
    *input, void *output, unsigned long
    frameCount, ... , void *userData)

    View Slide

  37. Read-Write Example - C
    // From http://portaudio.com/docs/v19-doxydocs/blocking_read_write.html
    err = Pa_Initialize();
    if( err != paNoError ) goto error;
    /* --SKIPPED-- -- Initalize Variables -- --SKIPPED-- */
    /* -- setup stream -- */
    err = Pa_OpenStream(
    &stream, &inputParameters,&outputParameters,
    SAMPLE_RATE,FRAMES_PER_BUFFER, paClipOff,
    NULL, /* no callback, use blocking API */
    NULL ); /* no callback, so no callback userData */
    /* -- start stream -- */
    err = Pa_StartStream( stream );
    printf("Wire on. Will run one minute.\n"); fflush(stdout);

    View Slide

  38. Read-Write Example - C
    /* -- Here's the loop where we pass data from input to output -- */
    for( i=0; i<(60*SAMPLE_RATE)/FRAMES_PER_BUFFER; ++i )
    {
    err = Pa_WriteStream( stream, sampleBlock, FRAMES_PER_BUFFER );
    err = Pa_ReadStream( stream, sampleBlock, FRAMES_PER_BUFFER );
    }
    /* -- Now we stop the stream -- */
    err = Pa_StopStream( stream );
    /* -- don't forget to cleanup! -- */
    err = Pa_CloseStream( stream );
    Pa_Terminate();
    return 0;
    }

    View Slide

  39. Callback Example - C
    // http://portaudio.com/docs/v19-doxydocs/paex__sine_8c_source.html
    err = Pa_Initialize();
    if( err != paNoError ) goto error;
    err = Pa_OpenStream( &stream,NULL,&outputParameters,
    SAMPLE_RATE, FRAMES_PER_BUFFER, paClipOff,
    patestCallback, &data );
    if( err != paNoError ) goto error;
    printf("Setup Done\n");
    err = Pa_SetStreamFinishedCallback( stream, &StreamFinished );
    err = Pa_StartStream( stream );
    printf("Play for %d seconds.\n", NUM_SECONDS );
    Pa_Sleep( NUM_SECONDS * 1000 );
    err = Pa_StopStream( stream );
    err = Pa_CloseStream( stream );
    Pa_Terminate();
    return err;

    View Slide

  40. Callback Example - C
    static int patestCallback( const void *inputBuffer, void *outputBuffer,
    unsigned long framesPerBuffer,
    const PaStreamCallbackTimeInfo* timeInfo,
    PaStreamCallbackFlags statusFlags,
    void *userData )
    {
    for( i=0; i*out++ = data->sine[data->left_phase]; /* left */
    *out++ = data->sine[data->right_phase]; /* right */
    data->left_phase += 1;
    if( data->left_phase >= TABLE_SIZE ) data->left_phase -=
    TABLE_SIZE;
    data->right_phase += 3;
    if( data->right_phase >= TABLE_SIZE ) data->right_phase -=
    TABLE_SIZE;
    }
    return paContinue;
    }

    View Slide

  41. Callback Example - AS3
    var mySound:Sound = new Sound();
    function sineWaveGenerator(event:SampleDataEvent):void {
    for ( var c:int=0; c<8192; c++ ) {
    event.data.writeFloat(Math.sin((Number(c+event.
    position)/Math.PI/2))*0.25);
    event.data.writeFloat(Math.sin((Number(c+event.
    position)/Math.PI/2))*0.25);
    }
    }
    mySound.addEventListener(SampleDataEvent.SAMPLE_DATA,
    sineWaveGenerator);
    mySound.play();

    View Slide

  42. Hands On

    View Slide