FPGA數字訊號處理(23)FSK解調技術(包絡檢波法)

FPGADesigner發表於2018-07-23

上一篇介紹了數字通訊系統中FSK調製技術的FPGA實現。調製訊號經過DAC、可選的帶通濾波器、功率放大器、天線傳送出去後,在接收端收到FSK訊號後需要對其解調,提取出包含的資訊(基帶訊號)。


FSK解調

由上一篇可知,FSK調製訊號可以視作兩路ASK調製訊號的合成,因此可以得到與ASK解調原理相似的FSK解調方法(ASK解調在第11篇中有討論)。對應的包絡檢波法(非相干解調)的系統框圖如下:
這裡寫圖片描述
帶通濾波器用於分出兩路ASK調製訊號,使用ASK解調方法解調,得到兩路ASK訊號的包絡,加法器將兩路保羅訊號相減,再進行判決。假設f1代表1,f2代表0,則減法結果大於0則表示對應的基帶資訊為1;減法結果小於0則表示對應的基帶資訊為0。

包絡檢波法對FSK訊號的相位特徵沒有要求,因此可用於FSK和CPFSK訊號解調。但該方法只有在頻移指數h>2時才有較好的效能,因為當h較小時,兩個頻率成分之間間隔較小,兩路ASK訊號之間頻譜混疊和干擾嚴重,會影響到解調效能。
實際應用中多采用非相干解調,因為:

  • 提取FSK訊號中的相干載波比較困難;
  • 位元速率相同時,非相干解調所需的訊雜比只比相干解調高1~2dB。

除了本文將討論的包絡檢波法外,非相干解調還有FFT分析法、自適應濾波解調法、差分檢波演算法、AFC環解調法、過零檢測法等多種方法,會在以後的文章中詳述。


MATLAB設計

MATLAB中可以設計程式模擬在使用包絡檢波法時,不同的h對檢波效果的影響,驗證上述結果。當h>2時,帶通濾波才能得到區分度明顯的ASK訊號,解調得到的包絡波也更規則,解調效能更好。解調關鍵程式碼如下:

%對FSK訊號進行帶通濾波
Wnf1=[(fc-m*ps)*2/Fs fc*2/Fs];
Wnf2=[fc*2/Fs (fc+m*ps)*2/Fs];
b1=fir1(60,Wnf1);
b2=fir1(60,Wnf2);
bs1_fsk=filter(b1,1,fsk);
bs2_fsk=filter(b2,1,fsk);
%對帶通濾波後的資料進行全波整流
abs1_fsk=abs(bs1_fsk);
abs2_fsk=abs(bs2_fsk);
%對整流後的資料進行低通濾波
Lb=fir1(60,ps*2/Fs);
Lpf1_fsk=filter(Lb,1,abs1_fsk);
Lpf2_fsk=filter(Lb,1,abs2_fsk);
%對低通濾波後的兩路訊號相減,形成基帶訊號波形
Demod_fsk=Lpf1_fsk-Lpf2_fsk;

帶通濾波器分別篩選兩路ASK訊號。以上一篇中的系統引數為例:系統時鐘32Mhz,碼元速率1Mhz,載波頻率6Mhz,頻移指數h=3.5,f1=4.25Mhz,f2=7.75MHz。帶通濾波器通帶可分別選為(6Mhz-h*1Mhz)~6Mhz和6Mhz~(6MHz+h*1Mhz)。

低通濾波器用於提取出基帶訊號包絡,截止頻率設定為碼元速率即可。所有的濾波器係數經過量化後儲存為txt(coe)檔案,在FPGA設計中呼叫。


FPGA設計

採用包絡檢波法,在Vivado開發環境下完成2FSK解調技術的設計並進行模擬(調製訊號引數與上節相同)。模組介面如下:

`timescale 1ns / 1ps
//--------------------------------------------------------
//   包絡檢波法(非相干解調)實現FSK訊號解調
//--------------------------------------------------------
module FSKdem_EnvelopeDet
(
    input clk,          //32MHz系統時鐘
    input rst,
    input din,          //基帶訊號輸入,碼元速率1MHz
    output [15:0] dout  //FSK解調資料輸出
);

//-----------------------------------------------------
//   CPFSK調製,連續相位,h=3.5
//-----------------------------------------------------
wire [15:0] fsk;

CPFSK_liuqi fskmod
(
    .clk  (clk),     
    .rst  (rst),  
    .din  (din),     
    .dout (fsk)
);

這裡例項化一個上一篇設計的FSK調製模組,用來產生FSK調製訊號,簡化後面的模擬及testbench的編寫。接下來例項化兩個帶通濾波器模組,提取出兩路ASK訊號:

//--------------------------------------------------------
//   帶通濾波器分為兩路ASK訊號
//--------------------------------------------------------
wire signed [31:0] data1, data2;
wire signed [15:0] bpf1 = data1[29:14]; 
wire signed [15:0] bpf2 = data2[29:14]; 

bpf1_fir fir1 (
  .aclk(clk),                           
  .s_axis_data_tvalid(1'b1), 
  .s_axis_data_tready(),
  .s_axis_data_tdata(fsk),  
  .m_axis_data_tvalid(),  
  .m_axis_data_tdata(data1)    
);
bpf2_fir fir2 (
  .aclk(clk),                           
  .s_axis_data_tvalid(1'b1), 
  .s_axis_data_tready(),
  .s_axis_data_tdata(fsk),  
  .m_axis_data_tvalid(),  
  .m_axis_data_tdata(data2)    
);      

帶通濾波器及後面的低通濾波器都使用Vivado提供的FIR Compiler IP核,濾波器係數使用MATLAB生成的coe檔案,具體使用方法可參考https://blog.csdn.net/fpgadesigner/article/details/80621411

接下來便是分別對兩路ASK訊號進行解調(方法見第11篇)程式碼如下:

//--------------------------------------------------------
//    整流,即求絕對值
//--------------------------------------------------------
reg signed [15:0] bpf1_abs, bpf2_abs;

always @ (posedge clk or posedge rst)
    if (rst) begin bpf1_abs <= 'd0; bpf2_abs <= 'd0; end
    else begin
        if (bpf1[15]) bpf1_abs <= -bpf1;
        else bpf1_abs <= bpf1;

        if (bpf2[15]) bpf2_abs <= -bpf2;
        else bpf2_abs <= bpf2;
    end

//--------------------------------------------------------
//    低通濾波得到基帶訊號包絡
//--------------------------------------------------------
wire signed [31:0] lpf1, lpf2;

lpf_fir fir3 (
  .aclk(clk),                           
  .s_axis_data_tvalid(1'b1), 
  .s_axis_data_tready(),
  .s_axis_data_tdata(bpf1_abs),  
  .m_axis_data_tvalid(),  
  .m_axis_data_tdata(lpf1)    
);

lpf_fir fir4 (
  .aclk(clk),                           
  .s_axis_data_tvalid(1'b1), 
  .s_axis_data_tready(),
  .s_axis_data_tdata(bpf2_abs),  
  .m_axis_data_tvalid(),  
  .m_axis_data_tdata(lpf2)    
);

濾波器的輸出便是兩路ASK訊號的包絡,將兩路訊號相減:

//--------------------------------------------------------
//    減法得到解調訊號
//--------------------------------------------------------
reg signed [15:0] sub;

always @ (posedge clk or posedge rst)
    if (rst) sub <= 'd0;
    else sub <= lpf1[29:14] - lpf2[29:14];

assign dout = sub;

減法器結果即為解調後訊號,對此訊號進行判決輸出即可恢復出原始基帶資料。需要注意,從下面的模擬中可以看出2FSK解調訊號中不含直流分量,因此判決門限直接設定為0即可。判決門限及鎖相環位同步技術在本系列12、13篇中有記錄。


模擬測試

編寫testbench,生成一個矩形脈衝週期訊號,模擬二進位制基帶資料,設計中有模組調製產生FSK調製訊號,再解調,模擬結果如下:
這裡寫圖片描述
經過帶通濾波後,bpf1和bpf2都只保留了一路ASK訊號;整流及低通濾波後得到ASK的基帶訊號包絡lpf1和lpf2。兩者相減的結果dout即為解調訊號。注意,雖然看起來dout與lpf1很像,但根據前面文章對ASK調製解調的討論,基帶包絡lpf1是一個含直流分量的訊號(所有值都大於0);而dout中有正有負,不含直流分量。

相關文章