---
# System prepended metadata

title: <center>0508 通訊實驗</center>

---

#   <center>0508 通訊實驗</center>

---
    
##  <center>AM訊號的解碼</center>

這禮拜主要是在GNU Radio上實作AM訊號的解碼，分成四個小部份去進行實作:

* 1.[觀察 AM 訊號](#title1)
* 2.[調整中心頻率](#title2)
* 3.[ AM 訊號解碼](#title3)
* 4.[自己做訊號解碼](#title4)
    
###  <center id="title1">觀察 AM 訊號</center>

這次實驗我們使用的AM訊號，是一段由California State University 的 Sharlene Katz 教授網頁所錄製的AM訊號，此檔案的錄製的中心頻率為 710 KHz，而抽樣速度為 256 KHz。
    
要觀察AM訊號最簡單的辦法，便是直接將訊號接到示波器上，但是本次觀察為純軟體，所以需要一個 Throttle 元件限制速度，才不會占用過多 CPU 資源。

<center>
    
取用 File Source, Throttle, 以及 QT GUI Frequency Sink 三個元件，連接如下圖所示：<br>
    ![](https://hackmd.io/_uploads/ryDcoBjVn.png)<br>
各元件的參數如下:

</center>

1. samp_rate: 256e3，這是錄製信號的抽樣速度
2. File Source: File 設定成下載檔案的路徑
3. QT GUI Frequency SInk :
    Grid: Yes
    Autoscale: Yes
    Average: Medium

<center>
    
執行後結果如下<br>
![](https://hackmd.io/_uploads/SJ9jV8oE3.png)<br>
    
</center>

從訊號的頻譜中觀察，這個訊號檔案可以觀察到頻率範圍為何？
    Ans : 710kHz +- 128kHz
相隔的兩個電台頻道，頻率上大概差多少？
    Ans : 80kHz
每個頻道的頻寬大約多少？
    Ans : 20kHz

### <center id="title2">調整中心頻率</center>

目前這個檔案，在頻率 0 的地方，實際上代表的頻率是 710 KHz，而在解碼某一個電台頻道之前，我們要以該頻道的頻率為中心，做一個低通濾波器，以便得到該頻道的訊號，同時濾除掉其他頻道的訊號。

一般常見的作法，會先將訊號乘上 $e$<sup>$j2\pi ft$</sup>，這等於是將每個頻率成份都加上 $f$ Hz。往右移 $f$ Hz 後，這時頻率 0 的地方，實際上代表的頻率應該是 710K - $f$ Hz，假設這就是我們要觀察的中心頻率 $f_c$，那麼 710K - $f$ Hz 要等於 $f_c$，也就是說，$f$ Hz 等於 710K - $f_c$ Hz

<center>

我們可以建構以下的系統來觀察這個結果：<br>
![](https://hackmd.io/_uploads/B1MNjLiNh.png)<br>
各元件的參數如下:
    
</center>


1. Signal Source : Frequency = 710e3-$f_c$
2. QT GUI Range ($f_c$) : 
    Default Vaule : 710e3
    Start : 600e3
    Stop : 820e3
    Step : 1e3

存檔執行之後，試著將頻率調為 680K，可以得到下面的圖形，此時 680K 已經變成新的頻率中心點了。（目前最高點仍是 710K）<br>
![](https://hackmd.io/_uploads/SkpTjLi4n.png)<br>

### <center id="title3">AM訊號解碼</center>

把頻道調到中心點之後，接著用一個低通濾波器，就可以把想要的訊號保留住，而把其他電台的訊號濾除掉。這時的訊號仍是 AM 調變過的訊號，因此只要使用 AM 的解碼模塊，就可以將訊號解碼了。

<center>

將上一個系統擴充如下圖：<br>
![](https://hackmd.io/_uploads/SyaJR8i42.png)<br>
這邊我們加了幾個元件 : 

</center>

1. Low Pass Filter(低通濾波器) : 
    Cutoff Freq : 5e3
    Transtion Width : 100，
2. AM Demod (進行 AM 的解碼)
    Channel Rate : 256e3
    Audio Decimation : 8，也就是將解碼出來的訊號，其抽樣速度改成 256K/8 = 32K。
3. QT GUI Range (gain) : 
    Default Vaule : 100e-6
    Start : 0
    Stop : 2
    Step : 100e-6

因此接下來就可以透過 Audio Sink 進行播放，不過播放之前，我們先乘上一個常數，以便用來調整播放的音量，而所乘的常數**盡量小一點，不然會被嚇到**，使用 QT GUI Range，便於在執行時進行調整。注意這邊 Audio Sink 的 samp_rate 要設定成 32K。

<center>

如果沒有接錯的話，存檔執行之後，就可以調整電台的頻道及播放的音量了。<br>
![](https://hackmd.io/_uploads/SyqKQPsVh.png)<br>

</center>

實際上，上面調整頻道的過程：把訊號和一個 Signal Source 做相乘，然後再經過低通濾波，實在太常使用了，因此 GNU Radio 提供了一個 Frequency Xlating FIR Filter 模組來做這件事。這個模組就是把訊號原來的中心點移到新的頻率，並且以新的頻率為中心做低通濾波，來保留所要的頻道訊號。

<center>
    
將系統改成如下圖所示：<br>
![](https://hackmd.io/_uploads/B1l0XPsEh.png)<br>
其中 Frequency Xlating FIR Filter 模組的參數如下 : 
</center>

1. Taps : firdes.low_pass(1, 256e3, 5000, 100)：表示增益為 1，抽樣速度為 256K，保留頻帶到 5K，過濾帶為 100。
2. Center Frequency : $f_c$ -710e3：原來中心 0 的地方為 710e3，現在則以 $f_c$ 為中心。

使用 Frequency Xlating FIR Filter 可以讓系統看起來更清爽，不過缺點是調整過頻率而還沒有濾波的中間訊號，沒有辦法拉出來用 Frequency Sink 來進行觀察。

### <center id="title4">自己做訊號解碼</center>

我們剛才使用系統提供的 AM Demod 模組來解碼 AM 的訊號，但其實 AM 訊號很單純，它使用載波來傳送訊號，而載波的振幅變化，其實就是我們的訊號。了解這個原理之後，其實我們也可以自己來進行解碼。

解碼的方式，是先找到訊號的振幅，怎麼找呢？因為收到的訊號實際是複數值，因此只要求出其振幅就可以了，GNU Radio 中有一個模組叫做 Complex to Mag，就是用來找複數訊號的振幅，找出來的就是我們的訊號，接著可以將訊號的抽樣率降下來，以便送到 Audio Sink 播放。在播放之前，也可以先去掉訊號的直流成份，以及調整訊號的增益。

<center>

系統的架構如下 : <br>
![](https://hackmd.io/_uploads/HkNorDoE2.png)<br>

</center>

存檔並執行之後，發現也可以將訊號解碼出來，不過解出來的訊號似乎沒有 AM Demod 解出來的訊號來得清晰。

## <center>結論</center>

本次實驗學習到了如何將一個 AM 訊號進行解碼，從了解 AM 訊號開始，經過將中心頻率調整後，利用基礎的低通濾波器 + AM Demod 進行 AM 的解碼，進而簡化低通濾波器，運用 Frequency Xlating FIR Filter 模組，但是簡化的缺點便是無法觀察頻譜，而 AM Demod 也可以拆分成各個小部分進行解碼，但拆份過後的訊號並沒有比 AM Demod 來的清晰。過程中印象比較深刻的是一直被音量嚇到，一開始音量設定是800e-3，但是非常之大聲，所以直接下降到100e-6。
