# 另一種可能:自設計的上採器
### 主旨:
本篇為[延伸報告二:以AD9361接收訊號探討專題結論](https://hackmd.io/Z57LAlxFTD6LcFhT4gUJjg)的平行分支
重點差異在於上採樣模組的差異:
**延伸報告二** : 使用polyphase架構
**本篇** : 使用自設計的上採器
內容-運用MATLAB分析發射資料的特性(頻譜與星座圖)
目標-客觀評鑑專題之成果(發射訊號特性)
---
## 引言:上採樣模組的使命
為了達到16倍的上採樣,我們設計了另一種電路架構。
這個架構的想法是,為了配合AD9361的DAC之採樣率(30.72MHz),我們需要將承接自pulse shaping的訊號再進一步產生匹配的資料率,使訊號被DAC採樣時能夠連續。
本篇除了著重分析自設計之上採器的功效外,也會帶到訊號產生的速度隨著電路的處理變化的情形。接下來會講解電路架構中的各模組在處理資料時的
### 電路架構
*圖一、原自設計模組的加上上採樣器的電路*
#### 除頻(freq_divider_0)
> <font color="#315484">Zynq的系統時脈為 100MHz,則一個clock的週期為10ns,因此產生1023個gold code需要10.23us,透過clock_div模組,產生新的震盪訊號,將週期使其週期為970ns,頻率約為1.03MHz,產生1023個gold code需要992.31us(實際上不會剛好,在最後一個時脈會有必較長的周期,製造出1023個code費時1000us)。新的震盪訊號的頻率大約為系統時脈的百分之一倍,由於1023個code耗時1ms,則頻率為1.023Mz,我們稱此時脈為除頻clock。
>
> 受除頻clock所控制,模組goldto map_0、encoder_0及maptodma_0運作的速度都會是1.023MHz。</font>
#### QPSK調變(maptodma_0)
> <font color="#315484">maptodma模組的主要工作就是將串接數列轉換為平行數列(serial to parallel),同時將數值兩兩一組,判斷mapping到二維空間中的四個象限上。因此mapping時先收到的第一個訊號都必須等一個模組運作時脈,等第二個訊號到了之後,在一起做判斷。因此這個運作模式就會讓原本1.023MHz的資料輸入速率減半,變成0.5115Mz。</font>
#### 升餘弦濾波器(DVB_S2_PS_AXI_0)
> <font color="#315484">此模組在做pulse shaping,目的是消除ISI。同時,在**延伸報告二:以AD9361接收訊號探討專題結論**中我們有提到,為了讓輸入的資料點更連續(使訊號更接近理想的類比發射訊號),因此做了四倍的上採樣。所以從maptodma做完qpsk調變後的資料再送進pulse shaping模組中,即會產生0.5115乘四,為2.046MHz。</font>
事實上在做完pulse shaping後,訊號即具備發射的特性。觀察結果:
**頻譜**
*圖八、做完pulse shaping後發射訊號繪製的頻譜與頻譜分析儀結果*
**星座圖**
*圖九、做完pulse shaping後發射訊號繪製的星座圖*
#### 自設計的上採樣模組(sample_up_75_0)
> <font color="#315484">由於做完pulse shaping後的訊號其實就已經具備發射訊號的特質了,但為了配合AD9361的DAC模組採樣率(30.72MHz),我們需要將訊號再進一步上採樣。
>
> 為何需要配合DAC模組採樣率? Ans:因為若資料產生的速度與採樣率不匹配,則發射的訊號會有問題。若資料產生速度大於採樣率,則採樣的訊號可能會不連續,因為在每次採樣的間隔內資料的持續時間太短,還沒被採樣到就換下一個訊號了,因此導致不連續。
>
> 而我們遇到的狀況就是資料產生速度大於採樣率,因此我們嘗試將資料的持續時間拉長16倍,使相同資料點多出15個,藉此提高相同時間內,訊號的數量,以最粗略的方式做到插值,達成上採樣。</font>
### 總結
```mermaid
graph LR;
1(1.023MHz)-->2(做QPSK調變 除以2);
2(做QPSK調變 除以2)-->3(做pulse shaping 乘以4);
3(做pulse shaping 乘以4)-->4(做上採樣 乘以16);
4(做上採樣 乘以16)-->5(32.736MHz);
```
$$\frac{1.023MHz}{2}\times4\times16=32.736MHz$$
最終的資料率達到,32.736MHz,超過採樣率30.72MHz,理論上就可以解決採樣訊號不連續的問題,讓採樣訊號連續。
### 模組程式碼
```verilog=
`timescale 1ns / 1ps
module sample_up_75(clk, rstn, shap_I, shap_Q, s_axis_tvalid, s_axis_tready,
m_axis_tvalid, m_axis_tready, slice_I, slice_Q);
input clk, rstn;
input [15:0] shap_I, shap_Q;
input s_axis_tvalid, m_axis_tready;
output [15:0] slice_I, slice_Q;
output m_axis_tvalid, s_axis_tready;
reg [3:0] counter = 4'd0; // 7-bit binary counter
reg [15:0]hold_I;
reg [15:0]hold_Q;
reg stop_ovalid;
reg keep;
wire clk_16th = (counter == 15);
assign slice_I = hold_I;
assign slice_Q = hold_Q;
assign s_axis_tready = clk_16th;
assign m_axis_tvalid = keep;
always @(posedge clk, negedge rstn) begin
if (~rstn) begin
hold_I <= 0;
hold_Q <= 0;
counter <= 0;
keep <= 0;
end else if (clk_16th) begin
counter <= 0;
hold_I <= shap_I;
hold_Q <= shap_Q;
if (s_axis_tvalid) begin
keep <= 1;
end
else if (~s_axis_tvalid) begin
keep <= 0;
end
end
counter <= counter + 1;
end
endmodule
```
### 模組時序圖
> *圖二、vivado中模組的運作時序圖*
>
> PS_out_I及PS_out_Q為pulse shaping 完的實部急虛部序列。以PS_out_I為例可以看到在系統時間10,115ns時,開始有產出前段模組產生的訊號。在經過上採樣模組後的輸出為 slice_I 及 slice_Q ,而slice_I的數值會對應PS_out_I的數值,但持續時間變長16倍,達到訊號變多16倍的效果。
### 以cable作為發射及接收通道的成果
#### 頻譜分析儀結果
*圖三、接收訊號繪製的頻譜與頻譜分析儀結果*
#### 星座圖
*圖四、接收訊號繪製星座圖*
### 以天線作為發射及接收通道的成果
#### 天線位置的差異
*圖五、實際電路板的無線通道情形*
#### 頻譜比較
*圖六、不同距離的通道所繪製的頻譜*
#### 星座圖比較
*圖七、不同距離的通道所繪製的星座圖*
可以發現當天線的距離越大,發送的訊號星座圖就越不理想(左圖);當天現越靠近彼此,展現的星座圖就會趨近於以理想通道(有線)傳送的樣子。
## Reference
+ NCU-CE, SDR LAB
+ 以GPS規格及zedboard實現通訊發射機模擬
+ [延伸報告一:以頻譜分析儀探討專題結論](https://hackmd.io/@ajO9iAiKQw-VU35zjKDr1g/r1PKDeEVh)
+ [延伸報告二:以AD9361接收訊號探討專題結論](https://hackmd.io/Z57LAlxFTD6LcFhT4gUJjg)
**特別感謝SDR LAB的學長姐,與我們一起想辦法並協助我們學習**:100:
###### tags:`Xilinix zedboard` `AD9361` `Result Analysis` `NCU CE`
>Department Communication Engineering
National Central University, Taiwan
主編:[name=Dylan傅詮恩]協助編輯:[name=張榮軒、陳泓宇、冼義佑]