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
87
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
71
DNSSEC and Bind
notthetup
1
110
Garageband And Podcasting
notthetup
0
37
Audio Fundamentals - HTML5 Audio
notthetup
0
88
Audio Fundamentals - Oscillators
notthetup
0
46
Robots and Pi
notthetup
2
120
Auralization of road vehicles using spectral modeling synthesis
notthetup
0
150
What I’ve learnt about Environmental Sound Design
notthetup
0
180
Audio Editing with Audacity
notthetup
0
46
Other Decks in Technology
See All in Technology
TSKaigi 2024 の登壇から広がったコミュニティ活動について
tsukuha
0
170
開発生産性向上! 育成を「改善」と捉えるエンジニア育成戦略
shoota
2
730
ネットワーク可視化の世界
likr
7
5.1k
LINEスキマニにおけるフロントエンド開発
lycorptech_jp
PRO
0
360
クレカ・銀行連携機能における “状態”との向き合い方 / SmartBank Engineer LT Event
smartbank
2
110
LINE Developersプロダクト(LIFF/LINE Login)におけるフロントエンド開発
lycorptech_jp
PRO
0
150
Oracle Cloud Infrastructure:2024年12月度サービス・アップデート
oracle4engineer
PRO
1
340
【re:Invent 2024 アプデ】 Prompt Routing の紹介
champ
1
280
10年もののバグを退治した話
n_seki
0
110
DevFest 2024 Incheon / Songdo - Compose UI 조합 심화
wisemuji
0
200
pg_bigmをRustで実装する(第50回PostgreSQLアンカンファレンス@オンライン 発表資料)
shinyakato_
0
120
[トレノケ雲の会 mod.13] 3回目のre:Inventで気づいたこと -CloudOperationsを添えて-
shintaro_fukatsu
0
110
Featured
See All Featured
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
1
120
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
29
2k
We Have a Design System, Now What?
morganepeng
51
7.3k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
226
22k
Designing on Purpose - Digital PM Summit 2013
jponch
116
7k
Fashionably flexible responsive web design (full day workshop)
malarkey
406
66k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
7
530
XXLCSS - How to scale CSS and keep your sanity
sugarenia
248
1.3M
Practical Orchestrator
shlominoach
186
10k
Build your cross-platform service in a week with App Engine
jlugia
229
18k
A Tale of Four Properties
chriscoyier
157
23k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
97
17k
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