IF Sampling 原理

  在介紹 RTL-SDR 的文章中,提到 RTL-SDR 是將 RF 訊號 down-convert 到中頻 (IF,intermediate frequency),再對中頻的訊號取樣。我有一個疑惑:對中頻訊號的取樣和對基頻訊號的取樣不一樣,並不限於一般的 Nyquist sampling theorem,那應該滿足什麼條件?這篇文章就來講解對中頻訊號取樣的原理。

原理

  在 Ziemer 和 Tranter 的教科書 Principles of Communications 中提到,對帶通訊號取樣,要避免 aliasing 須滿足以下條件(作者稱為 uniform sampling theorem for bandpass spectra):


如果訊號的 RF 頻寬為 $W$ 且頻率上限為 $f_u$,則取樣率可以為 $2f_u / m$,其中 $m = \lfloor f_u / W\rfloor$。更高的取樣率也不保證 aliasing-free,除非高於 $2f_u$。


  這稱為 undersampling 或是 sub-sampling。假設經過取樣後,並無 aliasing 的情況,且帶通訊號成分在 $f_c - W/2 = f_u - W$ 到 $f_c + W/2 = f_u$ 之間。還記得取樣後的頻譜,等於原本頻譜以 $f_s$ 為週期的複製貼上 (shifted replica),所以只要知道 $0$ ~ $f_s / 2$ 之間的頻譜情形,就可以得知是否產生 aliasing。


  現在,假設最靠近 DC 的 replica 位於 $f > 0$ 的區間 $\left[-m f_s + f_u - W, -m f_s + f_u\right]$,即是向左位移 $mf_s$ 的 replica。為了必免在 DC 發生 aliasing,

$$
\begin{align}
-m f_s + f_u - W &\geq 0\\[10pt]
f_s &\leq \frac{f_u - W}{m}
\end{align}
$$

  也為了避免在 $f = f_s/2$ 附近造成 aliasing,

$$
\begin{align}
-m f_s + f_u &\leq f_s / 2\\[10pt]
f_s &\geq \frac{2f_u}{2m + 1}
\end{align}
$$

  且 $W \leq f_s / 2$。滿足這兩個不等式的 $f_s$ 就是合格的取樣率。注意到如果滿足不等式的 $f_s$ 存在,則

$$
\frac{f_u - W}{m} \geq \frac{2f_u}{2m + 1}
$$

  整理得到

$$
\begin{align}
W \leq \frac{f_u}{2m + 1} &\Longrightarrow 2m + 1 \leq \frac{f_u}{W}\\[10pt]
&\Longrightarrow 2m + 1 \leq \lfloor \frac{f_u}{W}\rfloor
\end{align}
$$

  令 $n = \lfloor \frac{f_u}{W}\rfloor$,可以得到取樣率的最低合格範圍:

$$
\begin{align}
\frac{2f_u}{n} \leq f_s \leq \frac{2(f_u - W)}{n - 1}
\end{align}
$$

  實際上,上式不一定要取最大的 $2m + 1$,因此可以取 $\left[1, n\right]$ 之間的任意奇數,得到的區間都是合格的取樣率範圍。


  上面討論的是沒有發生 spectrum inversion 的情況,不過 spectrum inversion 的思路也是類似的。IF sampling 得到的訊號,其頻率成分實際上已經轉換到相對低頻,因此可以用 DDC 再將訊號轉換到基頻,結束 down-conversion 的旅程。回顧 RTL-SDR 的例子,取樣率為 2.56 M sa/s,最大 RF 頻寬為 $W$ = 1.28 MHz,但是以最高頻率 $f_u = f_c + W / 2 = 3.57 + 0.64 = 4.21$ MHz 來說,這個取樣率太低,因此要嘛調整取樣率,要嘛限制訊號頻寬。

模擬

  我們以 MATLAB 模擬來驗證上述的說法。假設目標訊號為 1000 Hz 的弦波乘上寬度為 10 ms 的方波,對應到頻域就是主瓣寬度為 200 Hz 的 sinc 函數。在這個例子中,$f_u$ = 1100 Hz,$W$ = 200 Hz,$n = \lfloor f_u / W\rfloor$ = 5,對應到的取樣率範圍為 440 ~ 450 Hz。我們取 442.5 Hz 作為取樣率。(不要問我為什麼取這個數字,問就是產出來的圖比較好看。)


  模擬的程式碼如下,模擬結果如圖A所示。圖A上半部為取樣前的頻譜,下半部為取樣後頻譜,可以看到取樣後的頻譜基本上是沒有 aliasing 的(忽略 sinc 的旁瓣)。程式中對取樣訊號作 upsample 是為了呈現取樣後頻譜以 $f_s$ 為週期重複的特性。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
% This program simulates sub-sampling.
%
% Author: Raymond Su, raymondsu0110@gmail.com

clear

% ===== settings ===== %
dt = 1e-6; % time resolution of this simulation, freq span = 500 kHz
fs = 442.5; % sampling frequency, in Hz
f0 = 1000; % intermediate frequency, in Hz
T = 10000; % width of square pulse, in us
Ns = round(1 / fs / dt); % sampling period normalized with "simulation" sampling period

% ===== sig generation ===== %
pulse_duration = 0: dt: dt * T - dt; % duration of the square pulse

pulse = cos(2 * pi * f0 * pulse_duration);
x = [zeros(1, 2 * length(pulse)), pulse, zeros(1, 2 * length(pulse))];
Nsample1 = length(x);

y = x(1: Ns: end);
y = upsample(y, Ns);
Nsample2 = length(y);

% ===== presentation ===== %
X = fftshift(fft(x)) * dt; % dt = 1 / simulation_sampling_frequency
f1 = -0.5 / dt: 1 / dt / Nsample1: 0.5 / dt - 1 / Nsample1;
Y = fftshift(fft(y)) * Ns * dt;
f2 = -0.5 / dt: 1 / dt / Nsample2: 0.5 / dt - 1 / Nsample2;

figure();
subplot(2, 1, 1);
plot(f1, abs(X), "b-", "LineWidth", 2);
xlim([-2000 2000]); ylim([0 0.007]);
xlabel("frequency (Hz)"); ylabel("spectrum (abs)");
title("original signal spectrum");

subplot(2, 1, 2);
plot(f2, abs(Y), "r-", "LineWidth", 2);
xlim([-2000 2000]); ylim([0 0.007]);
xlabel("frequency (Hz)"); ylabel("spectrum (abs)");
title("sub-sampled spectrum, f_s = 440 Hz");

clear
圖A,sub-sampling 的模擬結果。

結語

  一般教科書提及取樣定理,都是指對基頻訊號的取樣,對帶通訊號取樣的理論則是草草帶過。本文對帶通訊號的取樣原理提出解釋,並且以 MATLAB 模擬證實該理論。實際應用上,由於 ADC 時脈的增加,在一些硬體上高達幾十 G sa/s,因此也有不少系統是採用 RF 直接取樣,一個 ADC 就有 mixer + sampler 的功能,這時候本文的解說就可以派上用場。

參考資料

[1] Wikipedia, “Undersampling”. Available: https://en.wikipedia.org/wiki/Undersampling

[2] electronics.stackexchange.com (forum), “ADC Input Frequency Bandwidth and Sampling Frequency”. Available: https://electronics.stackexchange.com/questions/601248/adc-input-frequency-bandwidth-and-sampling-frequency