2026清大電機體驗營

目錄

傅立葉分析

傅立葉分析(Fourier Analysis)是電機工程領域中最重要的數學方法之一,它讓我們可以從頻率的角度來看世界。傅立葉分析的精神就是所有的訊號都可以拆成無限多個正弦(sine)波和餘弦(cosine)波的疊加,就像空間座標可以拆成(x, y, z)分量。任何週期性的訊號都可以寫成以下形式。假設週期為T,我們會定義基礎頻率(fundamental frequency, $\omega_0 = \frac{2\pi}{T}$)。

$$ f(x) = a_0 + \sum_{n=1}^\infty [a_n \cos(n\omega_0 t) + b_n \sin(n\omega_0 t)] $$

其中,係數$a_n$和$b_n$代表n倍基礎頻率($n_0$)的餘弦波和正弦波的強度。我們可以將他們對頻率作圖得到頻譜(spectrum),就像五線譜一樣顯示什麼頻率有訊號,什麼頻率沒有。那麼我們要怎麼找到$a_n$和$b_n$這些係數呢?答案是用向量內積(inner product)。對兩個週期性訊號做內積就是兩個訊號相乘取一個週期的平均。

$$ a_n = \frac{2}{T} \int_{0}^{T} f(t)cos(n\omega_0t) dx $$

那我們n要算到第幾個呢?只要算到訊號的頻寬(bandwidth)就好了。自然界的系統都有速度限制,例如:電線中的訊號無法無限快、人耳的耳蝸無法震動太高頻。這個最高可用頻率就叫頻寬。

取樣與量化

我們是工程師,所以除了理論上傅立葉怎麼算,我們更在乎實際上要怎麼用電腦算出來。在電腦的世界中,時間和數字都是一格一格(discrete)的。首先,電腦是利用位元(bit)來儲存資料。位元是電腦中最小的資料單位,一個位元的數值只可以是0或1。電腦中的位元數量有限,所以只能存下有限多種數值。因此,電腦能儲存的兩個數字之間會有一段無法儲存的數值,而必須四捨五入,這個動作稱作量化(quantization),並且會造成量化誤差。

電腦的運作是依照一個稱為時脈(clock)的訊號,電腦中所有的運算都在時脈由低變高的那一瞬間執行。因此,電腦只能看到這些瞬間的訊號的數值。這個動作稱為取樣(sampling)。

經過取樣和量化之後,就可以把資料存在電腦的記憶體裡面做計算了。電腦針對取樣過後的訊號做的傅立葉分析稱為離散傅立葉變換(DFT)。科學家(Cooley和Tukey)透過改變運算的順序,使得電腦算傅立葉分析變得更快,成為現今常用的快速傅立葉變換(FFT)演算法。

Nyquist取樣定理

取樣和量化會造成資料精確度的流失。量化誤差就像尺的最小刻度,我們只要使用更多位元就可以降低量化誤差。可是取樣造成的效應就比較玄一點。先說結論,科學家Nyquist推導出來只要取樣頻率(sampling frequency)比訊號的頻寬大兩倍以上,就可以完整地代表原本在連續時間中的訊號。

如果我們的取樣頻率太慢,就會出現混疊(aliasing)的效應。從取樣出來的數據點還原出來的訊號除了流失掉高頻的部分,還會出現原本不存在的頻率。

Serial Communication-SPI

我們無法拉上萬條線連接螢幕和電腦,所以我們須要在時間上切割這些資料。例如,一筆 1024 bit 的資料分成 4 份傳送,只需要 256 條線。如果把這件事作到極致,只用 1 條線傳送資料,就是串列通訊(serial communication)。 如果資料量很大,這條線上的電壓需要以非常高的頻率在0和1之間切換。一樣用上面的一張圖片 60kB 來算,如果每秒要有 24 禎,這條資料線要可以每秒變化 140 萬次(1.44 MHz)。雖然聽起來很快,但其實對現代電腦來說是一項輕鬆的工作。 除此之外,電腦和螢幕之間要講好用哪種語言溝通,這個大家說好的語言我們稱之為協議(protocol)。協議會規定需要幾條線、每條線的作用,以及每條線在時間上如何變化。

這個 project 的螢幕用的協議是 SPI(Serial Peripheral Interface),一共有四條訊號線:用於同步的時脈訊號(clock, SCLK),選擇是否啟用裝置的 chip select(CS),以及用來輸出、輸入資料的 MOSI (master out slave in), MISO (master in slave out)。Master負責下指令,控制 SCLK、CS 和 MOSI。Slave接收這三個訊號,並且透過 MISO 回覆 Master。Slave 收到 CS = 0 時才會工作,而資料的傳遞只會發生在 SCLK 改變的那瞬間,我們稱為邊緣觸發(edge triggered)。舉例來說,如果今天大家講好是 SCLK 從 0 變成 1 的那瞬間傳資料,這叫正緣觸發(rising edge triggered),此時 master 藉由 MOSI 輸出資料給 slave,同時藉由 MISO 接收 slave 傳來的資料。


訊號線 SCLK CS MOSI MISO
功能 資料同步 選擇是否啟用該slave master 傳給 slave slave 傳給 master


下圖是一次 SPI 傳輸期間四條訊號線的變化。首先,Master 會將 CS 由1變成0,通知 slave 要開始傳資料了。接下來,SCLK會開始變化,同時 MOSI 會把要傳的資料送出去。當 slave收到資料後,會依照指令透過 MISO 回應 master。

🎮 Flappy Bird 聲控遊戲使用說明


🔘 按鍵功能總覽

顏色 按鍵 功能
🟢 綠線(B5) btn1 開始遊戲 / 暫停遊戲 / 進入選單
🔵 藍線(B6) btn-rst 重置最高分
⚪ 灰線(B7) btn2 難度調整 / 結束遊戲

按鍵配置圖


🏠 Step 1 — 進入選單畫面

開機後會看到首頁畫面,
按下 btn1 可進入選單。

首頁畫面


⚙️ Step 2 — 選單功能與頻率偵測

在選單畫面中:

🎤 麥克風信號顏色說明

顏色 意義
⚪ 灰色 沒收到信號 / 訊號太弱 → 調整可變電阻
🟢 綠色 訊號正常
🔴 紅色 訊號過強 → 需調整麥克風可變電阻

選單畫面


🎮 Step 3 — 遊戲進行中

進入遊戲後:

遊戲畫面


📡 聲音控制機制

管子高度會依照接收到的聲音頻率即時變化:



>>> 遊戲原始碼 <<<

電路

電路學簡介:

運算放大器 (op amp):

Low Pass Filter:


二階系統的波德圖 ( 擷取自維基百科 )



利用KCL,得知
$$ \frac{V_{out}}{Zc} = \frac{Vin}{R+Zc} \Rightarrow V_{out} = \frac{Zc}{R+Zc} Vin ( Zc = \frac{1}{j \omega C} )$$ $$\Rightarrow Gain = \frac{V_{out}}{V_{in}}= \frac{1}{1+j \omega CR}$$ $$ \Rightarrow 取 1RC 為基準,$$ $$ \omega \ll /frac{1}{RC} ,gain = 1;$$ $$ \omega \gg \frac{1}{RC} ,gain = | \frac{1}{j \omega RC}|,取實數部分,可得 |\frac{1}{\omega RC}|$$ $$ \Rightarrow log| \frac{1}{ \omega RC}|=-log \omega -log RC$$

麥克風模組電路 deep dive

麥克風輸入

我們使用的麥克風是駐極式麥克風(electret microphone)。 在接收到聲音振動的時候,它內部會產生電壓的變化,並且透過一個場效應電晶體(field effect transistor)放大成為其輸出。

Electret condenser microphone schematic.png
CC BY-SA 3.0, Link

上圖是駐極式麥克風的示意電路圖,我們還需要在它的上方加一顆電阻,提供輸出電晶體所需要的偏壓電流(bias current)。 為了訊號的完整性,我們在麥克風的輸出用一顆運算放大器(operational amplifier或op-amp)做了一個電壓緩衝器(voltage buffer),如下圖所示。 在沒有聲音輸入的時候,偏壓電流和電阻會共同產生出一個直流電壓。 這一個電壓可能和後續放大器所需要的直流電壓不同,所以我們會再加上一顆電容來去除直流電壓差,只讓交流訊號通過。

訊號參考電位(signal ground)

我們的麥克風模組是採用3.3V供電,最低電位為0V,最高電位為3.3V。 因為電路元件的限制,所有的訊號都只能在這個範圍中。 可是聲音的波形有正有負要怎麼辦? 我們須要把麥克風產生出來的波形平移使得它的平衡點在這個範圍的正中間,也就是1.65V。

為了讓電路可以做到這件事,我們必須先產生一個穩定的1.65V。 我們先用一個1:1的電阻分壓,從3.3V供電得到目標的1.65V。 但是,如果有電流流入或流出1.65V的點,這個電壓會受到嚴重的擾動。 因此,我們再用一個op-amp組成的voltage buffer來讓這個點有承受電流流入或流出的能力,使電壓穩定。

這個1.65V是我們所有訊號的參考電位,如果今天有一個訊號的實際電壓是2.4V,那麼它的訊號數值其實是2.4 - 1.65 = 0.75V。

前級放大器(pre-amp)

因為麥克風輸出的訊號振幅很小,所以我們設計了一個增益(gain)10倍的放大器來放大訊號。 我們採用反向放大器的電路,除了振幅會放大10倍之外,還會把訊號的數值變成負的。 舉例來說,麥克風給出來的訊號假如是+0.1V的話,經過這個放大器得到的輸出會是-1.0V。 注意這邊的電壓都是相對1.65V的參考電位,所以實際上的電壓分別是1.75V和0.65V。

低通濾波器(low-pass filter)

為了降低麥克風的高頻雜訊以及後續取樣時高頻訊號造成的混疊(aliasing),我們必須降低高頻訊號的強度。 我們利用一個簡單的電阻電容低通濾波器,把-3dB截止頻率設定在723Hz。 在這個頻率之上,訊號振幅會和頻率呈反比衰減,也就是說到10000Hz以上的訊號會被壓制到原本的0.1倍以下。

可調放大器

我們設計了第二級的放大器,並且讓它的gain是可調的。 這個放大器採用非反向的架構,因此不會把訊號的數值變成負的。 放大器的gain是由電阻R7和可變電阻RV1的分壓所決定,可調的範圍從2倍到11倍。