Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Audio Fundamentals - Basics
Search
Chinmay Pendharkar
May 10, 2013
Technology
0
120
Audio Fundamentals - Basics
Slides for a workshop on audio fundamentals.
Chinmay Pendharkar
May 10, 2013
Tweet
Share
More Decks by Chinmay Pendharkar
See All by Chinmay Pendharkar
Audio Fundamentals - Pd
notthetup
0
95
DNSSEC and Bind
notthetup
1
150
Garageband And Podcasting
notthetup
0
56
Audio Fundamentals - HTML5 Audio
notthetup
0
110
Audio Fundamentals - Oscillators
notthetup
0
58
Robots and Pi
notthetup
2
120
Auralization of road vehicles using spectral modeling synthesis
notthetup
0
200
What I’ve learnt about Environmental Sound Design
notthetup
0
240
Audio Editing with Audacity
notthetup
0
70
Other Decks in Technology
See All in Technology
たかが特別な時間の終わり / It's Only the End of Special Time
watany
27
6.5k
会社紹介資料 / Sansan Company Profile
sansan33
PRO
11
390k
研究開発部メンバーの働き⽅ / Sansan R&D Profile
sansan33
PRO
3
21k
AI時代の開発フローとともに気を付けたいこと
kkamegawa
0
790
エンジニアリングマネージャー はじめての目標設定と評価
halkt
0
110
Agents IA : la nouvelle frontière des LLMs (Tech.Rocks Summit 2025)
glaforge
0
430
21st ACRi Webinar - AMD Presentation Slide (Nao Sumikawa)
nao_sumikawa
0
230
タグ付きユニオン型を便利に使うテクニックとその注意点
uhyo
2
710
Bill One 開発エンジニア 紹介資料
sansan33
PRO
4
16k
[JAWS-UG 横浜支部 #91]DevOps Agent vs CloudWatch Investigations -比較と実践-
sh_fk2
1
110
形式手法特論:CEGAR を用いたモデル検査の状態空間削減 #kernelvm / Kernel VM Study Hokuriku Part 8
ytaka23
2
330
Master Dataグループ紹介資料
sansan33
PRO
1
4k
Featured
See All Featured
Designing for humans not robots
tammielis
254
26k
Git: the NoSQL Database
bkeepers
PRO
432
66k
[RailsConf 2023] Rails as a piece of cake
palkan
58
6.1k
Become a Pro
speakerdeck
PRO
30
5.7k
Facilitating Awesome Meetings
lara
57
6.7k
The World Runs on Bad Software
bkeepers
PRO
72
12k
The Language of Interfaces
destraynor
162
25k
What’s in a name? Adding method to the madness
productmarketing
PRO
24
3.8k
Testing 201, or: Great Expectations
jmmastey
46
7.8k
Build your cross-platform service in a week with App Engine
jlugia
234
18k
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
1
86
Side Projects
sachag
455
43k
Transcript
Audio Fundamentals Chinmay Pendharkar, Sonoport, 2013
None
Sound Waves
Analog vs Digital Audio
Analog vs Digital Audio
Digitization
Digitization - Why? • Easier to manipulate digital audio •
Easier to store digital audio • Easier to transport digital audio • Get back perfect original analog audio
Digital Audio Analog Audio Analog - Digital Conversion Digital -
Analog Conversion Digital Audio
Sampling Frequency
Sampling Frequency
Sampling Theorem
Sampling Theorem
Sampling Theorem 2 x (Max Frequency of Content) ≤ Sampling
Frequency for perfect reconstruction of analog signal from digital
Sampling Frequency 2 x (Max Frequency of Content) ≤ Sampling
Frequency. 2 x ( 20000 Hz ) ≤ 44100 Hz . Upper Limit of Human Hearing
Sampling • Sampling Frequency > 44100 : Oversampling • Sampling
Frequency < 44100 : Undersampling • 44100Hz => ◦ 44100 samples per second ◦ 44100 data points per second • Less computation vs Audio Fidelity
Quantization / Bit Depth uint_16
Quantization 0x0000 (0) 0xFFFF (65535) 96dBFS ~ 120dB Human Hearing
Range 65535 65534 65533 65532 0
Digital Audio Discretization of Time - Sampling Discretization of Amplitude
- Quantization
Digital Audio Common Formats: Sampling Rate : 44100 Hz Bit
Depth : 16 bits Sampling Rate : 192000 Hz Bit Depth : 24 bits "CD Audio" "Mastering Quality"
Digital Audio Formats • Uncompressed ◦ AIFF ◦ WAV •
Compressed (Lossless) ◦ FLAC ◦ ALAC • Compressed (Lossy) ◦ MP3 ◦ AAC
Real Time Audio on PC/Mac
Audio Stacks Audio Hardware Drivers Operating System Audio API User
Program/Application
Audio Stack - Windows
Audio Stack - OSX/iOS
Audio Stack - Linux
Audio Stack - Android
Audio Stacks Audio Hardware Drivers Operating System Audio API User
Program/Application
Audio Stack Audio Hardware DAC Digital Analog Converter
Audio Stacks 44.1kHz / 16bits ~= 172 kB per second
DAC Digital Data Buffer "Magic" OS
DAC Schemes DAC Digital Data Buffer #1 OS Digital Data
Buffer #2 "Magic" 1s
Buffer Size - Latency • Time taken = Max time
to fill next buffer • Time taken = Min time to new sound output Stereo = 2 channels
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)
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
Callback vs R/W IO Two common schemes for audio drivers.
• Read-Write • Callback
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 )
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)
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);
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; }
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;
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<framesPerBuffer; 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; }
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();
Hands On