1. FSK調制原理
我們知道FSK的調制的時域表達式為:
其中\(I_n=\pm 1, \pm3, \cdots, \pm(M-1)\)為數字映射信息,\(f_d\)為載波調制頻率偏移量。FSK調制通過\(I_nf_d\)來傳達要傳輸的數字信息,但是在FSK調制連續數字信息時,頻率的突發式切換帶來了載波相位的不連續性,導致調制信號頻譜旁瓣過大,頻譜利用率低。所以后來提出了連續相位頻移鍵控(Continuous Phase Frequency Shift Keying, CPFSK)。
為了表示CPFSK信號,以PAM信號:
開始,式中\(I_{n}\)表示幅度序列,它是由信息序列\({a_{n}}\)來的\(k\)比特二進制數字組映射到幅度電平\(I_{n} = \pm 1, \pm 3, \cdots, \pm(M-1)\)得到的。而\(g(t)\)是一個幅度為 \(1/2T\) 且持續時間為\(T\)秒的矩形脈沖。信號\(d(t)\)用來對載波進行頻率調制,調制之后的載波信號可以表示為:
其中,\(f_{c}\)表示載波頻率,\(\phi_{0}\)表示載波的初始相位,\(\phi(t,I)\)為載波隨時間變化所對應的相位,可以表示為:
式中\(f_{d}\)表示峰值頻率偏移,\(d(t)\)信號是不連續的,但是其積分是連續的(注,式中的"\(4\)"單純是為了后續的計算方便添加的,因為可以把矩形脈沖幅度里面的1/2抵消掉,然后恰好可以把"\(4\pi\)"變成"\(2\pi\)",使之能夠滿足角頻率與頻率的轉換關系)。所以載波的相位變化是連續的,調制后載波信號的相位在時間區間\([nT,(n+1)T]\) 可以表示為:
式中,\(h\)表示調制指數,調制指數越大,調制后的兩個載波頻率差值越大;\(\theta_{n}\)是時間區間\([0,(n-1)T]\)內的累積相位,\(q(t)\)為相位響應函數,是頻率成形濾波器\(g_{T}(t)\)的積分,它們可以表示為:
CPFSK調制是用將要發送的基帶數據控制一個單一頻率的載波,載波的相位變化是連續的,有效地抑制了頻譜旁瓣,調制后信號的帶寬變窄。
2. GFSK調制原理
為了進一步降低CPFSK調制信號的頻譜旁瓣,首先要對發送的二進制信號映射的矩形脈沖進行高斯低通濾波,然后將濾波后的信號進行載波調制,這種調制技術稱為GFSK。GFSK調制信號的包絡恆幅、功率譜集中、抗干擾能力強,同時GFSK調制技術實現簡單,在低速率設備以及低成本無線傳感網絡中,應用廣泛。
高斯濾波器的帶寬影響着GFSK調制信號的頻譜,所以高斯濾波器的3dB帶寬和二進制碼元周期T的乘積BT是高斯濾波器的主要參數,BT取值越小,脈沖響應持續的時間越長,在實際設計中,通常將脈沖響應的持續時間根據需要進行截斷,以便數字電路實現。
高斯濾波器的沖激響應表達式為:
式中
假設輸入信號\(x(t)\)是要發送的二進制數據所對應的雙極性方波,雙極性方波經過高斯濾波器后的輸出為:
上式中,矩形脈沖定義為:
經過推導得出表達式:
式中,Q函數為:
假設序列x(n)是對輸入信號x(t)的離散時間采樣,是雙極性不歸零碼,則GFSK調制后信號的相位表達式為:
GFSK調制信號在載波頻率為\(f_{c}\)時的表達式為:
總結:其實GFSK是在CPFSK的基礎上對矩形脈沖進行了高斯濾波。從最后的結果來看其實就是將卷積矩形脈沖修改為卷積“矩形脈沖經過高斯濾波器之后的脈沖”。
3. GFSK的MATLAB代碼實現
首先實現“經過高斯濾波的矩形脈沖”,也即是式\((2.5)\)中的\(g(t)\)。
function [Gaussian_filter_q] = Gaussian_filter(B, symb_rate, delay, ts)
% INPUTS:
% B : the 3dB bandwidth of Gaussian filter
% symb_rate : rate of the symbol, in ble it is 1e6 symbol/s
% delay : it controls how many symbols the Gaussian filter cover
% ts : the reciprocal of sample rate
symb_T = 1 / symb_rate;
Gau_t = -delay*symb_T:ts:delay*symb_T;
K = 2*pi*B / sqrt(log(2));
Gau_det = K.*(Gau_t - symb_T / 2);
Gau_sum = K.*(Gau_t + symb_T / 2);
Gaussian_filter_q = 1/(2*symb_T)*[qfunc(Gau_det)-qfunc(Gau_sum)];
end
然后設定參數進行測試:
clear
clc
h = 0.5 ; % the modulation index h = 2f_{d}T
sample_rate = 26e6; % the sample rate
sample_time = 1/sample_rate;
symbol_rate = 1e6;
oversample = sample_rate / symbol_rate;
B = 0.5e6; % the 3db bandwidth is 500Mhz
delay = 1.5 % the gaussian filter covers 3 symbol
tx_bits = [1,0,0,1,0,0,1,0,1,1,1,0,1,1,0,0,1]; % the transmit bits
Gaussian_filter_coeff = Gaussian_filter(B, symbol_rate, delay, sample_time);
tx_data = 2*tx_bits - 1; % NRZ code
tx_data_sample = upsample(tx_data, oversample);
tx_data_filtered = 2*pi*h*conv(Gaussian_filter_coeff,tx_data_sample);
tx_phase = sample_time*cumsum(tx_data_filterd);
tx_cos = cos(tx_phase);
tx_sin = sin(tx_phase);
tx_gfsk = complex(tx_cos,tx_sin);
plot(tx_cos);
hold on
plot(tx_sin);
hold off
最終波形如下: