FPGA数字信号处理(十)ASK调制技术
本系列的1~9篇介紹了數字信號處理系統的基礎概念以及FIR、IIR和FFT三種基本運算單元,從本文開始將介紹一些數字信號處理系統。本文將介紹數字通信系統中ASK調制技術的FPGA實現。
調制技術
在通信系統中,由于一般情況下信道不能直接傳輸基帶信號,因此必須用基帶信號對載波信號(通常是正弦波)的某些參量進行控制,使其隨著基帶信號的變化而變化,這個過程稱作調制,得到的信號稱作調制信號(已調信號)。
正弦波作為載波信號有三個參量可以攜帶信息:幅度(調幅AM)、頻率(調頻FM)和相位(調相PM)。在數字系統中,由于信號都是離散化的值,調制的參量也是一些離散的狀態,因此調制信號通常被稱作鍵控信號,三種調制方式也對應稱作振幅鍵控ASK、頻移鍵控FSK和相移鍵控PSK。
ASK調制
ASK可分為二進制振幅調制(2ASK)和多進制振幅調制(如4ASK),這里的“進制”指的是信號所攜帶的信息量。
如2ASK調制系統中,數字信息只有0和1兩種,所調制的載波信號的幅度變化狀態也只需要兩種:無載波輸出時代表發送0;有載波輸出時代表發送1。4ASK調制系統中,數字信息就有00、01、10、11四種,需要載波信號幅度的4個電平狀態表示。顯然,進制越大,相同頻帶內可以傳輸的數據信息量也就越多,即頻帶利用率越高。
ASK調制系統的模型如下所示:
基帶信號m(n)可以看作一串由0、1組成的矩形脈沖信號,理論上其帶寬是無限的,與載波信號調制之后的鍵控信號s(n)帶寬也是無限的。工程中為了提高頻帶利用率,需要對信號帶寬做限制,通常只需要將在主瓣帶寬內包含90%能量的信號發送出去即可。
有兩種方法可以實現:(1).在輸出端加上帶通濾波器篩選主瓣帶寬;(2).在調制前先對基帶信號m(n)做成形濾波,濾除主瓣外的頻率成分。成形濾波通常都選擇升余弦滾降濾波器,本質上也是一種FIR濾波器。
MATLAB設計
在FPGA設計前通常都會使用MATLAB對系統進行建模與仿真。設計ASK調制系統時,選定系統參數:基帶信號的符號速率Rb、載波頻率Fc、采樣頻率Fs、升余弦濾波器的滾降因子α。
可以使用randi函數生成隨機的二進制序列作為基帶信號;rectpulse函數實現對基帶信號的采樣;rcosflt(老版本)或rcosdesign(新版本)函數實現成形濾波。主要代碼如下:
code_2ask = randi(2, 1, Len) - 1; %產生隨機分布的二進制數據 code_2ask_upsamp = rectpulse(code_2ask, Fs/Rb); %對基帶數據以Fs速率采樣 code_2ask_filter = rcosflt(code_2ask, 1, Fs/Rb); %對基帶數據進行成形濾波,同時進行Fs/Rb倍采樣 ASK2 = carrier .* code_2ask_upsamp; %產生未進行成形濾波的2ASK信號 ASK2_filter = carrier .* code_2ask_filter(1:LenData)'; %產生成形濾波后的2ASK信號本系列主要是講述FPGA設計,不詳細討論上述函數的使用,具體情況可以的MATLAB的help中查詢。
FPGA設計
在Vivado開發環境下完成4ASK調制技術的設計并進行仿真(為了能更直觀地觀察調制效果,這里省略了成形濾波器及帶通濾波器)。模塊接口如下:
`timescale 1ns / 1ps //----------------------------------------------------------- // 4ASK調制 //----------------------------------------------------------- module ASKmodulation_liuqi (input rst,input clk, //系統時鐘8*Rb(采樣頻率)input [1:0] din, //基帶數據輸入(速率為Rb)output signed [13:0] dout //ASK調制信號輸出 );采樣時鐘設置為基帶信號的碼元速率的8倍,輸出的ASK調制信號位寬由載波信號的位寬決定。
載波信號頻率設置為2MHz,由Vivado提供的DDS Compiler IP核產生(該IP核使用方法可參考https://blog.csdn.net/fpgadesigner/article/details/80512067)。DDS的參數設置將決定載波信號的位寬,進一步會決定ASK調制信號的位寬。本設計將DDS的無雜散動態范圍設置為80dB,對應的位寬為14bit。實例化代碼如下:
設計中使用載波信號最大幅值的0、1/3、2/3、1倍來分別表示四進制基帶信號的00、01、10、11。調制部分的代碼如下:
//----------------------------------------------------------- // 調制,0、1/3、2/3、1代表四種數字信息 //----------------------------------------------------------- reg [13:0] ask_data;always @ (posedge clk or posedge rst)if (rst) ask_data <= 'd0;else case (din)//"00"--02'd0 : ask_data <= 'd0;//"01"--1/4+1/16+1/32≈1/32'd1 : ask_data <= {{2{sin_data[13]}},sin_data[13:2]}+ {{4{sin_data[13]}},sin_data[13:4]}+{{5{sin_data[13]}},sin_data[13:5]};//"10"--1/2+1/8+1/16≈2/32'd2 : ask_data <= {{2{sin_data[13]}},sin_data[13:2]}+ {{2{sin_data[13]}},sin_data[13:2]}+{{2{sin_data[13]}},sin_data[13:2]};//"11"--12'd3 : ask_data <= sin_data;default : ask_data <= 'd0;endcaseassign dout = ask_data;endmodule在采樣時鐘的控制下,使用Verilog HDL的case語法對基帶信號數據din做判斷,從而決定ASK調制信號的輸出幅度。由于FPGA實現1/3、2/3這種除法運算很消耗資源,這里使用“移位相加”的組合方式代替除法,實現相同的效果。注意整個系統采用的都是帶符號數二進制補碼,因此移位時高位應該補符號位。
當然,調制毫無疑問也可以用乘法器實現,尤其是如果使用成形濾波器對基帶信號濾波后(位寬會擴展),只能使用乘法器調制,不能像上面一樣用case語句判斷。使用乘法器調制的代碼如下:
//----------------------------------------------------------- // 調制,0、1/3、2/3、1代表四種數字信息 //----------------------------------------------------------- wire signed [15:0] ask_data;mult_gen_0 U1 (.A (din),.B (sin_data),.P (ask_data) );assign dout = ask_data[15:2];endmodule乘法器的A端口(對應基帶信號輸入)設置為無符號數,B端口(對應載波信號輸入)設置為帶符號數,輸出截位后作為ASK調制信號的輸出。整個工程的RTL視圖如下:
從圖中可以看出DDS輸出的載波信號和基帶信號送入乘法器,截尾后得到ASK調制信號輸出。
仿真與工程下載
編寫testbench,主要是基帶信號的產生。當然可以像前面仿真FIR、FFT時一樣,使用MATLAB生成一組隨機二進制數據存入txt中,在testbench中讀取txt文件作為基帶信號。
本設計采用一種簡單的基帶信號產生方式,設置一個5位計數器cnt,截取高兩位cnt[4:3]作為基帶信號。仿真效果如下圖所示(上文兩種調制方式的仿真結果一樣):
很明顯看到輸出的ASK調制信號dout有4種電平狀態,且與基帶信號的值之間一一對應。完整的Vivado工程(含testbench仿真)可以在這里下載:https://download.csdn.net/download/fpgadesigner/10481532 。
總結
以上是生活随笔為你收集整理的FPGA数字信号处理(十)ASK调制技术的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: STM32位带操作实现过程解析
- 下一篇: HDU 4487 Maximum Ran