JOVANA
Library Glossary Getting Started Three Levels Fields How it works Mission
Join the mission
All guides

從類比到取樣:數位訊號處理究竟在做什麼

你的聲音是一道平滑起伏的電壓,但手機卻把它存成一串普通的數字——而播出來竟然還是你。本篇為數位訊號處理(DSP)這條學習路徑揭開序幕,跟著一段聲音從麥克風走到喇叭,把「聲音即數學」這件神奇的事,變成你能想像、能數、能推理的東西。

世界是類比的,電腦卻不是

說出一個字,你就把一道壓力波推進空氣裡。麥克風感受到這道波,回應出一個與它完全同步起伏的電壓——聲音越大,擺幅越大;音調越高,抖動越快。這個電壓是連續的:它在每一個瞬間都存在,而任何兩個時刻之間,永遠還有另一個時刻,帶著自己精確的數值。這正是工程師所說的「類比」訊號——一個平滑變化的量,就像你傾斜杯子時水面的高低。

電腦容不下這種東西。它的記憶體是一格格非開即關的開關——它只能存數字,而且一次只能存有限的一串。所以在任何軟體碰到你的聲音之前,我們得面對兩項無可迴避的退讓。第一,我們不能再假裝自己知道*每一個*瞬間的電壓,而只能在選定的時刻偷看它一眼。第二,每一次偷看到的值,都得四捨五入到機器真正能寫下來的一份固定選單中的某個數字。這兩個動作——時間上的[[sampling|取樣]]與數值上的[[quantization|量化]]——就是從類比世界通往數位世界的整座橋。

跟著一段聲音:ADC → DSP → DAC 的流水線

想像手機上的一則語音備忘錄,再想像它被播放出來。在你的嘴與你的耳之間,這段聲音會經過三道關卡;而地球上幾乎每一個數位音訊裝置——耳機、助聽器、吉他效果器、數據機——都是沿著這同一條脊椎搭起來的。

  1. 擷取與數位化。 麥克風把壓力變成連續電壓,接著由[[analog-to-digital-converter|類比數位轉換器(ADC)]]每秒對這個電壓取樣數千次,把每個取樣值四捨五入成一個數字。輸出的,是一串樸素的整數。
  2. 處理。 軟體——或一顆專用的[[ee-dsp-processor|DSP 處理器]]——對這串數字做運算:增強低音、消除嘶聲、壓縮音量。這就是「數位訊號處理」裡的那個「處理」:訊號如今只是資料,而我們用數學把它重新塑形。
  3. 重建與播放。 一顆[[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 )        |  ANALOG
標準的音訊鏈。中間段是唯一「數位」的部分——一串整數 x[n]——也是 DSP 唯一棲身之處。

x[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
取樣在平滑的類比曲線下方鋪上一排刻度;x[n] 只留下曲線與刻度相交的那些點。

量化:四捨五入到一份有限的階梯選單

取樣切碎了時間,但每個擷取到的值仍是帶著無盡小數的實數。電腦存不下「無盡」,所以 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 處理器]]如何即時把這一切算完。但這一切,都始於你現在已經懂得的那個安靜的動作——把一道起伏的電壓,化成一串數字,然後信任數學去完成其餘的事。