# 延伸報告一 : 以頻譜分析儀探討專題結論 ### 主旨: 本篇針對以下專題之結論進行更深入分析及討論 專題:==**以GPS規格及Zedboard實現通訊發射機**== 內容-著重頻譜結果的分析 目標-客觀評鑑專題之成果(發射訊號) --- ## 引言:前述專題之結論 基於"以GPS規格及Zedboard實現通訊發射機之模擬"專題,其最後結論呈現以zedboard實際產生訊號並透過AD9361射頻板發射之訊號頻譜: >![](https://hackmd.io/_uploads/BJYKV2lH2.jpg) > *圖1-1與1-2、頻譜分析儀不同span下之螢幕截圖* > "此頻譜的中心頻率在2.5GHz,頻寬為300kHz,且波形看起來失真。此結果與理論模擬的不同,發生了我們預期外的問題。" 如上所述,此頻譜作為專題的結論是不符合預期的,預期中,經過polyphase filter做完16倍升採樣後的頻譜應該為: ![](https://hackmd.io/_uploads/HkSjvoNE2.jpg) *圖2、matlab模擬相同結果繪製之頻譜* * 圖二的數據來源是zedboard實際合成電路後將訊號直接由DMA讀回給user。 * 藍色部分是只經過pulse shaping(上採樣4倍)畫出來的頻譜圖 * 紅色部分是經過pulse shaping後再經過polyphase filter 做16倍的上採樣(4*16=32倍上採樣)。 * 以上的訊號都是由實體電路產生,且還未通過AD9361發射 雖然此頻譜也沒有具備所有理想的特性,但頻譜分析儀上的結果也應該與圖二模擬結果相同,而非呈現如圖一。 本篇將針對此頻譜不合預期的狀況,將進一步探究原因。 ## 一、分析結果 ### 發現問題 從實驗結果交叉比對,我們察覺無論我們是否改變pulse shaping之後的模組與否,頻譜分析儀皆呈現圖一頻譜。於是懷疑自編的模組沒有成功啟動。 > ![](https://hackmd.io/_uploads/SkfSUSHV2.png) > *圖3-1與3-2、頻譜比較* > 左為pulse shaping後之頻譜;右為pulse shaping後再做16倍升採樣的頻譜,兩者幾乎完全一樣,可以判定是同一個來源的頻譜 為了要驗證猜測,我們嘗試先實現single tone訊號的發射,目的在於先確保整體電路能夠運作並確實發射弦波訊號,電路模組如下: ![](https://hackmd.io/_uploads/rkK4sHrV3.png) *圖4、single tone弦波發射模組* 此電路最主要的功能就是透過DDS(Direct Digital Synthesizer)產生弦波訊號,並透過Zedboard與AD9361射頻板將弦波訊號發射出來。 ![](https://hackmd.io/_uploads/r1yt2SBEn.jpg) *圖5、以vivado模擬DDS產生之訊號* 透過上述的方法,我們確認了系統及射頻板能夠順利運行,同時我們有了一項意外發現。 #### 意外發現 與FPGA核心溝通所需的函示呼叫指令: ```python= from pynq import Overlay, Interrupt from pynq.lib import AxiGPIO import asyncio import time from pynq import PL from pynq import Xlnk import numpy as np ol=Overlay('ourproject.bit') ol? mask=0xffffffff ``` 我們察覺透過python運行FPGA及AD9361時,當執行最初的呼叫函示指令,頻譜分析儀即會產生一頻譜: ![](https://hackmd.io/_uploads/rJAaJLH43.png) *圖6、AD9361射頻板初始化後產生的中心頻率之頻譜* 對圖六頻譜加以觀察,在調整span(頻譜範圍)及RBW(頻譜解析度)後,我們得到了一個與圖三一模一樣的結果。換而言之,我們得到了兩個重要的資訊: 1. **造成圖三頻譜的來源就是AD9361啟動後即產生的中心頻率(carrier的能量),因此,此頻譜與自設計之模組毫無相關** 2. **驗證了前述的假設:圖三的左右兩頻譜是相同來源(也與圖六同源)都是AD9361的中心頻率** ## 二、找出錯誤 由**一、分析結果知道**我們的模組事實上沒有被成功啟動,因此導致圖一的頻譜。因此首要需要檢查的就是作為user與zedboard溝通介面的python是否有寫錯。經過逐行檢視,我們找到了問題的核心。 ### 導致錯誤結果的程式碼 ```python= goldtomap_enable = AxiGPIO(DDS_ip).channel1 maptodma_size = AxiGPIO(DDS_ip).channel2 goldtomap_enable.write(0,0xf) size=6138 maptodma_size.write(size,0xff) ``` 上面一段程式會執行以下功能: > 使用 DDS_ip IP 位址的 AxiGPIO 物件來進行配置和控制兩個通道,分別為 goldtomap_enable 和 maptodma_size > 1. goldtomap_enable 被指派為從 AxiGPIO(DDS_ip) 的通道 1 取得的值 > 2. maptodma_size 被指派為從相同的 AxiGPIO 物件的通道 2 取得的值 > 3. 將值 "0" 與遮罩值 "0xf"寫入 goldtomap_enable > 4. 將 size 設定為 6138 > 5. 將 size 的值 (6138) 與遮罩值 0xff (十進制表示為 255) 一同寫入 maptodma_size > 此程式碼對應到實際電路就是在控制 axi_gpio_0 模組,透過賦予gpio通道值,我們可以控制電路的啟動與否,通道1,也就是goldtomap_enable是用來控制goldtomap模組的valid控制訊號線,當模組的valid線high(logic 1)時,模組才會啟動。 顯而易見的,賦予goldtomap_enable的值不能是0,應該為1,才能成功啟動我們的模組。 修正後的程式: ```python= goldtomap_enable = AxiGPIO(DDS_ip).channel1 maptodma_size = AxiGPIO(DDS_ip).channel2 goldtomap_enable.write(1,0xf) size=6138 maptodma_size.write(size,0xff) ``` ### 分析電路正確啟動後的頻譜 將完整啟動電路之訊號以頻譜分析儀測量: ![](https://hackmd.io/_uploads/r1W4Tp6V2.png) *圖7、正確啟動電路後發射之訊號頻譜* 調整span及RSB重看頻譜: ![](https://hackmd.io/_uploads/BkyEW3xB2.jpg) 圖8-1與8-2、以不同解析度看相同的頻譜(與圖七相同) * 左圖為span=1MHz;RSB=100kHz * 右圖為span=1MHz;RSB=30kHz #### 比較頻譜與先前的頻譜 > >比較1:![](https://hackmd.io/_uploads/rJsqvkbB3.jpg) >*左圖為**圖8-1**;右圖為**圖1-1*** >觀察圖8-1與圖1-1可以發現頻譜幾乎相同,看似沒有差別,理論上成功發射的圖8頻譜卻與有誤的圖1幾乎一樣。 >p.s.在實際操作時,一旦我們啟動電路頻譜就略有改變(右圖頂峰較左圖略低一點;中間的拱形線條較雜一些) >比較2:![](https://hackmd.io/_uploads/rkpe91WB2.jpg) > *左圖為**圖1-2**;右圖為**圖7*** >圖7與圖1-2卻是不同的結果,雖然兩張圖的RSB設定略有不同就會讓圖形略有不同,但左圖很明顯只有中心頻率;而右圖在中心頻率的左右兩側看起來有一些東西。無法從這些頻譜再更深入分析了,因此將更進一步以其他方式分析。 ## 三、階段性結論 **在這份延伸報告中,經由測試與分析所獲得的資訊及重點是:** :::info * 原本專題結論的頻譜圖是由AD9361啟動後即產生的中心頻率造成,此頻譜與自設計之模組無關 * 發現原程式碼的問題,修改後確實讓電路啟動並發射訊號,確定了看到的頻譜其實是載波頻率(carrier能量)導致的。 * 最後量測到的頻譜與理論的頻譜並不相同,可以說,這個驗證方法下,專題的結論是有誤的。 ::: 至此,可以推測自設計之模組與系統模組之間存在預期外的問題。儘管我們已經驗證實體產生之訊號的正確性,但是將產生的訊號發射後卻沒有辦法看到預期中的頻譜特性,有些遺憾。 為了更深入分析發射訊號,下一篇我們將採用另一種方式,直接蒐集發射訊號並以軟體分析,目標是以結果回推,找出可能的致錯原因。 ## Reference + NCU-CE, SDR LAB + 以GPS規格及zedboard實現通訊發射機模擬 + [PieappleJ大神學長的Tutorial](https://hackmd.io/@Pieapplej/H1XwekrHc) ###### tags:`Xilinix zedboard` `AD9361` `Result Analysis` `NCU CE` >Department Communication Engineering National Central University, Taiwan 主編:[name=Dylan傅詮恩]協助編輯:[name=張榮軒、陳泓宇、冼義佑]