Language

Monday, May 30, 2016

以頻率計數器來看 Undersampling

以頻率計數器來看 Undersampling

以頻率計數器來看 Undersampling

1 頻率計數器問題

想像一下你現在有一套嵌入式系統軟硬體,你只能偵測外部輸入是高或低電位(也就是 GPIO),你要測量外部的方波的頻率,你要怎麼達成呢?我想你能夠達成的就是,固定時間,比方說每隔 1 µs 「偵測」一次訊號位準是高或低,然後標定由低變高以及由高變低的地方,並且計算這個「由低變高」的週期,再轉換成頻率吧?你還能想到更簡單精準的方式嗎?歡迎來挑戰。

2 如何計算頻率?

Figure 1: 頻率計數

由圖 1 可以計算頻率,圖中黑色的方波是你要計算頻率的波形,而橘色的方波代表了你讀取外部 GPIO 值的時間點,綠色就是讀取到的值。\(T_0\) 是要計算的方波週期,從圖上的格子點來計算(假設一格是 1 µs),是 16 µs,\(T_s\) 是讀取 GPIO 的週期,是 4 µs,計算出來的頻率週期是 $Tc$,是 16 µs,就是訊號「看起來變回一週期同樣位置的」週期(為什麼強調這一點?因為要真正計算頻率,也是有點技巧的,這技巧叫做 frequency estimation,有機會再講,你的大腦比數學公式強多了,呵呵)

這裡 \(T_0 = T_c = 16 \mu s\) , 咦?可以精確的計算出來方波頻率呢。

我們改用頻率來看這些數值 \(F_0 = F_c = \frac{1}{T_0} = \frac{1}{T_c} = 62500 Hz = 62.5 kHz, F_s = \frac{1}{T_s} = 250000 Hz = 250 kHz\)

3 這跟取樣有什麼關係?

啊,這就是取樣啊,取樣就是這麼單純的一件事。「用同樣的頻率去觀察這個世界」,就是取樣的基本意義。上一篇文章「淺談取樣定理」就是在闡述這件事,所以,用固定的週期,去觀察 GPIO 的值,你說他跟取樣定理沒關係嗎?錯啦,他就是取樣定理的一個應用,所以取樣定理的 Nyquist rate 一樣會應用在這個過程中。所以 \(F_s \ge 2 * F_c\) 所以可以成功的取樣完整的訊號,等等,好像哪裡不對吧?先別說這個了,我們來看萬一你的計數頻率低於要偵測的頻率怎麼辦。

4 如果你的計數頻率低於要偵測的頻率呢?

如果你要計數的頻率低於要偵測的頻率,會發生什麼事呢?按照前面的流程,我們就畫一下波形來看看。

ZeroCrossingUnderSampling.jpeg

Figure 2: 頻率計數 Undersampling

2 就是 undersampling 的情況,一樣黑色方波是要計算頻率的波形,而橘色方波代表讀取外部 GPIO 值的時間點,綠色就是讀到的值。

\(T_0 = 4 \mu s, T_s = 6 \mu s, T_c = 12 \mu s\)

換算成頻率

\(F_0 = 250 kHz, F_s = 166.667 kHz, F_c = 83.333 kHz\)

哇,你說這怪怪的吧,我原本的頻率是 250 kHz,取樣後變成 83.333 kHz,你說,啊對,因為低於 Nyquist rate,所以無法取樣到正確的頻率,所以把這個資訊丟棄吧!不,這個資訊還是有用的,這個是低於 Nyquist rate 的時候,會看到的現象。在這裡,因為你在方波的正緣與負緣都取樣,所以其實真正的取樣率 $Fs = 333.333 kHz$,這就是上一節怪怪的地方(有看出來嗎?)我為什麼這麼做呢?因為在某些數位的計數器就是這麼做的,正緣與負緣都偵測一次,如果值改變了,就累計一次,沒改變就不累計。這種情況下的取樣頻率你要乘以二。

好啦,重點來了,\(F_s - F_0 = 333.333 - 250 = 83.333 kHz\) ,這巧合吧,你說。再次有圖有真相,我們來畫圖。

FrequencyAmbiguity.jpeg

Figure 3: Frequency Ambiguity

3 是我們常見的取樣圖形化分析方式1, \(F_0\) 是你觀察的訊號,他的頻率高於 \(\frac{F_s}{2}\) 。取樣後我們能看到的頻率範圍只有橘色所框住的 \([-\frac{F_s}{2}, \frac{F_s}{2}]\) 而已,所以高於 \(\frac{F_s}{2}\) 的我們就畫一條水平線,看他與橘色範圍的三角形交叉的點在哪裡,計算其頻率,那就是你取樣後的頻率。在我們這個例子中可以看到 $Fc < 0$,計算出來是 $Fc = F0 - Fs = 250 - 333.333 = -83.333 kHz$,先不看正負號,週期跟圖 2 算出來是一樣的吧?負號只是影響相位而已,不影響頻率。

5 結語

筆者發現每次寫部落格文章,最頭痛的就是畫出那精美的圖形,本來用 Python matplotlib 已經夠簡單了,不過還是要花點時間,所以部落格文章發表都拖很久,從這篇文章開始,筆者改用手繪!讓大家看到我醜醜的手寫字真是有點不好意思,不過這樣子可以發文章發得比較快一些。本篇就是承襲上一篇文章的取樣定理,在嵌入式系統或是數位設計常常會遇到的計數器問題上舉個例子,讓大家看看取樣定理是怎麼應用的,其實很常見啊,不是只有你在接收 ADC 傳進來的資料才會遇到喔!希望大家喜歡今天的文章!

Footnotes:

1

參見 Richard G. Lyons, "Understanding Digital Signal Processing," 3ed, Prentice-Hall, 2011.

Author: Albert Huang

Created: 2016-05-30 Mon 22:02

Validate

1 comment:

謝正經 said...

無限期支持手寫字. :)