Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
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
100
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
75
DNSSEC and Bind
notthetup
1
130
Garageband And Podcasting
notthetup
0
50
Audio Fundamentals - HTML5 Audio
notthetup
0
99
Audio Fundamentals - Oscillators
notthetup
0
48
Robots and Pi
notthetup
2
120
Auralization of road vehicles using spectral modeling synthesis
notthetup
0
180
What I’ve learnt about Environmental Sound Design
notthetup
0
210
Audio Editing with Audacity
notthetup
0
55
Other Decks in Technology
See All in Technology
250627 関西Ruby会議08 前夜祭 RejectKaigi「DJ on Ruby Ver.0.1」
msykd
PRO
2
240
CSS、JSをHTMLテンプレートにまとめるフロントエンド戦略
d120145
0
280
急成長を支える基盤作り〜地道な改善からコツコツと〜 #cre_meetup
stefafafan
0
120
20250625 Snowflake Summit 2025活用事例 レポート / Nowcast Snowflake Summit 2025 Case Study Report
kkuv
1
290
Agentic Workflowという選択肢を考える
tkikuchi1002
1
480
データプラットフォーム技術におけるメダリオンアーキテクチャという考え方/DataPlatformWithMedallionArchitecture
smdmts
5
620
A2Aのクライアントを自作する
rynsuke
1
170
[TechNight #90-1] 本当に使える?ZDMの新機能を実践検証してみた
oracle4engineer
PRO
3
170
TechLION vol.41~MySQLユーザ会のほうから来ました / techlion41_mysql
sakaik
0
180
本当に使える?AutoUpgrade の新機能を実践検証してみた
oracle4engineer
PRO
1
140
ハノーバーメッセ2025座談会.pdf
iotcomjpadmin
0
160
Welcome to the LLM Club
koic
0
160
Featured
See All Featured
Statistics for Hackers
jakevdp
799
220k
Rails Girls Zürich Keynote
gr2m
94
14k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
44
2.4k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
252
21k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
667
120k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
32
2.3k
Designing for humans not robots
tammielis
253
25k
The Language of Interfaces
destraynor
158
25k
Fashionably flexible responsive web design (full day workshop)
malarkey
407
66k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
8
670
A designer walks into a library…
pauljervisheath
206
24k
Building Better People: How to give real-time feedback that sticks.
wjessup
367
19k
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