世界是類比的,電腦卻不是
說出一個字,你就把一道壓力波推進空氣裡。麥克風感受到這道波,回應出一個與它完全同步起伏的電壓——聲音越大,擺幅越大;音調越高,抖動越快。這個電壓是連續的:它在每一個瞬間都存在,而任何兩個時刻之間,永遠還有另一個時刻,帶著自己精確的數值。這正是工程師所說的「類比」訊號——一個平滑變化的量,就像你傾斜杯子時水面的高低。
電腦容不下這種東西。它的記憶體是一格格非開即關的開關——它只能存數字,而且一次只能存有限的一串。所以在任何軟體碰到你的聲音之前,我們得面對兩項無可迴避的退讓。第一,我們不能再假裝自己知道*每一個*瞬間的電壓,而只能在選定的時刻偷看它一眼。第二,每一次偷看到的值,都得四捨五入到機器真正能寫下來的一份固定選單中的某個數字。這兩個動作——時間上的[[sampling|取樣]]與數值上的[[quantization|量化]]——就是從類比世界通往數位世界的整座橋。
跟著一段聲音:ADC → DSP → DAC 的流水線
想像手機上的一則語音備忘錄,再想像它被播放出來。在你的嘴與你的耳之間,這段聲音會經過三道關卡;而地球上幾乎每一個數位音訊裝置——耳機、助聽器、吉他效果器、數據機——都是沿著這同一條脊椎搭起來的。
- 擷取與數位化。 麥克風把壓力變成連續電壓,接著由[[analog-to-digital-converter|類比數位轉換器(ADC)]]每秒對這個電壓取樣數千次,把每個取樣值四捨五入成一個數字。輸出的,是一串樸素的整數。
- 處理。 軟體——或一顆專用的[[ee-dsp-processor|DSP 處理器]]——對這串數字做運算:增強低音、消除嘶聲、壓縮音量。這就是「數位訊號處理」裡的那個「處理」:訊號如今只是資料,而我們用數學把它重新塑形。
- 重建與播放。 一顆[[digital-to-analog-converter|數位類比轉換器(DAC)]]把數字變回階梯狀的電壓,再由一個溫和的濾波器把階梯抹平成連續的波形,去推動喇叭,於是你的耳朵又聽見聲音。
sound ~~~ continuous voltage numbers ~~~ sound
pressure / \ | x[n] = 5, 7, 6, 2, -3, -8 ... / \
((( ))) -> | mic | -> [ADC] -> [ DSP: do math ] -> [DAC] -> | spk | -> ((( )))
\___/ sample + (filter, gain, smooth \___/
analog quantize echo, mix...) + analog
output
ANALOG | D I G I T A L ( just integers ) | ANALOGx[n]:把訊號當成一串數字
接下來是這整條路徑的核心想法。經過 ADC 之後,訊號不再是一條曲線——而是一個序列:第 0 號取樣、然後第 1 號、再來第 2 號,以固定的時間步伐向前行進。我們把它寫成 x[n],唸作「x of n」,其中 n 只是「第幾號取樣」的整數編號。x[0] 是第一個值,x[1] 是下一個,x[100] 是第一百零一個。這就是一個[[ee-discrete-time-signal|離散時間訊號]]——它只在刻度上有值;問「x 在 n = 3.5 時是多少?」是個沒有答案的問題,因為我們根本沒在那裡看過。
n 每走一步,就對應一段固定的真實時間 T,也就是*取樣週期*。若 T = 1/44100 秒,則第 n 號取樣發生在 n·T 秒。T 的另一面是取樣率 f = 1/T,以赫茲為單位:我們每秒抓下幾張快照。以 CD 音質而言,f = 44.1 kHz——每聲道每秒 44,100 個數字。這也是為什麼一分鐘的立體聲 CD 音訊大約是 44100 × 60 × 2 ≈ 530 萬個取樣。
voltage
^
| .--. o = the samples x[n]
| o' `o. .o. (a value at each tick)
| o' `o. o' `o
| o' `o.o `o.
--+--o----o----o----o----o----o----o---> time
| 0 1 2 3 4 5 6 = n (sample index)
| <-T-> T = 1/f (sampling period)
x[n] = { x[0], x[1], x[2], ... } = a plain list of numbers, nothing more量化:四捨五入到一份有限的階梯選單
取樣切碎了時間,但每個擷取到的值仍是帶著無盡小數的實數。電腦存不下「無盡」,所以 ADC 還會把每個取樣值四捨五入到一道固定階梯上最近的那一階。階數由位元深度決定。用 b 個位元,你會得到 2^b 階:8 位元給 256 階,而 CD 音訊的 16 位元給 2^16 = 65,536 階。電壓範圍被切成這麼多等寬的步級,每個取樣都被「吸附」到最近的一級。
這種「吸附」永遠不會完全準確——真實值與你落腳那一階之間的微小縫隙,就是量化誤差,它在播出的聲音裡化作一陣若有似無的背景嘶聲。位元越多,階距越細,誤差越小,嘶聲越輕。這由[[signal-to-noise-ratio|訊號雜訊比]]來衡量:大致上,每多一個位元,就為你換來約 6 dB 的 SNR。十六位元約給出 96 dB——大約是耳語與噴射引擎之間的差距——這正是 CD 音訊在人耳聽來如此乾淨的原因。
levels 3-bit example: 8 rungs (000..111)
111 |- - - - - - o - - - - - - - - - true value 5.4 --> rounds to 5
110 |- - - - o - - - o - - - - - - - true value 5.4 stored as 101
101 |- - o - - - - - - - o - - - - - |
100 |o - - - - - - - - - - o - - - - 5.4
011 |- - - - - - - - - - - - o - o - rung -> 5 .... error = 0.4
010 |- - - - - - - - - - - - - o - - (this leftover 0.4 IS the noise)
001 |- - - - - - - - - - - - - - - -
000 |________________________________> n
each sample must land on a rung; the leftover is quantization error何必這麼麻煩?數學勝過運算放大器
有一個世紀之久,訊號都純粹在類比領域裡被塑形:電阻、電容、電感與運算放大器接成電路。要濾掉一陣交流嗡聲,你得搭出一個實體網路,其元件值*本身就是*那個濾波器。它運作得很漂亮——但這些值會隨溫度、隨老化、隨生產線的運氣而漂移;而且想改設計,就得拿起烙鐵把電路板重做。
一旦訊號變成 x[n],濾波器就從一個網路變成一道公式——幾行對取樣值做乘法與加法的程式碼。這帶來類比鮮少能匹敵的能力:它精確且可重現(數字永不漂移)、靈活(改個常數就換濾波器,而非動硬體)、能做出類比毫無對應的效果(完美線性相位、無限精度的回音),而且輕鬆可複製(一百萬支手機跑著一模一樣的程式碼)。代價是兩端的 ADC 與 DAC,外加一筆延遲與運算的開銷。對絕大多數現代音訊、通訊與感測系統而言,這筆交易是壓倒性的勝利——這正是 DSP 為何悄悄地在你擁有的幾乎每樣東西裡運轉。
你之後處處會用到的詞彙
這條路徑往後的每一階,都倚靠你剛認識的這幾個詞。[[ee-discrete-time-signal|離散時間訊號]] x[n] 是我們操弄的對象;以 f = 1/T 的速率[[sampling|取樣]]是它的出身;在給定位元深度下的[[quantization|量化]]是它帶著一點雜訊的原因;[[analog-to-digital-converter|ADC]] 與 [[digital-to-analog-converter|DAC]] 是進出的兩道門;而 [[signal-to-noise-ratio|SNR]] 是衡量結果多乾淨的尺。牢牢握住這幾個詞,DSP 的其餘部分就化為一套巧妙的食譜,專門用來重新塑形 x[n]。
從這裡開始,這條路徑層層往上:你*至少*得取樣多快才能不漏掉任何東西、如何對取樣值做加法與乘法以建出真正的濾波器、如何看見一段訊號裡隱藏的頻率,最後是一顆[[ee-dsp-processor|DSP 處理器]]如何即時把這一切算完。但這一切,都始於你現在已經懂得的那個安靜的動作——把一道起伏的電壓,化成一串數字,然後信任數學去完成其餘的事。