FPGA數字訊號處理(23)FSK解調技術(包絡檢波法)
上一篇介紹了數字通訊系統中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中有正有負,不含直流分量。
相關文章
- FPGA數字訊號處理(22)FSK調製技術FPGA
- FPGA數字訊號處理(十三)鎖相環位同步技術的實現FPGA
- 語音訊號預處理——數字濾波器音訊
- FPGA數字訊號處理(26)加擾器與解擾器設計FPGA
- 數字訊號處理實驗(四):數字濾波器結構
- 數字訊號處理:運用FFT簡單濾波FFT
- MATLAB訊號處理——數字濾波器的設計Matlab
- FPGA數字訊號處理(24)數字相關器設計(簡化結構)FPGA
- FPGA數字訊號處理(25)數字相關器設計(經典結構)FPGA
- 數字訊號處理基礎----插值、抽取濾波器
- 訊號處理技術:現代通訊技術的基石
- FPGA數字訊號處理(27)卷積編碼器與Viterbi譯碼器設計FPGA卷積Viterbi
- 使用Octave音訊處理(三):數學技術處理音訊檔案音訊
- 訊號處理基本引數
- MATLAB數字訊號處理(2)LFM脈衝雷達回波處理模擬Matlab
- 影像處理技術(二)濾波去噪(上)
- 易優cms資料表或檢視不存在,請聯絡技術處理。
- 演算法 | 數字影像處理之「中值濾波」演算法
- FPGA經典:Verilog傳奇與基於FPGA的數字影像處理原理及應用FPGA
- 文字預處理技術詳解
- 萬字長文 | MongoDB絡傳輸處理原始碼實現及效能調優MongoDB原始碼
- 詳解數字影像的濾波和邊緣檢測
- linux 訊號與處理Linux
- MATLAB數字訊號處理(1)四種經典功率譜估計方法比較Matlab
- 【scipy 基礎】--訊號處理
- 處理python中的訊號Python
- Python 音訊訊號處理庫 librosaPython音訊ROS
- 數字影象處理DIP
- 影片美顏SDK動態處理技術與靜態處理技術
- 數字訊號處理:線性卷積、迴圈卷積、圓周卷積計算卷積
- 網頁js版音訊數字訊號處理:H5錄音+特定頻率訊號的特徵分析和識別提取網頁JS音訊H5特徵
- 學點不一樣的技術:FPGA可重構技術——FPGA晶片FPGA晶片
- php 處理 浮點數 精度運算 數字處理等PHP
- MATLAB及其訊號處理基礎Matlab
- 資訊抽取(UIE)技術:讓保險理賠資訊處理流程便捷高效UI
- 建立數字錢包(一)賬號生成
- 影像處理技術:影像切割、標籤、貼紙花字,超細開發詳解
- 隨機化處理技術隨機