2023全國大學生電子設計競賽H題全解 [原創www.cnblogs.com/helesheng]

helesheng發表於2024-01-19

2023年又是全國大學生電子設計競賽年,一如既往的指導學生死磕H題。8月2日看到公佈的賽題,我自己還沾沾自喜,覺得今年學生用嵌入式系統和數字訊號處理知識就可以完成這題,賽前都輔導過,應該成績不差。哪想到結果大跌眼鏡,不但成績還不如往年,學生的解題思路更是各式各樣……

直到這幾天寒假才有空,我按照自己的思路, 在STM32上用數字訊號處理的方法將這道題全部做了一遍,效果不錯。現分享出來以饗讀者和粉絲,博大家一笑爾!也供後續的學生和參賽者參考。(注:以下講解未按照電賽組委會要求的報告標準格式撰寫,而是使用了隨筆形式,重點講解結題思路。未來閱讀此文的參賽者不可以此作為《設計報告》範本)

作為電子設計競賽的省級評委以及一個從業多年教育工作者,在競賽評獎中,我一方面看到了很多兄弟學校參賽隊對H題的不同解法,獲益良多。另一方面,我也發現了很多高校在電子電工、訊號處理前、嵌入式系統等領域的教學短板。因此我會在接下來的解題過程中,在每個關鍵步驟之後總結一下相關教學中存在的問題,希望對我省的電子電工教學水平的提高有所幫助。

先“疊個甲”:本文觀點難免有失偏頗,有不妥之處還請各位教育專家大佬不要介懷,並批評指正。以下原創內容歡迎網友轉載,但請註明出處:https://www.cnblogs.com/helesheng 

 

1.       2023全國大學生電子設計競賽H題原題

 

下面是原題:

2.       審題和選擇技術路徑

 本題的核心功能是題圖1中的分離電路實現的訊號 “分離”,光從名稱理解,很容易讓人想到對C訊號進行濾波——把兩個訊號分開。但仔細思考後會發現,這樣做的問題是濾波器的過渡帶極窄,極端情況下95KHz和100KHz之間只相差5%。很難將兩個訊號分離乾淨:A'中含有B的頻率;B'中含有A的頻率。從而造成A'和B'兩個訊號的失真。提高訊號分離度的有效方法只有提高濾波器的階數:對模擬濾波器而言,由於電容的精度很難做到20%以上,高階模擬濾波器很難實現準確的截止頻率和很窄的過渡帶;對數字濾波器而言,高階的IIR濾波器很難穩定,高階的FIR濾波器會使計算量大增,無法滿足計算的實時性。(注:此處必須具備一定的訊號處理實踐知識,既要能夠判斷5%的過渡帶很難實現,又要明白IIR的缺點在於穩定性,FIR濾波器的短板在於計算量是IIR的許多倍

另一種實現思路是“重建”A'和B'兩個訊號,即讓圖1中的分離電路重新生成C訊號中含有的A、B兩個訊號。有很多參賽者懷疑重建的訊號是否滿足題目要求。對此組委會官方在賽題公佈後公開答疑,明確了重建訊號是滿足要求的。

“重建”訊號方案的難度在於:由於訊號發生器產生的A、B和重新產生的A'、B'訊號都不可能是頻率絕對準確的,其精度都在0.01%左右,也就是萬分之一。對於100KHz的訊號,最糟糕的情況下,兩者之間每秒將相差±10個左右的波形。如果用示波器同時顯示兩個訊號會出現如下現象:用A訊號作為觸發源,則A'訊號每秒在螢幕上將向左或向右“滾動”最多20個波形,也就是無法做到原題第三部分“說明”第(5)條提到的用示波器能夠“穩定不漂移”的顯示原訊號和重建訊號。

解決問題的辦法是:不斷地實時測量A與A'、B與B'之間的相位差,並根據這個相位差不斷調整重建的A'和B'的相位。由此可以產生多種不同的技術路徑及相關的解決方案:

 1. 全數字方案:對C訊號取樣,在數字域計算A、B的頻率,並用DAC重建同頻率的兩路訊號A'、B'。隨後不停地重複計算輸入的A、B與A'、B'的相位差,並調整A'、B'的相位。

2. 將測量相位差的工作交給模擬相位測量晶片(如AD8302)來完成,MCU透過其輸出來獲取實時相位差。

3. 把訊號重建工作交給DDS(Direct Digital Frequency Synthesis,如AD9833/AD9854等)晶片來完成,MCU透過介面實時調整DDS產生訊號的相位。

4. 把訊號重建工作交給壓控振盪器(VCO,voltage-controlled oscillator)來實現,VCO控制電壓由相位差測量電路來產生。(注:由於VCO很難產生100KHz以下的標準正弦波,本方案不太容易獲得較好結果。)

非常高興看到,本省的參賽者採用了上述除第4種以外的所有技術路徑,有一個參賽隊結合第2和第3種技術路徑獲得了相當不錯的結果,獲得了省級一等獎,而其他參賽隊表現都不如人意。接下來我將用全數字方案來解決這個問題。具體使用的器件是我校教學中使用的STM32F1系列晶片,熟悉其他器件平臺的讀者可以參考我的演算法,在你熟悉的平臺上實現。演算法對於平臺的基本要求是:至少具有一路1MSPS以上的A/D轉換,兩路1MSPS以上的D/A轉換能力,以及片上乘加運算(MAC)指令,處理能力達到50MIPS以上。這些軟硬體能力,目前主流的國產或知名大廠的大部分32位和部分16位嵌入式MCU或DSP平臺都具備。

本環節揭示的訊號處理教學中的問題: 

a) 在測試中發現很多參賽隊採用了濾波器,甚至模擬濾波器作為解決這道題的基本技術路徑。這揭示出我們的《訊號與系統》、《數字訊號處理》和《類比電路基礎》等課程的教學停留在理論教學層面——學生對於濾波器的過渡帶有認知,但沒有確切的感性認識。只是因為上課時講過這個內容,參賽同學就認為濾波器能夠解決實際工程中的一切問題,缺乏解決“複雜工程問題”的能力。

b) 實驗教學中,學生接觸和使用示波器的機會不足。導致其不理解示波器的觸發功能。對波形“滾動”的成因及對策沒有認知。

3.       模擬加法電路

題圖1中的加法器使用運算放大器實現,電路如下圖所示。電路本身沒有什麼技術含量,就是教科書上的加法器電路。但由於MCU上整合的A/D只能接受正電壓,這裡用了隔直電容C1和C2去除輸入訊號的直流偏置,並用電阻R4和R5分壓產生的Vcc/2作為加法器輸出訊號的直流偏置。這樣不管輸入訊號A和B的直流偏置是0還是其他電壓,只要幅度合適,都可以被MCU片上的A/D轉換器採集。

圖3 帶直流偏置的模擬加法器

圖3電路圖左下角的是MCU處理後輸出的DAC_CH1和DAC_CH2兩個訊號的LC低通濾波器,其作用是平滑D/A轉換輸出的階梯。而整個模組使用了右上角的PMOD介面來和MCU板(圖3未畫出)相連。實物連線示意圖如下圖所示。

 圖4 模擬加法器實物連線示意圖

本環節揭示的電子電工教學中的問題:

a) 類比電路教學過於重視分立元件教學,對於運算放大器這一最重要的教學物件關注度不足。其實現代模擬系統中,除電力電子專業之外,直接使用分離的二、三極體的場合已經非常有限,沒有必要因循守舊,抱持幾十年不變的教學內容。

b) 學生對於“類比電路工作點”,這一重要概念理解不深刻,不會用。原因是類比電路教材中多數使用雙電源電路,工作點天生為GND,不需要調整。但對於現代低功耗、手持式電路而言,多數使用單電源供電,調整類比電路的工作點就成為必須掌握的技能。對此,類比電路教材必須有所改變。

4.  嵌入式程式的總體框架

本題的嵌入式程式要完成兩件事:其一判斷輸入C波形中的含有的訊號A、B的頻率和型別(正弦或三角波);其二根據實時輸入的C訊號,不斷的調整重建訊號的相位,以保持二者的相位差基本不變。根據題目中“說明”部分(3)給出的要求可知,判斷輸入訊號中兩個頻率成分的頻率和型別的工作應該在按下“啟動鍵”後完成,且只需要執行一次,對應於下圖左側部分。而實時調整重建訊號的相位的工作則應該在判斷完成後不斷地重複執行,以保證後續隨時用示波器觀測A和A’、B和B’訊號時都可以做到“穩定顯示不漂移”。其程式流程對應下圖中右側的迴圈部分。

 

圖5 嵌入式程式整體流程圖

5.  相位誤差演算法以及相位校正的嵌入式實現

1)相位誤差演算法理論分析

正如本文第2小節“審題”中分析的,本題最大的難點在於如何實時地計算演算法重新生成單頻的A'、B'訊號和C中的A、B訊號之間的相位差,並在隨後的計算不斷實時校正,將相位差保持在一個固定的值,從而實現在示波器上“穩定顯示不漂移”。我透過對輸入訊號C進行高速A/D取樣數字化後,再用訊號處理演算法計算C中的A、B和重建的A'和B'之間的相位差。

圖6 理論上的C訊號和合成它的A、B兩個訊號 

說到測量某個固定頻率訊號的相位,大部分人會首先想到FFT這個工具,原因是FFT演算法是“數字訊號處理”課程重點介紹的內容,且大部分MCU有FFT演算法庫可以直接呼叫。我最初也想象從FFT的相位譜還原A、B訊號初始相位的方法:

在時域內擷取指定長度(L)的C訊號,並用FFT計算該訊號的相位譜,然後在相位譜中讀取A、B訊號頻率位置對應對應的相位值。

但不幸的是,我在MATLAB中模擬這一演算法時,發現結果根本不對!分析頻域資訊時才發現了下圖所示的現象。

圖7 FFT後的功率譜(蘭)和相位譜(紅)

仔細想來,這種現象也不奇怪:當取樣率為1MSPS,訊號長度為1024時,頻率解析度(也就是頻域中兩個點的間隔)為fs/L = 1M/1024 = 976.56Hz。理論上說,100KHz的訊號所對應的頻譜位置將在第102.4個點上,而離散傅立葉變換隻能得到整數點上的頻域資訊,那麼100KHz的時域訊號能量將洩漏到第102和103個頻譜位置上。這個問題對於功率譜並不重要,因為功率是標量可以直接對周邊幾個點上的功率譜直接疊加即可;但對於相位譜而言再想從周邊幾個點的相位譜恢復出非整數點對應頻率(如100KHz)的相位就不容易了……

其實,多年前我還是學生的時候,曾經仔細思考過這個問題,後來看了胡廣書老師的經典教科書《數字訊號處理——理論演算法與實現》[1]第三章第八小節《對正弦訊號截斷的原則》才對此釋然的。胡老師的教科書是這樣寫的“抽樣頻率應為訊號頻率的整數倍,抽樣點數應包含整週期”。看到胡老師的書,又湧起“身不能至,心嚮往之”的崇拜之情。

圖8 《數字訊號處理——理論演算法與實現》第三章第八小節《對正弦訊號截斷的原則》

至此若仍然堅持FFT方案就需要把取樣長度L時間內輸入訊號的週期數調整為K個。由於取樣率fs,擷取長度L,擷取時長內週期數K和A、B訊號頻率f之間必須滿足下式:

 要保持K為整數就要保證(1)式的右邊也是整數。但不幸的是為執行FFT快速演算法,L一般應該是2的整數次冪;f是題目中給出的10KHz、15KHz、20KHz……95KHz和100KHz等固定值。也就要求取樣率fs是一個非常精確的小數。如:L為1024,f為100KHz,K為100時fs為1.024MSPS;L為1024,f為95KHz,K為100時fs為0.9728MSPS。這種連續非整數的取樣率fs,對於MCU整合的逐次逼近SAR式 A/D轉換器幾乎是無法做到的。(注:以常見的STM32F1系列MCU為例,在56MHz主頻下,其片上整合的SAR A/D轉換器使用DMA+硬體連續觸發模式,可獲得最高取樣率1MSPS。改變MCU主頻、A/D工作頻率或取樣觸發模式可獲得不同的取樣率,但在100KSPS以上的高取樣率下,無法再獲准確的獲得連續變化的取樣率。具體取樣過程程式碼實現和分析,請參見本文第8小節的介紹) 

到此我陷入瞭解這道題最大的困境,我的脫困思路是:既然保證K為整數的難點在於L必須是2的整數次冪,而L為2的整數次冪是由於快速演算法FFT帶來的。那不如干脆放棄快速傅立葉演算法FFT,回到離散傅立葉變換DFT的本源,直接計算指定頻點上的頻域值(含幅度譜值和相位譜值)。另一方面,解本題也並不需要知道奈奎斯特頻率以下所有譜線的資訊,我只要計算C訊號在10KHz、15KHz、20KHz……95KHz和100KHz等固定譜線上的幅度和相位即可!這也大大緩解了不使用FFT快速演算法帶來的計算量增加問題。下面是我所採用的具體演算法,如有不妥之處歡迎讀者和網友指正: 

(1)固定以系統可以達到的最高取樣率1MSPS進行A/D和D/A轉換,同時將演算法使用的資料長度L固定為1000個取樣點(即時長為1ms的訊號)。

(2)在記憶體中生成取樣率為1MSPS,長度L=1000個取樣點,頻率為10KHz、15KHz、20KHz……95KHz和100KHz的(共19種)正訊號:

 

以及19種餘弦訊號: 

(3)當需要校正相位誤差時(假設此時可稱為t0),就同t0時刻開始對C訊號實施長度為L=1000個取樣點,歷時1ms的取樣。取樣結果記為:  

 

(4)用取樣結果分別與19種不同頻率的正/餘弦訊號實施相關計算: 

(5)根據離散傅立葉變換(DFT)理論,由於{Sj,i}和{Cj,i}是正交的,上述兩個計算結果 與 之比等於實際訊號 中頻率為 的訊號的初始相位 的正切值。即可以透過下式計算初始相位:

(6)當然,根據題意,混合訊號C中只有可能混有兩種頻率的訊號。找到這兩種頻率的方法很簡單,就是在計算(4)式之前,先透過功率譜計算公式: 

得到所有可能得19種訊號的功率譜,再找到Pj中最大的兩個所對應的頻率即可。 

(7) 將Pj最大的兩個頻率的計算出來就是C中所含的A、B兩個訊號的相位差了。

當我把這個演算法寫完,發現這不就是軟體無線電(Software Defined Radio(SDR)中的數字正交解調嗎!仔細想想,好像還真是,這演算法就是數字相位解調(Phase demodulation)——只是載波頻率略低,以方便參賽者可以透過MCU驗證軟體無線電演算法。這道題的命題老師應該是諳熟通訊的專家,此題既幫助學生深刻的理解了DFT的定義,又有力的引出了軟體無線電的演算法核心思想,可謂用心良苦。

2)相位誤差校正的實現

(1)相位同步A/D採集

實現相位誤差校正首先要計算輸入訊號A與重建訊號A’,以及B與B’之間的相位差(以下描述以A與A’為例介紹)。如前所述,計算A與A’相位差的方法是將長度為L個點(含有整數個訊號週期)的A與A’訊號代入公式(4)。由於A’是演算法自己生成的訊號,可以直接從生成訊號的表格中讀取,不需要進行A/D採集。為簡便起見,從表格中讀取參與(4)式計算的A’訊號是從0相位開始的,因此對A訊號的取樣也需要在D/A重建的A’訊號剛好播放到0相位時開始。所以圖5所示的程式流程圖右側的迴圈相位校正部分的開始,就是迴圈等待到D/A輸出的A’訊號相位達到0相位的地方。舉例來講,我開通了DMA通道傳輸完成中斷(DMA控制D/A轉換的程式碼實現方式請參見本文第8小節的介紹),並在中斷服務程式中對全域性變數do_ad_flag1置位。中斷服務程式程式碼如下所示:

1 void DMA2_Channel3_IRQHandler(void){    
2     if(DMA_GetITStatus(DMA2_IT_TC3)) {//判斷通道2是否傳輸完成
3        DMA_ClearITPendingBit(DMA2_IT_TC3);    //清除通道2傳輸完成標誌位
4         do_ad_flag1 = 0x55;//把全域性標誌置位,表示可以同步開始AD轉換了
5      }
6 }

這樣當主程式程式碼對do_ad_flag1清零後,只需要等待到下一次do_ad_flag1被置位的時刻,就是A’訊號播放一輪L個點結束,也就是0相位的時刻。隨後就可以啟動DMA控制的A/D轉換,實現長度為L的訊號取樣(DMA控制A/D轉換的程式碼實現方式請參見本文第8小節的介紹)。

1 do_ad_flag1 = 0;//標誌啟動AD標誌清零,等待完成一次DAC的DMA傳輸中斷中置位
2 while(do_ad_flag1 == 0);//一直等待到一輪DA轉換的DMA完成,才同步開啟AD轉換的DMA
3 ADC_DMA_Config(); //啟動ADC的DMA
(2)離散餘弦變換中相關(correlation)演算法的實現

根據圖5所示的程式整體流程圖,公式(2)、(3)所示的離散餘弦變換需要在程式執行過程中不斷執行,以計算A和B訊號的初始相位。因此執行公式(2)、(3)演算法將佔去CPU的最大計算頻寬,需要儘量最佳化,以縮短執行兩次相位校正的時間間隔,達到使輸出的重建訊號和輸入訊號儘量相位同步,避免示波器訊號“顯示漂移”的目的。好在A和B可選的頻率只有19種,且可以在程式開始執行伊始就確定A和B的頻率(對應圖5中左側的流程,其演算法將在本文第6小節詳細介紹)。對A’進行相位校正時只需要計算一次公式(2)、(3)即可,即(2)、(3)中的j值是固定的。我對公式(2)、(3)的實現程式碼如下所示:

1 double corr1000_200(short* data, short* mask) {
2     double res = 0;
3     short i;
4     for(i = 0; i < 1000 ; i++)
5         res = res + (data[i] - 2048) * (mask[i%200] - 2048);//注意模版要減去直流偏置
6     return res;
7 }

其中,採集得到的訊號Ti儲存在指標*data所指向的陣列中,固定頻率的正、餘弦訊號SCj和CCj儲存在*mask所指向的陣列中。由圖3所示的電路原理圖可知,二者為了滿足MCU的A/D和D/A的要求,都是加入了Vcc/2的直流偏置電壓,在數字域對應的數值為212÷2=2048,我在計算之前減去了這個直流偏置。另外,由於正、餘弦訊號表格中的資料SCj和CCj具有周期性,我只製作了長度為200個點的表格,其他的4/5長度的資料則透過週期沿拓的方式產生,具體程式碼如上所示。至於為什麼製作長度為200個點的表格理由較複雜,推導和計算過程詳見本文第7小節。 

呼叫上面的程式碼,實現公式(2)、(3)的程式碼如下所示: 

//計算離散傅立葉變換在單個頻率點上的實部和虛部
temp_double_sin = corr1000_200(ADCConvertedValue, DAC_SIN + 200*input_frq_index[0]);
temp_double_cos = corr1000_200(ADCConvertedValue, DAC_COS + 200*input_frq_index[0]);

 其中,訊號頻率的編號儲存在陣列元素input_frq_index[0]中,編號的原則是10KHz訊號對應的編號為0, 15KHz訊號對應的編號為1, 20KHz訊號對應的編號為2,……,100KHz訊號對應的編號為18。則編號(frq_index)與真實頻率(f)的換算關係為:

 而19種不同頻率的正、餘弦資料表格的資料都存放在指標DAC_SIN和DAC_COS所指向的大表格中,並依次排放(具體資料參見本文第7小節)。那麼指向所需訊號資料的首地址的指標就是DAC_SIN + 200*input_frq_index[0]了。

在上述演算法中,都有意識的使用了double資料型別,目的一是為了防止計算中的溢位現象;而是為了簡化後續三角函式計算中的的資料型別轉換。 

(3)相位差計算 

使用公式(4)計算重建訊號A’、B’和A、B之間的相位差,其程式碼如下: 

1 temp_double_angle = atan2(temp_double_cos, temp_double_sin);

 注:正切函式影像如下所示

 

圖9 正切函式影像

 計算正切值就是已知上圖中的x值(也就是角度)來計算y值,每個x都能對應唯一的y值。但本題需要反過來使用正切函式,已知y值(也就是正切值),計算x的角度值時,就會出現多個角度都滿足正切值為y的情況。只使用中間一根曲線的來搜尋對應的x值顯然是不合理的。 

回到實際的物理意義,兩個訊號相位差可能為[-π,π]中的任意角度,只使用中間一根曲線的x軸的範圍則只可能在 [-π/2,π/2]之間,顯然有問題。 

問題發生在上圖的正切函式影像的y軸正切值——只有一個值,即正切計算三角關係的“對邊”和“臨邊”的比,這個值沒法反映“對邊”和“臨邊”究竟哪個為正數,哪個為負數。只能得出角度在[-π/2,π/2]之間的結論,也就是相角向量只能在第一和第四相限;而要使計算得到的相角在[-π,π]之間,就必須知道“對邊”和“臨邊”的符號。

具體來說,就是計算相位差時呼叫的反正切公式只能是C語言標準庫中有兩個引數的double atan2(double y, double x),而不能是隻有一個引數的double atan(double x)。 

(4)實時相位校正 

上面得到的相位差是弧度制的,而嵌入式程式只能控制D/A重建的訊號進行相對延遲,因此程式首先要將相位差折算為合理的延遲時間。具體步驟如下:

如前所述,上面得到的相位差的值域在[-π/2,π/2]之間,既有可能是相位延遲,也有可能是相位提前。當重建訊號相對於輸入訊號的相位提前時,相位差為負數,只需要將該負相位的絕對值折算為延遲時間即可。但當重建訊號的相位落後於輸入訊號時,相位差為正數,無法透過簡單的直接延遲來提前重建訊號的相位。一種可行的辦法是利用重建訊號的週期性,讓其延遲2π減去相位差,即進行一個週期的求補操作。延遲相位折算的程式碼如下。 

1 double pos_angle;//轉換為延遲0-2pi,全部為整數的角度
2 double temp_double;
3 short temp_short;
4 if(angle < 0)//atan2函式計算得到的相位差在-pi到pi,但當其小於0時,DAC輸出的訊號無法提前相位,只能將所有相位全部延遲一個週期,即進行一個週期的求補操作
5         pos_angle = -angle;
6 else
7         pos_angle = 2*3.1415926 - angle;

 其中的變數pos_angle的單位是弧度,將其折算成延遲時間的公式如(7)所示。其中的f為訊號頻率,frq_index為訊號頻率編號,其換算關係使用了公式(6)。

 為了實現精確相位調整,我直接對控制DAC和DMA重建波形的TIM6/TIM7進行延時(關於基於DMA的DAC訊號重建的程式碼,請參見本文第8小節)。為獲得最高的時間解析度,TIM6/TIM7的時鐘被配置可用的最高頻率——系統時鐘56MHz。(7)式的計算結果delay_time單位為秒(S),而實際使用的值卻是delay_time中含有多少個TIM6/TIM7時鐘週期,因此(7)式的結果應再乘以56M。化簡後得到程式碼如下:

1 temp_double = 5600*pos_angle / (3.1415926*((double)frq_index + 2));
2 temp_short = temp_double + 0.5;//轉換為整數的延遲時間,避免舍入誤差
3 return temp_short;

 注:此處提醒讀者注意,為在STM32F1系列上獲得1MSPS的A/D取樣率,本文所述的系統使用了56MHz的系統時鐘。如果直接使用本文程式碼,一定要首先將系統時鐘修改為56MHz!如果你使用的是意法半導體官方的韌體庫和程式模板,則需要再system_stm32f10x.c中,將系統時鐘配置程式碼修改如下: 

/*!< Uncomment the line corresponding to the desired System clock (SYSCLK) 

   frequency (after reset the HSI is used as SYSCLK source) */ 

//#define SYSCLK_FREQ_HSE    HSE_Value 

//#define SYSCLK_FREQ_20MHz  20000000 

//#define SYSCLK_FREQ_36MHz  36000000

//#define SYSCLK_FREQ_48MHz  48000000

#define SYSCLK_FREQ_56MHz  56000000

//#define SYSCLK_FREQ_72MHz  72000000 

言歸正傳,上面返回的計算結果temp_short是整數型,這樣做的目的是方便將其寫入TIM6的定時暫存器。而在進行資料型別轉換之前在temp_double基礎上加了0.5是為了防止舍入誤差,以實現浮點型向整數型轉換過程中的四捨五入操作。

TIM6是DAC1重建A’的定時器,這裡使用了一個對定時器定時時間延遲更精確的小技巧:直接向當前定時數值中增加需要延遲的時鐘數其程式碼如下。(注:上一段程式碼中計算得到的延遲時間,此時被轉存到了陣列delay_times[]的各個元素中。

1 temp_int = TIM6->CNT;
2 temp_int = temp_int + 65535 - delay_times[0];
3 TIM6->CNT = temp_int;

相對應的,如果要實現對B’訊號的相位校正,就要向控制DAC2的取樣間隔的TIM7中增加延遲時鐘數了,這裡不再給出原始碼。

本環節揭示的訊號處理和嵌入式系統教學中的問題: 

a) 《訊號與系統》和《數字訊號處理》教學中對於相位譜的講解不如功率譜深入,這可能是由於相位譜的物理意義不清晰造成的,但至少在通訊領域相位譜具有非常明確的物理意義和使用價值,值得《訊號與系統》和《數字訊號處理》的任課教師考慮花費學時強調一下。教學中,本例可以作為很好的一個相位譜應用的例項。

b) 可以發現,最近幾屆電賽題正在迴歸電子“設計”本身。作為電子電工教學的“指揮棒”,賽題變得更加貼近我國本科教學的實際,迴歸基本原理、基本技能;放棄對新型元件、新方法的一味偏執追求。以本賽題為例:用離散傅立葉變換實現相位調製的解調是屬於《訊號與系統》、《數字訊號處理》和《通訊原理》等課程中需要學生理解和掌握的基本理論,對這些理論的掌握和應用能力就是求解此題的必備技能。但為了防止參賽者使用現成軟體無線電方案(多基於FPGA或專用ASIC晶片),造成不公平現象,本賽題使用了較低的訊號頻率。這種做法有效的避免了參賽隊將精力放在“術”的層面;而是把精力集中在學習本科階段必須掌握的基本技能,以及提高解決複雜工程問題的能力,這些“道”層面的東西上
這也提示我們作為基層電子電工教學工作者,不應該把過多的精力放在講解FPGA使用的操作流程或者某個具體晶片的配置流程這些花哨的“雕蟲小技”,而應該不斷抓牢基本原理、基本技能和解決複雜工程問題這些重點上。

c) 學生缺乏對演算法複雜度的估計能力,這一方面源於學生的工程不足。但更重要的原因是“雙師型”教師缺乏,沒有相當的工程經驗的教師很難對自己設計演算法的計算量進行有效估計,更難交給學生對演算法複雜度進行估算的習慣和方法。

6.  輸入訊號C中混合的A、B的頻率和種類的判斷

 1)頻率的判斷

C中混雜的兩個分量A、B的頻率只有可能是10KHz、15KHz……100KHz等共19種,所以對大多數參賽者而言,識別它們都不是一件特別困難的事。有同學使用FFT,當然也可以使用相關計算DFT。我自己在做的時候猶豫了一下,後來還是胡廣書老師書中的話(圖8)影響了我——如果使用長度L為2的整數次冪(如1024)點的FFT,則L內的資料對於所有19種頻率都不剛好含有整數個週期,那麼勢必造成轉換結果的頻譜能量洩露。也就是不能以功率譜中單個點的幅度來代表訊號在某個頻率上的總能量,而要使用頻譜中至少2-3個相鄰點的功率之和,才能代表輸入訊號在單個頻率上的功率。這種演算法對於只有正弦輸入的“基本要求”部分沒有多大影響。但如果考慮“發揮部分”可能的三角波輸入,就不得不考慮三角波在奇次諧波上的諧波失真和基頻訊號的疊加可能對功率譜的影響。

因此我決定仍然採用L=1000的DFT來計算訊號在19個指定頻率頻點上的功率。此時由於時域長度為L=1000的訊號中,含有的所有訊號都是整數個週期,訊號的所有頻譜只會有一根譜線。在計算時無需像使用FFT演算法一樣,取相鄰幾個頻點的功率,得到的功率值將更準確;在輸入訊號有可能是三角波時也不容易和其三次諧波混淆。加上前面所述的相位差演算法中已經有了實現(2)、(3)兩式的程式碼,只要再增加實現(5)式的程式碼即可。

1 //計算IQ分量的模的長度
2 double modulus(double I, double Q){
3     double temp_double;
4     temp_double = sqrt(I*I + Q*Q);
5     return temp_double;
6 }

DFT計算兩個輸入訊號頻率的程式碼羅列與下面,供網友參考。

 1 void cal_2frqs(unsigned char* frq)//計算參與疊加的兩個正弦訊號的頻率
 2 {
 3     double corr_sin_double;//用於存放C與所有19種正弦相關計算的結果
 4     double corr_cos_double;//用於存放C與所有19種餘弦相關計算的結果
 5     double mag[19];//用於存放輸入訊號與所有19種訊號相關計算的模
 6     double temp_double[19],sort_temp;
 7     unsigned char i,j,temp_char;
 8     for(i = 0; i < 19 ; i++)
 9     {
10         corr_sin_double = corr1000_200(ADCConvertedValue, DAC_SIN + 200*i);
11         corr_cos_double = corr1000_200(ADCConvertedValue, DAC_COS + 200*i);
12         mag[i] = modulus(corr_sin_double, corr_cos_double);
13         temp_double[i] = mag[i]; 
14     }
15     //冒泡法對大小進行排序
16     for (i = 0; i < 19 - 1; i++)
17     {
18         for (j = 0; j < 19 - i - 1; j++){
19                 if (temp_double[j] < temp_double[j+1]){
20                         sort_temp = temp_double[j];
21                         temp_double[j] = temp_double[j+1];
22                         temp_double[j+1] = sort_temp;
23                 }
24             }
25     }
26     //尋找最大值序號
27     for (i = 0; i < 19; i++){
28         if(mag[i] == temp_double[0])//找到最大數
29             frq[0] = i;
30         if(mag[i] == temp_double[1])//找到第二大數
31             frq[1] = i;
32     }
33     if(frq[0] > frq[1]) {//把頻率低的放在第一個位置,如果顛倒就換一下
34         temp_char = frq[0];
35         frq[0] = frq[1];
36         frq[1] = temp_char;
37     }
38 }

其中,值得注意的是計算出所有的19個相關結果的模後,我用冒泡法對這些模進行了排序。而這個冒泡法排序的程式碼是百度“文心一言”寫的,不得不說這提高了對資料結構不太熟悉的人的程式設計速度。然後逐一搜尋找到了最大的兩個的模所在的頻率編號i,並把它們放到了陣列frq[ ]中。囉嗦一句,至此放在frq[ ]中的編號和實際頻率之間的對應關係為公式(6)。而上述函式真實透過向形式引數指標所指向的陣列寫入數值的方式向外傳遞計算結果的。

該函式的最後,還對frq[0]和frq[1]中儲存的頻率編號進行了調整,使較低頻率的訊號放在frq[0]中,這樣做的目的使D/A轉換器1輸出的訊號頻率永遠小於D/A轉換器2輸出的訊號頻率。

2)訊號種類(正弦或三角波)的判斷

“發揮部分”要求參賽者能夠判斷A和B訊號究竟是正弦波還是三角波。從理論上講這也並不困難——三角波在奇次諧波上存在諧波分量。為簡便起見,我選擇對3次諧波的能量進行計算——並將其與基頻功率進行比較,當達到一定比例時就認為這些頻點上存在諧波失真,也就是輸入是三角波。這就要求程式能夠計算頻率在30KHz,45KHz,……,250KHz,275KHz,300KHz頻率位置的功率譜,如果繼續使用前述的不帶快速演算法的DFT,就還要給出上面這些頻點的正、餘弦資料,也就需要在現有的正、餘弦資料表的基礎上,還要增加100KHz頻率以上的訊號資料表。

而使用FFT則可以直接得到奈奎斯特頻率以下的所有譜線功率,因此我偷了個懶,直接使用了FFT。為使訊號長度為2的整數次冪,以方便FFT計算,我將DMA控制A/D取樣的長度增加到1024。由於1024點的資料不可能含有整數個波形,頻譜的能量也不會集中在一根譜線上。下表所示的是FFT長度為1024個點時,我們感興趣的三次諧波譜線在FFT結果陣列中的位置。

 

表1 三次諧波頻率在FFT結果中的位置

 

三次諧波頻率(KHz)

三次諧波頻率是奈奎斯特頻率的倍數

1024點FFT所在的點(位置)

30

0.06

30.72

45

0.09

46.08

60

0.12

61.44

75

0.15

76.8

90

0.18

92.16

105

0.21

107.52

120

0.24

122.88

135

0.27

138.24

150

0.3

153.6

165

0.33

168.96

180

0.36

184.32

195

0.39

199.68

210

0.42

215.04

225

0.45

230.4

240

0.48

245.76

255

0.51

261.12

270

0.54

276.48

285

0.57

291.84

300

0.6

307.2

 

頻率解析度(Hz)

0.9765625

可以發現,感興趣的頻點並不一定在整數點上。為防止相鄰譜線中的能量洩露導致的問題,對感興趣頻率譜線位置周邊3個相鄰點的功率進行了求和

不過上述演算法存在一個重大漏洞:當被測訊號C中混合的A、B兩個單頻訊號中的一個的頻率剛好是另一個訊號頻率的3倍時(例如A為10KHz,B為30KHz時),低頻訊號的3次諧波會和較高頻率訊號的能量混淆在一起,從而使演算法是無法判斷低頻訊號是三角波還是正弦波的。但幸運的是,根據題意這種情況只會出現在三次諧波頻率低於最高頻率100KHz的情況下。具體來說會在(1)低頻訊號是10KHz,高頻訊號是30KHz;(2)低頻訊號是15KHz,高頻訊號是45KHz;(3)低頻訊號是20KHz,高頻訊號是60KHz;(4)低頻訊號是25KHz,高頻訊號是75KHz;(5)低頻訊號是30KHz,高頻訊號是90KHz。共五種情況下出現這個問題。

我在上述五種情況下,對低頻訊號的五次諧波進一步進行判斷,方法與其他頻點上對三次諧波的判斷相同。

下面是我使用意法半導體提供的STM32F1的DSP庫進行波形種類識別的函式程式碼。 

 1 void     fft_cal_2types(unsigned char* frq, unsigned char* wave_type)//根據輸入訊號及已經判斷出來的頻率值,透過FFT結果判斷訊號型別是三角波(1)還是正弦波(0)
 2 //第一個引數指標指向的陣列,其中存放的是之前的其他函式計算出來的兩個訊號的頻率
 3 //第二個引數指正指向的陣列用於存放這兩個訊號的波形種類,0為正弦,其他值為三角波。需要在本函式中計算產生
 4 {
 5     short indata[2048],outdata[2048],i;
 6     int mag[512],sum=0,average;
 7     unsigned short index;//輸入訊號的頻率對應的索引值
 8     unsigned short harmo3_index,harmo5_index;//輸入訊號三次和五次諧波頻率對應的索引值
 9     float temp_float;
10     float mag_1harmo,mag_3harmo,k;//一次和三次諧波上的能量及其比值
11     float mag_5harmo;//五次諧波上的能量
12     _Bool conti;
13 
14     for(i = 0; i < 1024 ; i++)//計算訊號平均值
15         sum = sum + ADCConvertedValue[i];
16     average = sum/1024;
17     for(i = 0; i < 1024 ; i++)
18     {
19         indata[2*i] = ADCConvertedValue[i] - average;//減去平均值是為了降低直流分量
20         indata[2*i + 1] = 0;
21     }
22     cr4_fft_1024_stm32(outdata, indata, 1024);//注意閱讀關於輸入輸出資料存放格式的描述    
23     for(i = 0; i < 512 ; i++)//FFT結果幅度譜是左右對稱的,只需要算一半
24         mag[i] = outdata[2*i] * outdata[2*i] + outdata[2*i + 1] * outdata[2*i + 1];//sqrt(outdata[2*i] * outdata[2*i] + outdata[2*i + 1] * outdata[2*i + 1]);
25     
26     //////////計算輸入訊號頻率及其三次諧波頻率對應在FFT結果陣列中的索引值//////////
27     //////初步判斷第一個訊號的型別//////////////
28     temp_float = (float)frq[0]*5 + 10;//計算輸入索引值所對應的真實頻率,單位為KHz
29     temp_float = temp_float / 500;    //取樣率為1MSPS,則輸入頻率是奈奎斯特頻率的多少倍
30     temp_float = temp_float * 512;    //計算輸入訊號頻率對應的陣列索引
31     index = temp_float + 0.5;//進行四捨五入取整
32     
33     temp_float = (float)frq[0]*5 + 10;//計算輸入索引值所對應的真實頻率,單位為KHz
34     temp_float = temp_float / 500;    //取樣率為1MSPS,則輸入頻率是奈奎斯特頻率的多少倍
35     temp_float = temp_float *3 * 512;    //計算三倍基頻對應的陣列索引
36     harmo3_index = temp_float + 0.5;//進行四捨五入取整    
37     
38     mag_1harmo = mag[index-1] +  mag[index] +  mag[index+1];
39     mag_3harmo = mag[harmo3_index-1] +  mag[harmo3_index] +  mag[harmo3_index+1];
40     k = mag_1harmo/mag_3harmo;
41     if(k > 300)
42         wave_type[0] = 0;//三次諧波較小,說明是正弦波
43     else
44         wave_type[0] = 1;//三次諧波較大,說明是三角波
45     //////////初步判斷第二個訊號的型別////////////////
46     temp_float = (float)frq[1]*5 + 10;//計算輸入索引值所對應的真實頻率,單位為KHz
47     temp_float = temp_float / 500;    //取樣率為1MSPS,則輸入頻率是奈奎斯特頻率的多少倍
48     temp_float = temp_float * 512;    //計算輸入訊號頻率對應的陣列索引
49     index = temp_float + 0.5;//進行四捨五入取整
50     
51     temp_float = (float)frq[1]*5 + 10;//計算輸入索引值所對應的真實頻率,單位為KHz
52     temp_float = temp_float / 500;    //取樣率為1MSPS,則輸入頻率是奈奎斯特頻率的多少倍
53     temp_float = temp_float *3 * 512;    //計算三倍基頻對應的陣列索引
54     harmo3_index = temp_float + 0.5;//進行四捨五入取整    
55 
56     mag_1harmo = mag[index-1] +  mag[index] +  mag[index+1];
57     mag_3harmo = mag[harmo3_index-1] +  mag[harmo3_index] +  mag[harmo3_index+1];
58     k = mag_1harmo/mag_3harmo;
59     if(k > 300)
60         wave_type[1] = 0;//三次諧波較小,說明是正弦波
61     else
62         wave_type[1] = 1;//三次諧波較大,說明是三角波
63     
64     ////////對第二個訊號剛好等於第一個訊號三倍頻率特殊情況,需要重新判斷第一個訊號的型別/////
65     //上面的初步判斷算有問題的是:第二個訊號四第一個訊號三倍頻率的情況,只有可能包括:
66     //1、第一個訊號是10K,第二個訊號是30K
67     //2、第一個訊號是15K,第二個訊號是45K
68     //3、第一個訊號是20K,第二個訊號是60K
69     //4、第一個訊號是25K,第二個訊號是75K
70     //5、第一個訊號是30K,第二個訊號是90K
71     conti = ((frq[0] == 0)&(frq[1] == 4))|((frq[0] == 1)&(frq[1] == 7))|((frq[0] == 2)&(frq[1] == 10))|((frq[0] == 3)&(frq[1] == 13))|((frq[0] == 4)&(frq[1] == 16));
72     if(conti)
73     {
74             //計算五次諧波能量和1次諧波能量之比
75             temp_float = (float)frq[0]*5 + 10;//計算輸入索引值所對應的真實頻率,單位為KHz
76             temp_float = temp_float / 500;    //取樣率為1MSPS,則輸入頻率是奈奎斯特頻率的多少倍
77             temp_float = temp_float * 512;    //計算輸入訊號頻率對應的陣列索引
78             index = temp_float + 0.5;//進行四捨五入取整
79             mag_1harmo = mag[index-1] +  mag[index] +  mag[index+1];
80             temp_float = (float)frq[0]*5 + 10;//計算輸入索引值所對應的真實頻率,單位為KHz
81             temp_float = temp_float / 500;    //取樣率為1MSPS,則輸入頻率是奈奎斯特頻率的多少倍
82             temp_float = temp_float * 5 * 512;    //計算5倍基頻對應的陣列索引
83             harmo5_index = temp_float + 0.5;//進行四捨五入取整    
84             mag_5harmo = mag[harmo5_index-1] +  mag[harmo5_index] +  mag[harmo5_index+1];
85             k = mag_1harmo/mag_5harmo;
86             if(k > 500)
87                 wave_type[0] = 0;//5次諧波較小,說明是正弦波
88             else
89                 wave_type[0] = 1;//5次諧波較大,說明是三角波
90     }
91 }

 這段程式碼中應注意到:

(1)由於STM32的A/D轉換器只能接受正電壓,注意上面的程式碼在進行FFT之前,首先對所有訊號減去了它們的平均值(即直流偏置),目的是去除FFT頻譜中的直流分量。

(2)官方庫的FFT函式的輸入是複數,而本題輸入的時域訊號只有實部,因此將輸入陣列indata[ ]的奇數地址全部置0。

(3)各個頻率諧波在FFT結果中對應的位置計算中,我首先使用浮點型來保持其精度,然後根據C語言強制型別轉換的方式是捨棄法的特點。我在強制型別轉換為整形之前,對其進行了+0.5的操作。

(4)根據真實測試的結果總結,我取三次諧波mag_3harmo大於一次諧波mag_1harmo的1/300時就認為這個頻點上的訊號是三角波。

(4)布林型變數conti的值conti = ((frq[0] == 0)&(frq[1] == 4))|((frq[0] == 1)&(frq[1] == 7))|((frq[0] == 2)&(frq[1] == 10))|((frq[0] == 3)&(frq[1] == 13))|((frq[0] == 4)&(frq[1] == 16));代表了較高頻訊號的頻率是否剛好等於低頻訊號的三倍(即上述5中特殊情況),而對於五次諧波的判斷標準則被降低到基波能量的1/500。

(5)fft_cal_type()函式使用的記憶體遠遠大於MDK啟動檔案中分配給“棧”的空間,這將造成記憶體溢位錯誤。關於堆和棧記憶體重新分配的問題,請參見本文第10小節的描述和講解。

本環節揭示出的訊號處理、嵌入式系統教學中的問題:

a) 大模型(ChatGPT、通義千問、文心一言)的程式設計功能,必將對嵌入式系統和訊號處理類課程產生深遠的影響。人類歷史一再證明,對於新工具採取對抗態度的人必將被時代淘汰!與其禁止學生使用大模型工具程式設計,不如持開放態度。至少在目前的階段,大模型還無法直接歸納、總結和創造如本題這樣複雜工程問題的整體解決方案。何不將學生從“冒泡法”這樣相對較死的問題中解放出來去思考更有意義的問題。但反過來講,在教學中照本宣科,講解“冒泡法”這種固定答案問題的課程,可能也到了不得不“死”的時代。

b) 教學中對於常見的嵌入式系統功能韌體庫講解和實驗不足。例如本題用到的DSP庫或安全加密庫Cryptographic library都是解決複雜問題時常用的韌體庫,有必要在教學中新增重要的官方韌體庫使用的教學內容。但這些庫的使用涉及除嵌入式系統外的知識,適合放在相關專業必修和專業選修課中作為課程設計或專業實習的內容。
目前一種合理的課程體系設計方案是將選修課分為不同方向的“課程群”,這樣做就可以將相關韌體庫的教學內容放在課程群的綜合實踐環節來進行了。例如,DSP庫可以放在訊號處理選修課程的綜合實踐環節;乙太網應用庫和Cryptographic庫則可以放在網路及其安全課程群等等。 

7.  正、餘弦常數表的產生和計算 

 如前所述的(2)、(3)兩式所示的離散傅立葉變換的計算,需要知道知道正、餘弦常數表格{Sj,i}和{Cj,i}。當然你可以根據上一節所示的計算公式呼叫正、餘弦函式來實時地計算這些常數。但由於(2)、(3)兩式的計算是本題程式中耗時最多、最頻繁呼叫的計算,在(2)、(3)兩式中實時計算{Sj,i}和{Cj,i}會使整個演算法的複雜度提高2個以上的數量級!

1)常見的解決辦法

常見的解決辦法有二:

其一,將所有的

 全部用MATLAB或Python等工具事先算出,並把它們事先存放在MCU的RAM當中,使用時再用“查表法”逐一讀出。

其二,只在MCU的RAM中儲存一張長度為1000個點(或更長)的正弦數值表格,並在需要{Sj,i}和{Cj,i}數值時呼叫DDS(Direct Digital Frequency Synthesis)演算法來生成不同頻率(由常數j代表)的正、餘弦訊號數值。

方法一的優點是簡單粗暴、實現容易,且節約了方法二中DDS演算法生成查表地址的時間。同時,方法一的缺點是將佔用數十倍於方法二的RAM儲存空間。另外,我還覺得:在本題中,離散餘弦變換隻需要在指定頻點上進行,能夠生成連續可調頻率的DDS演算法有“殺雞用牛刀”的嫌疑;且DDS演算法在生成訊號時使用鄰近位置的數值代替本點數值的方法,會對生成正、餘弦訊號的訊雜比有一定的損失。好在當代MCU的RAM空間往往達到數十到數百KB,基本具備了實現方法一的硬體條件。(注:也許有網友想把表格用const關鍵詞修飾,放到MCU的Flash中。但這樣做有可能導致D/A播放波形時DMA訪問速度降低(STM32的Flash訪問寬度時64bits,關於這個問題大家可以參閱我寫的教科書)。因此我並未使用這種方法,大家可以自行嘗試一下。)

2)正、餘弦常數表的生成

為在(2)、(3)兩式中正、餘弦常數{Sj,i}和{Cj,i},正餘弦常數表中儲存的波形應該與上一節“相位誤差演算法理論分析”中提到的取樣訊號相同:取樣率fs,擷取長度L,擷取時長內週期數K和A、B訊號頻率f之間必須滿足(1)式。當fs為1MSPS、L為1000,f分別等於題目要求的10KHz、15KHz、20KHz……95KHz和100KHz時,可得到長度為L的表格中正弦週期數K分別為:10、15、20、25、30、35、40、45、50、55、60、65、70、75、80、85、90、95、100。當頻率一定時,正、餘弦週期內的波形資料完全相同;但不同頻率下的正、餘弦週期內的數值卻不盡相同。即頻率為10KHz時K=10個波形的數值完全相同;15KHz時K=15個波形的數值完全相同;……。而相同的波形數值只需要儲存一次即可,不必真的儲存10個、15個……95個週期的資料。否則,資料表格佔用的RAM數量將達到2×19×1000=38K個資料點,以每個點2位元組計,可達72KB,這已經超過了大多數MCU的RAM容量。而計算時不足需的其他資料則透過週期延拓產生

那麼問題來了,如果真的只為每種頻率的訊號儲存長度為一個週期的訊號,那麼這些表格的長度不相等。從而造成對不同頻率的訊號計算(2)、(3)兩式使用的程式不盡相同,很難實現通用於所有輸入頻率的程式碼。我耍個小聰明:計算所有K值的最大公約數——為5,因此只需要為每種波形資料儲存L÷5=200個點的資料即可滿足要求!因為在200個資料點中,所有可能頻率的週期數都是整數。這樣RAM中儲存的10KHz的訊號含有2個完整週期,15KHz的訊號含有3個完整週期,20KHz的訊號含有4個完整週期,……,95KHz的訊號含有19個完整週期,100KHz的訊號含有20個完整週期。

另外,為降低計算的複雜度,提升計算時間,我使用定點計算方法來實現(2)、(3)兩式。其中的A/D轉換結果{Tj,i}已經是定點數,還需要將正、餘弦常數表也轉換為兩位元組無符號的unsigned short型別。我使用下面的MATLAB程式碼來實現。其中2048是12位無極性A/D轉換器輸出數值的中值。而1500是表中儲存的正餘弦資料的幅度。

N=200;
i=1:N;
s_sin10k = round(1500*sin(2*pi*i/N*2) + 2048);%10K訊號對應每200個點(取樣率為1MSPS)內有兩個正弦週期
s_sin15k = round(1500*sin(2*pi*i/N*3) + 2048);%15K訊號對應每200個點(取樣率為1MSPS)內有3個正弦週期
s_sin20k = round(1500*sin(2*pi*i/N*4) + 2048);%20K訊號對應每200個點(取樣率為1MSPS)內有4個正弦週期
s_sin25k = round(1500*sin(2*pi*i/N*5) + 2048);%25K訊號對應每200個點(取樣率為1MSPS)內有5個正弦週期
s_sin30k = round(1500*sin(2*pi*i/N*6) + 2048);%30K訊號對應每200個點(取樣率為1MSPS)內有6個正弦週期
s_sin35k = round(1500*sin(2*pi*i/N*7) + 2048);%35K訊號對應每200個點(取樣率為1MSPS)內有7個正弦週期
s_sin40k = round(1500*sin(2*pi*i/N*8) + 2048);%40K訊號對應每200個點(取樣率為1MSPS)內有8個正弦週期
s_sin45k = round(1500*sin(2*pi*i/N*9) + 2048);%45K訊號對應每200個點(取樣率為1MSPS)內有9個正弦週期
s_sin50k = round(1500*sin(2*pi*i/N*10) + 2048);%50K訊號對應每200個點(取樣率為1MSPS)內有10個正弦週期
s_sin55k = round(1500*sin(2*pi*i/N*11) + 2048);%55K訊號對應每200個點(取樣率為1MSPS)內有11個正弦週期
s_sin60k = round(1500*sin(2*pi*i/N*12) + 2048);%60K訊號對應每200個點(取樣率為1MSPS)內有12個正弦週期
s_sin65k = round(1500*sin(2*pi*i/N*13) + 2048);%65K訊號對應每200個點(取樣率為1MSPS)內有13個正弦週期
s_sin70k = round(1500*sin(2*pi*i/N*14) + 2048);%70K訊號對應每200個點(取樣率為1MSPS)內有15個正弦週期
s_sin75k = round(1500*sin(2*pi*i/N*15) + 2048);%75K訊號對應每200個點(取樣率為1MSPS)內有15個正弦週期
s_sin80k = round(1500*sin(2*pi*i/N*16) + 2048);%80K訊號對應每200個點(取樣率為1MSPS)內有16個正弦週期
s_sin85k = round(1500*sin(2*pi*i/N*17) + 2048);%85K訊號對應每200個點(取樣率為1MSPS)內有17個正弦週期
s_sin90k = round(1500*sin(2*pi*i/N*18) + 2048);%90K訊號對應每200個點(取樣率為1MSPS)內有18個正弦週期
s_sin95k = round(1500*sin(2*pi*i/N*19) + 2048);%95K訊號對應每200個點(取樣率為1MSPS)內有19個正弦週期
s_sin100k = round(1500*sin(2*pi*i/N*20) + 2048);%100K訊號對應每200個點(取樣率為1MSPS)內有20個正弦週期

s_cos10k = round(1500*cos(2*pi*i/N*2) + 2048);%10K訊號對應每200個點(取樣率為1MSPS)內有兩個正弦週期
s_cos15k = round(1500*cos(2*pi*i/N*3) + 2048);%15K訊號對應每200個點(取樣率為1MSPS)內有3個正弦週期
s_cos20k = round(1500*cos(2*pi*i/N*4) + 2048);%20K訊號對應每200個點(取樣率為1MSPS)內有4個正弦週期
s_cos25k = round(1500*cos(2*pi*i/N*5) + 2048);%25K訊號對應每200個點(取樣率為1MSPS)內有5個正弦週期
s_cos30k = round(1500*cos(2*pi*i/N*6) + 2048);%30K訊號對應每200個點(取樣率為1MSPS)內有6個正弦週期
s_cos35k = round(1500*cos(2*pi*i/N*7) + 2048);%35K訊號對應每200個點(取樣率為1MSPS)內有7個正弦週期
s_cos40k = round(1500*cos(2*pi*i/N*8) + 2048);%40K訊號對應每200個點(取樣率為1MSPS)內有8個正弦週期
s_cos45k = round(1500*cos(2*pi*i/N*9) + 2048);%45K訊號對應每200個點(取樣率為1MSPS)內有9個正弦週期
s_cos50k = round(1500*cos(2*pi*i/N*10) + 2048);%50K訊號對應每200個點(取樣率為1MSPS)內有10個正弦週期
s_cos55k = round(1500*cos(2*pi*i/N*11) + 2048);%55K訊號對應每200個點(取樣率為1MSPS)內有11個正弦週期
s_cos60k = round(1500*cos(2*pi*i/N*12) + 2048);%60K訊號對應每200個點(取樣率為1MSPS)內有12個正弦週期
s_cos65k = round(1500*cos(2*pi*i/N*13) + 2048);%65K訊號對應每200個點(取樣率為1MSPS)內有13個正弦週期
s_cos70k = round(1500*cos(2*pi*i/N*14) + 2048);%70K訊號對應每200個點(取樣率為1MSPS)內有15個正弦週期
s_cos75k = round(1500*cos(2*pi*i/N*15) + 2048);%75K訊號對應每200個點(取樣率為1MSPS)內有15個正弦週期
s_cos80k = round(1500*cos(2*pi*i/N*16) + 2048);%80K訊號對應每200個點(取樣率為1MSPS)內有16個正弦週期
s_cos85k = round(1500*cos(2*pi*i/N*17) + 2048);%85K訊號對應每200個點(取樣率為1MSPS)內有17個正弦週期
s_cos90k = round(1500*cos(2*pi*i/N*18) + 2048);%90K訊號對應每200個點(取樣率為1MSPS)內有18個正弦週期
s_cos95k = round(1500*cos(2*pi*i/N*19) + 2048);%95K訊號對應每200個點(取樣率為1MSPS)內有19個正弦週期
s_cos100k = round(1500*cos(2*pi*i/N*20) + 2048);%100K訊號對應每200個點(取樣率為1MSPS)內有20個正弦週期

 現將上述MATLAB指令碼得到的正餘弦表羅列於下,共後繼參賽者培訓時直接取用。 

2023全國大學生電子設計競賽H題全解 [原創www.cnblogs.com/helesheng]
 1 short  DAC_SIN[200*19] = 
 2 {//DAC正弦緩衝區,每行 200點。第一行有2個正弦波,第三行有4個……第19行有20個
 3     2142,2236,2329,2421,2512,2600,2687,2771,2852,2930,3004,3075,3141,3204,3262,3314,3362,3405,3443,3475,3501,3521,3536,3545,3548,3545,3536,3521,3501,3475,3443,3405,3362,3314,3262,3204,3141,3075,3004,2930,2852,2771,2687,2600,2512,2421,2329,2236,2142,2048,1954,1860,1767,1675,1584,1496,1409,1325,1244,1166,1092,1021,955,892,834,782,734,691,653,621,595,575,560,551,548,551,560,575,595,621,653,691,734,782,834,892,955,1021,1092,1166,1244,1325,1409,1496,1584,1675,1767,1860,1954,2048,2142,2236,2329,2421,2512,2600,2687,2771,2852,2930,3004,3075,3141,3204,3262,3314,3362,3405,3443,3475,3501,3521,3536,3545,3548,3545,3536,3521,3501,3475,3443,3405,3362,3314,3262,3204,3141,3075,3004,2930,2852,2771,2687,2600,2512,2421,2329,2236,2142,2048,1954,1860,1767,1675,1584,1496,1409,1325,1244,1166,1092,1021,955,892,834,782,734,691,653,621,595,575,560,551,548,551,560,575,595,621,653,691,734,782,834,892,955,1021,1092,1166,1244,1325,1409,1496,1584,1675,1767,1860,1954,2048,
 4     2189,2329,2466,2600,2729,2852,2967,3075,3173,3262,3339,3405,3459,3501,3530,3545,3547,3536,3512,3475,3425,3362,3289,3204,3109,3004,2891,2771,2644,2512,2375,2236,2095,1954,1813,1675,1540,1409,1284,1166,1056,955,863,782,711,653,608,575,555,548,555,575,608,653,711,782,863,955,1056,1166,1284,1409,1540,1675,1813,1954,2095,2236,2375,2512,2644,2771,2891,3004,3109,3204,3289,3362,3425,3475,3512,3536,3547,3545,3530,3501,3459,3405,3339,3262,3173,3075,2967,2852,2729,2600,2466,2329,2189,2048,1907,1767,1630,1496,1367,1244,1129,1021,923,834,757,691,637,595,566,551,549,560,584,621,671,734,807,892,987,1092,1205,1325,1452,1584,1721,1860,2001,2142,2283,2421,2556,2687,2812,2930,3040,3141,3233,3314,3385,3443,3488,3521,3541,3548,3541,3521,3488,3443,3385,3314,3233,3141,3040,2930,2812,2687,2556,2421,2283,2142,2001,1860,1721,1584,1452,1325,1205,1092,987,892,807,734,671,621,584,560,549,551,566,595,637,691,757,834,923,1021,1129,1244,1367,1496,1630,1767,1907,2048,
 5     2236,2421,2600,2771,2930,3075,3204,3314,3405,3475,3521,3545,3545,3521,3475,3405,3314,3204,3075,2930,2771,2600,2421,2236,2048,1860,1675,1496,1325,1166,1021,892,782,691,621,575,551,551,575,621,691,782,892,1021,1166,1325,1496,1675,1860,2048,2236,2421,2600,2771,2930,3075,3204,3314,3405,3475,3521,3545,3545,3521,3475,3405,3314,3204,3075,2930,2771,2600,2421,2236,2048,1860,1675,1496,1325,1166,1021,892,782,691,621,575,551,551,575,621,691,782,892,1021,1166,1325,1496,1675,1860,2048,2236,2421,2600,2771,2930,3075,3204,3314,3405,3475,3521,3545,3545,3521,3475,3405,3314,3204,3075,2930,2771,2600,2421,2236,2048,1860,1675,1496,1325,1166,1021,892,782,691,621,575,551,551,575,621,691,782,892,1021,1166,1325,1496,1675,1860,2048,2236,2421,2600,2771,2930,3075,3204,3314,3405,3475,3521,3545,3545,3521,3475,3405,3314,3204,3075,2930,2771,2600,2421,2236,2048,1860,1675,1496,1325,1166,1021,892,782,691,621,575,551,551,575,621,691,782,892,1021,1166,1325,1496,1675,1860,2048,
 6     2283,2512,2729,2930,3109,3262,3385,3475,3530,3548,3530,3475,3385,3262,3109,2930,2729,2512,2283,2048,1813,1584,1367,1166,987,834,711,621,566,548,566,621,711,834,987,1166,1367,1584,1813,2048,2283,2512,2729,2930,3109,3262,3385,3475,3530,3548,3530,3475,3385,3262,3109,2930,2729,2512,2283,2048,1813,1584,1367,1166,987,834,711,621,566,548,566,621,711,834,987,1166,1367,1584,1813,2048,2283,2512,2729,2930,3109,3262,3385,3475,3530,3548,3530,3475,3385,3262,3109,2930,2729,2512,2283,2048,1813,1584,1367,1166,987,834,711,621,566,548,566,621,711,834,987,1166,1367,1584,1813,2048,2283,2512,2729,2930,3109,3262,3385,3475,3530,3548,3530,3475,3385,3262,3109,2930,2729,2512,2283,2048,1813,1584,1367,1166,987,834,711,621,566,548,566,621,711,834,987,1166,1367,1584,1813,2048,2283,2512,2729,2930,3109,3262,3385,3475,3530,3548,3530,3475,3385,3262,3109,2930,2729,2512,2283,2048,1813,1584,1367,1166,987,834,711,621,566,548,566,621,711,834,987,1166,1367,1584,1813,2048,
 7     2329,2600,2852,3075,3262,3405,3501,3545,3536,3475,3362,3204,3004,2771,2512,2236,1954,1675,1409,1166,955,782,653,575,548,575,653,782,955,1166,1409,1675,1954,2236,2512,2771,3004,3204,3362,3475,3536,3545,3501,3405,3262,3075,2852,2600,2329,2048,1767,1496,1244,1021,834,691,595,551,560,621,734,892,1092,1325,1584,1860,2142,2421,2687,2930,3141,3314,3443,3521,3548,3521,3443,3314,3141,2930,2687,2421,2142,1860,1584,1325,1092,892,734,621,560,551,595,691,834,1021,1244,1496,1767,2048,2329,2600,2852,3075,3262,3405,3501,3545,3536,3475,3362,3204,3004,2771,2512,2236,1954,1675,1409,1166,955,782,653,575,548,575,653,782,955,1166,1409,1675,1954,2236,2512,2771,3004,3204,3362,3475,3536,3545,3501,3405,3262,3075,2852,2600,2329,2048,1767,1496,1244,1021,834,691,595,551,560,621,734,892,1092,1325,1584,1860,2142,2421,2687,2930,3141,3314,3443,3521,3548,3521,3443,3314,3141,2930,2687,2421,2142,1860,1584,1325,1092,892,734,621,560,551,595,691,834,1021,1244,1496,1767,2048,
 8     2375,2687,2967,3204,3385,3501,3547,3521,3425,3262,3040,2771,2466,2142,1813,1496,1205,955,757,621,555,560,637,782,987,1244,1540,1860,2189,2512,2812,3075,3289,3443,3530,3545,3488,3362,3173,2930,2644,2329,2001,1675,1367,1092,863,691,584,548,584,691,863,1092,1367,1675,2001,2329,2644,2930,3173,3362,3488,3545,3530,3443,3289,3075,2812,2512,2189,1860,1540,1244,987,782,637,560,555,621,757,955,1205,1496,1813,2142,2466,2771,3040,3262,3425,3521,3547,3501,3385,3204,2967,2687,2375,2048,1721,1409,1129,892,711,595,549,575,671,834,1056,1325,1630,1954,2283,2600,2891,3141,3339,3475,3541,3536,3459,3314,3109,2852,2556,2236,1907,1584,1284,1021,807,653,566,551,608,734,923,1166,1452,1767,2095,2421,2729,3004,3233,3405,3512,3548,3512,3405,3233,3004,2729,2421,2095,1767,1452,1166,923,734,608,551,566,653,807,1021,1284,1584,1907,2236,2556,2852,3109,3314,3459,3536,3541,3475,3339,3141,2891,2600,2283,1954,1630,1325,1056,834,671,575,549,595,711,892,1129,1409,1721,2048,
 9     2421,2771,3075,3314,3475,3545,3521,3405,3204,2930,2600,2236,1860,1496,1166,892,691,575,551,621,782,1021,1325,1675,2048,2421,2771,3075,3314,3475,3545,3521,3405,3204,2930,2600,2236,1860,1496,1166,892,691,575,551,621,782,1021,1325,1675,2048,2421,2771,3075,3314,3475,3545,3521,3405,3204,2930,2600,2236,1860,1496,1166,892,691,575,551,621,782,1021,1325,1675,2048,2421,2771,3075,3314,3475,3545,3521,3405,3204,2930,2600,2236,1860,1496,1166,892,691,575,551,621,782,1021,1325,1675,2048,2421,2771,3075,3314,3475,3545,3521,3405,3204,2930,2600,2236,1860,1496,1166,892,691,575,551,621,782,1021,1325,1675,2048,2421,2771,3075,3314,3475,3545,3521,3405,3204,2930,2600,2236,1860,1496,1166,892,691,575,551,621,782,1021,1325,1675,2048,2421,2771,3075,3314,3475,3545,3521,3405,3204,2930,2600,2236,1860,1496,1166,892,691,575,551,621,782,1021,1325,1675,2048,2421,2771,3075,3314,3475,3545,3521,3405,3204,2930,2600,2236,1860,1496,1166,892,691,575,551,621,782,1021,1325,1675,2048,
10     2466,2852,3173,3405,3530,3536,3425,3204,2891,2512,2095,1675,1284,955,711,575,555,653,863,1166,1540,1954,2375,2771,3109,3362,3512,3545,3459,3262,2967,2600,2189,1767,1367,1021,757,595,549,621,807,1092,1452,1860,2283,2687,3040,3314,3488,3548,3488,3314,3040,2687,2283,1860,1452,1092,807,621,549,595,757,1021,1367,1767,2189,2600,2967,3262,3459,3545,3512,3362,3109,2771,2375,1954,1540,1166,863,653,555,575,711,955,1284,1675,2095,2512,2891,3204,3425,3536,3530,3405,3173,2852,2466,2048,1630,1244,923,691,566,560,671,892,1205,1584,2001,2421,2812,3141,3385,3521,3541,3443,3233,2930,2556,2142,1721,1325,987,734,584,551,637,834,1129,1496,1907,2329,2729,3075,3339,3501,3547,3475,3289,3004,2644,2236,1813,1409,1056,782,608,548,608,782,1056,1409,1813,2236,2644,3004,3289,3475,3547,3501,3339,3075,2729,2329,1907,1496,1129,834,637,551,584,734,987,1325,1721,2142,2556,2930,3233,3443,3541,3521,3385,3141,2812,2421,2001,1584,1205,892,671,560,566,691,923,1244,1630,2048,
11     2512,2930,3262,3475,3548,3475,3262,2930,2512,2048,1584,1166,834,621,548,621,834,1166,1584,2048,2512,2930,3262,3475,3548,3475,3262,2930,2512,2048,1584,1166,834,621,548,621,834,1166,1584,2048,2512,2930,3262,3475,3548,3475,3262,2930,2512,2048,1584,1166,834,621,548,621,834,1166,1584,2048,2512,2930,3262,3475,3548,3475,3262,2930,2512,2048,1584,1166,834,621,548,621,834,1166,1584,2048,2512,2930,3262,3475,3548,3475,3262,2930,2512,2048,1584,1166,834,621,548,621,834,1166,1584,2048,2512,2930,3262,3475,3548,3475,3262,2930,2512,2048,1584,1166,834,621,548,621,834,1166,1584,2048,2512,2930,3262,3475,3548,3475,3262,2930,2512,2048,1584,1166,834,621,548,621,834,1166,1584,2048,2512,2930,3262,3475,3548,3475,3262,2930,2512,2048,1584,1166,834,621,548,621,834,1166,1584,2048,2512,2930,3262,3475,3548,3475,3262,2930,2512,2048,1584,1166,834,621,548,621,834,1166,1584,2048,2512,2930,3262,3475,3548,3475,3262,2930,2512,2048,1584,1166,834,621,548,621,834,1166,1584,2048,
12     2556,3004,3339,3521,3530,3362,3040,2600,2095,1584,1129,782,584,560,711,1021,1452,1954,2466,2930,3289,3501,3541,3405,3109,2687,2189,1675,1205,834,608,551,671,955,1367,1860,2375,2852,3233,3475,3547,3443,3173,2771,2283,1767,1284,892,637,548,637,892,1284,1767,2283,2771,3173,3443,3547,3475,3233,2852,2375,1860,1367,955,671,551,608,834,1205,1675,2189,2687,3109,3405,3541,3501,3289,2930,2466,1954,1452,1021,711,560,584,782,1129,1584,2095,2600,3040,3362,3530,3521,3339,3004,2556,2048,1540,1092,757,575,566,734,1056,1496,2001,2512,2967,3314,3512,3536,3385,3075,2644,2142,1630,1166,807,595,555,691,987,1409,1907,2421,2891,3262,3488,3545,3425,3141,2729,2236,1721,1244,863,621,549,653,923,1325,1813,2329,2812,3204,3459,3548,3459,3204,2812,2329,1813,1325,923,653,549,621,863,1244,1721,2236,2729,3141,3425,3545,3488,3262,2891,2421,1907,1409,987,691,555,595,807,1166,1630,2142,2644,3075,3385,3536,3512,3314,2967,2512,2001,1496,1056,734,566,575,757,1092,1540,2048,
13     2600,3075,3405,3545,3475,3204,2771,2236,1675,1166,782,575,575,782,1166,1675,2236,2771,3204,3475,3545,3405,3075,2600,2048,1496,1021,691,551,621,892,1325,1860,2421,2930,3314,3521,3521,3314,2930,2421,1860,1325,892,621,551,691,1021,1496,2048,2600,3075,3405,3545,3475,3204,2771,2236,1675,1166,782,575,575,782,1166,1675,2236,2771,3204,3475,3545,3405,3075,2600,2048,1496,1021,691,551,621,892,1325,1860,2421,2930,3314,3521,3521,3314,2930,2421,1860,1325,892,621,551,691,1021,1496,2048,2600,3075,3405,3545,3475,3204,2771,2236,1675,1166,782,575,575,782,1166,1675,2236,2771,3204,3475,3545,3405,3075,2600,2048,1496,1021,691,551,621,892,1325,1860,2421,2930,3314,3521,3521,3314,2930,2421,1860,1325,892,621,551,691,1021,1496,2048,2600,3075,3405,3545,3475,3204,2771,2236,1675,1166,782,575,575,782,1166,1675,2236,2771,3204,3475,3545,3405,3075,2600,2048,1496,1021,691,551,621,892,1325,1860,2421,2930,3314,3521,3521,3314,2930,2421,1860,1325,892,621,551,691,1021,1496,2048,
14     2644,3141,3459,3545,3385,3004,2466,1860,1284,834,584,575,807,1244,1813,2421,2967,3362,3541,3475,3173,2687,2095,1496,987,653,549,691,1056,1584,2189,2771,3233,3501,3530,3314,2891,2329,1721,1166,757,560,608,892,1367,1954,2556,3075,3425,3548,3425,3075,2556,1954,1367,892,608,560,757,1166,1721,2329,2891,3314,3530,3501,3233,2771,2189,1584,1056,691,549,653,987,1496,2095,2687,3173,3475,3541,3362,2967,2421,1813,1244,807,575,584,834,1284,1860,2466,3004,3385,3545,3459,3141,2644,2048,1452,955,637,551,711,1092,1630,2236,2812,3262,3512,3521,3289,2852,2283,1675,1129,734,555,621,923,1409,2001,2600,3109,3443,3547,3405,3040,2512,1907,1325,863,595,566,782,1205,1767,2375,2930,3339,3536,3488,3204,2729,2142,1540,1021,671,548,671,1021,1540,2142,2729,3204,3488,3536,3339,2930,2375,1767,1205,782,566,595,863,1325,1907,2512,3040,3405,3547,3443,3109,2600,2001,1409,923,621,555,734,1129,1675,2283,2852,3289,3521,3512,3262,2812,2236,1630,1092,711,551,637,955,1452,2048,
15     2687,3204,3501,3521,3262,2771,2142,1496,955,621,560,782,1244,1860,2512,3075,3443,3545,3362,2930,2329,1675,1092,691,548,691,1092,1675,2329,2930,3362,3545,3443,3075,2512,1860,1244,782,560,621,955,1496,2142,2771,3262,3521,3501,3204,2687,2048,1409,892,595,575,834,1325,1954,2600,3141,3475,3536,3314,2852,2236,1584,1021,653,551,734,1166,1767,2421,3004,3405,3548,3405,3004,2421,1767,1166,734,551,653,1021,1584,2236,2852,3314,3536,3475,3141,2600,1954,1325,834,575,595,892,1409,2048,2687,3204,3501,3521,3262,2771,2142,1496,955,621,560,782,1244,1860,2512,3075,3443,3545,3362,2930,2329,1675,1092,691,548,691,1092,1675,2329,2930,3362,3545,3443,3075,2512,1860,1244,782,560,621,955,1496,2142,2771,3262,3521,3501,3204,2687,2048,1409,892,595,575,834,1325,1954,2600,3141,3475,3536,3314,2852,2236,1584,1021,653,551,734,1166,1767,2421,3004,3405,3548,3405,3004,2421,1767,1166,734,551,653,1021,1584,2236,2852,3314,3536,3475,3141,2600,1954,1325,834,575,595,892,1409,2048,
16     2729,3262,3530,3475,3109,2512,1813,1166,711,548,711,1166,1813,2512,3109,3475,3530,3262,2729,2048,1367,834,566,621,987,1584,2283,2930,3385,3548,3385,2930,2283,1584,987,621,566,834,1367,2048,2729,3262,3530,3475,3109,2512,1813,1166,711,548,711,1166,1813,2512,3109,3475,3530,3262,2729,2048,1367,834,566,621,987,1584,2283,2930,3385,3548,3385,2930,2283,1584,987,621,566,834,1367,2048,2729,3262,3530,3475,3109,2512,1813,1166,711,548,711,1166,1813,2512,3109,3475,3530,3262,2729,2048,1367,834,566,621,987,1584,2283,2930,3385,3548,3385,2930,2283,1584,987,621,566,834,1367,2048,2729,3262,3530,3475,3109,2512,1813,1166,711,548,711,1166,1813,2512,3109,3475,3530,3262,2729,2048,1367,834,566,621,987,1584,2283,2930,3385,3548,3385,2930,2283,1584,987,621,566,834,1367,2048,2729,3262,3530,3475,3109,2512,1813,1166,711,548,711,1166,1813,2512,3109,3475,3530,3262,2729,2048,1367,834,566,621,987,1584,2283,2930,3385,3548,3385,2930,2283,1584,987,621,566,834,1367,2048,
17     2771,3314,3545,3405,2930,2236,1496,892,575,621,1021,1675,2421,3075,3475,3521,3204,2600,1860,1166,691,551,782,1325,2048,2771,3314,3545,3405,2930,2236,1496,892,575,621,1021,1675,2421,3075,3475,3521,3204,2600,1860,1166,691,551,782,1325,2048,2771,3314,3545,3405,2930,2236,1496,892,575,621,1021,1675,2421,3075,3475,3521,3204,2600,1860,1166,691,551,782,1325,2048,2771,3314,3545,3405,2930,2236,1496,892,575,621,1021,1675,2421,3075,3475,3521,3204,2600,1860,1166,691,551,782,1325,2048,2771,3314,3545,3405,2930,2236,1496,892,575,621,1021,1675,2421,3075,3475,3521,3204,2600,1860,1166,691,551,782,1325,2048,2771,3314,3545,3405,2930,2236,1496,892,575,621,1021,1675,2421,3075,3475,3521,3204,2600,1860,1166,691,551,782,1325,2048,2771,3314,3545,3405,2930,2236,1496,892,575,621,1021,1675,2421,3075,3475,3521,3204,2600,1860,1166,691,551,782,1325,2048,2771,3314,3545,3405,2930,2236,1496,892,575,621,1021,1675,2421,3075,3475,3521,3204,2600,1860,1166,691,551,782,1325,2048,
18     2812,3362,3547,3314,2729,1954,1205,691,555,834,1452,2236,2967,3443,3530,3204,2556,1767,1056,621,584,955,1630,2421,3109,3501,3488,3075,2375,1584,923,575,637,1092,1813,2600,3233,3536,3425,2930,2189,1409,807,551,711,1244,2001,2771,3339,3548,3339,2771,2001,1244,711,551,807,1409,2189,2930,3425,3536,3233,2600,1813,1092,637,575,923,1584,2375,3075,3488,3501,3109,2421,1630,955,584,621,1056,1767,2556,3204,3530,3443,2967,2236,1452,834,555,691,1205,1954,2729,3314,3547,3362,2812,2048,1284,734,549,782,1367,2142,2891,3405,3541,3262,2644,1860,1129,653,566,892,1540,2329,3040,3475,3512,3141,2466,1675,987,595,608,1021,1721,2512,3173,3521,3459,3004,2283,1496,863,560,671,1166,1907,2687,3289,3545,3385,2852,2095,1325,757,548,757,1325,2095,2852,3385,3545,3289,2687,1907,1166,671,560,863,1496,2283,3004,3459,3521,3173,2512,1721,1021,608,595,987,1675,2466,3141,3512,3475,3040,2329,1540,892,566,653,1129,1860,2644,3262,3541,3405,2891,2142,1367,782,549,734,1284,2048,
19     2852,3405,3536,3204,2512,1675,955,575,653,1166,1954,2771,3362,3545,3262,2600,1767,1021,595,621,1092,1860,2687,3314,3548,3314,2687,1860,1092,621,595,1021,1767,2600,3262,3545,3362,2771,1954,1166,653,575,955,1675,2512,3204,3536,3405,2852,2048,1244,691,560,892,1584,2421,3141,3521,3443,2930,2142,1325,734,551,834,1496,2329,3075,3501,3475,3004,2236,1409,782,548,782,1409,2236,3004,3475,3501,3075,2329,1496,834,551,734,1325,2142,2930,3443,3521,3141,2421,1584,892,560,691,1244,2048,2852,3405,3536,3204,2512,1675,955,575,653,1166,1954,2771,3362,3545,3262,2600,1767,1021,595,621,1092,1860,2687,3314,3548,3314,2687,1860,1092,621,595,1021,1767,2600,3262,3545,3362,2771,1954,1166,653,575,955,1675,2512,3204,3536,3405,2852,2048,1244,691,560,892,1584,2421,3141,3521,3443,2930,2142,1325,734,551,834,1496,2329,3075,3501,3475,3004,2236,1409,782,548,782,1409,2236,3004,3475,3501,3075,2329,1496,834,551,734,1325,2142,2930,3443,3521,3141,2421,1584,892,560,691,1244,2048,
20     2891,3443,3512,3075,2283,1409,757,551,863,1584,2466,3204,3541,3362,2729,1860,1056,595,637,1166,2001,2852,3425,3521,3109,2329,1452,782,549,834,1540,2421,3173,3536,3385,2771,1907,1092,608,621,1129,1954,2812,3405,3530,3141,2375,1496,807,548,807,1496,2375,3141,3530,3405,2812,1954,1129,621,608,1092,1907,2771,3385,3536,3173,2421,1540,834,549,782,1452,2329,3109,3521,3425,2852,2001,1166,637,595,1056,1860,2729,3362,3541,3204,2466,1584,863,551,757,1409,2283,3075,3512,3443,2891,2048,1205,653,584,1021,1813,2687,3339,3545,3233,2512,1630,892,555,734,1367,2236,3040,3501,3459,2930,2095,1244,671,575,987,1767,2644,3314,3547,3262,2556,1675,923,560,711,1325,2189,3004,3488,3475,2967,2142,1284,691,566,955,1721,2600,3289,3548,3289,2600,1721,955,566,691,1284,2142,2967,3475,3488,3004,2189,1325,711,560,923,1675,2556,3262,3547,3314,2644,1767,987,575,671,1244,2095,2930,3459,3501,3040,2236,1367,734,555,892,1630,2512,3233,3545,3339,2687,1813,1021,584,653,1205,2048,
21     2930,3475,3475,2930,2048,1166,621,621,1166,2048,2930,3475,3475,2930,2048,1166,621,621,1166,2048,2930,3475,3475,2930,2048,1166,621,621,1166,2048,2930,3475,3475,2930,2048,1166,621,621,1166,2048,2930,3475,3475,2930,2048,1166,621,621,1166,2048,2930,3475,3475,2930,2048,1166,621,621,1166,2048,2930,3475,3475,2930,2048,1166,621,621,1166,2048,2930,3475,3475,2930,2048,1166,621,621,1166,2048,2930,3475,3475,2930,2048,1166,621,621,1166,2048,2930,3475,3475,2930,2048,1166,621,621,1166,2048,2930,3475,3475,2930,2048,1166,621,621,1166,2048,2930,3475,3475,2930,2048,1166,621,621,1166,2048,2930,3475,3475,2930,2048,1166,621,621,1166,2048,2930,3475,3475,2930,2048,1166,621,621,1166,2048,2930,3475,3475,2930,2048,1166,621,621,1166,2048,2930,3475,3475,2930,2048,1166,621,621,1166,2048,2930,3475,3475,2930,2048,1166,621,621,1166,2048,2930,3475,3475,2930,2048,1166,621,621,1166,2048,2930,3475,3475,2930,2048,1166,621,621,1166,2048,2930,3475,3475,2930,2048,1166,621,621,1166,2048
22 };
23 short  DAC_COS[200*19] = 
24 {//DAC餘弦緩衝區,每行 200點。第一行有2個正弦波,第三行有4個……第19行有20個
25     3545,3536,3521,3501,3475,3443,3405,3362,3314,3262,3204,3141,3075,3004,2930,2852,2771,2687,2600,2512,2421,2329,2236,2142,2048,1954,1860,1767,1675,1584,1496,1409,1325,1244,1166,1092,1021,955,892,834,782,734,691,653,621,595,575,560,551,548,551,560,575,595,621,653,691,734,782,834,892,955,1021,1092,1166,1244,1325,1409,1496,1584,1675,1767,1860,1954,2048,2142,2236,2329,2421,2512,2600,2687,2771,2852,2930,3004,3075,3141,3204,3262,3314,3362,3405,3443,3475,3501,3521,3536,3545,3548,3545,3536,3521,3501,3475,3443,3405,3362,3314,3262,3204,3141,3075,3004,2930,2852,2771,2687,2600,2512,2421,2329,2236,2142,2048,1954,1860,1767,1675,1584,1496,1409,1325,1244,1166,1092,1021,955,892,834,782,734,691,653,621,595,575,560,551,548,551,560,575,595,621,653,691,734,782,834,892,955,1021,1092,1166,1244,1325,1409,1496,1584,1675,1767,1860,1954,2048,2142,2236,2329,2421,2512,2600,2687,2771,2852,2930,3004,3075,3141,3204,3262,3314,3362,3405,3443,3475,3501,3521,3536,3545,3548,
26     3541,3521,3488,3443,3385,3314,3233,3141,3040,2930,2812,2687,2556,2421,2283,2142,2001,1860,1721,1584,1452,1325,1205,1092,987,892,807,734,671,621,584,560,549,551,566,595,637,691,757,834,923,1021,1129,1244,1367,1496,1630,1767,1907,2048,2189,2329,2466,2600,2729,2852,2967,3075,3173,3262,3339,3405,3459,3501,3530,3545,3547,3536,3512,3475,3425,3362,3289,3204,3109,3004,2891,2771,2644,2512,2375,2236,2095,1954,1813,1675,1540,1409,1284,1166,1056,955,863,782,711,653,608,575,555,548,555,575,608,653,711,782,863,955,1056,1166,1284,1409,1540,1675,1813,1954,2095,2236,2375,2512,2644,2771,2891,3004,3109,3204,3289,3362,3425,3475,3512,3536,3547,3545,3530,3501,3459,3405,3339,3262,3173,3075,2967,2852,2729,2600,2466,2329,2189,2048,1907,1767,1630,1496,1367,1244,1129,1021,923,834,757,691,637,595,566,551,549,560,584,621,671,734,807,892,987,1092,1205,1325,1452,1584,1721,1860,2001,2142,2283,2421,2556,2687,2812,2930,3040,3141,3233,3314,3385,3443,3488,3521,3541,3548,
27     3536,3501,3443,3362,3262,3141,3004,2852,2687,2512,2329,2142,1954,1767,1584,1409,1244,1092,955,834,734,653,595,560,548,560,595,653,734,834,955,1092,1244,1409,1584,1767,1954,2142,2329,2512,2687,2852,3004,3141,3262,3362,3443,3501,3536,3548,3536,3501,3443,3362,3262,3141,3004,2852,2687,2512,2329,2142,1954,1767,1584,1409,1244,1092,955,834,734,653,595,560,548,560,595,653,734,834,955,1092,1244,1409,1584,1767,1954,2142,2329,2512,2687,2852,3004,3141,3262,3362,3443,3501,3536,3548,3536,3501,3443,3362,3262,3141,3004,2852,2687,2512,2329,2142,1954,1767,1584,1409,1244,1092,955,834,734,653,595,560,548,560,595,653,734,834,955,1092,1244,1409,1584,1767,1954,2142,2329,2512,2687,2852,3004,3141,3262,3362,3443,3501,3536,3548,3536,3501,3443,3362,3262,3141,3004,2852,2687,2512,2329,2142,1954,1767,1584,1409,1244,1092,955,834,734,653,595,560,548,560,595,653,734,834,955,1092,1244,1409,1584,1767,1954,2142,2329,2512,2687,2852,3004,3141,3262,3362,3443,3501,3536,3548,
28     3530,3475,3385,3262,3109,2930,2729,2512,2283,2048,1813,1584,1367,1166,987,834,711,621,566,548,566,621,711,834,987,1166,1367,1584,1813,2048,2283,2512,2729,2930,3109,3262,3385,3475,3530,3548,3530,3475,3385,3262,3109,2930,2729,2512,2283,2048,1813,1584,1367,1166,987,834,711,621,566,548,566,621,711,834,987,1166,1367,1584,1813,2048,2283,2512,2729,2930,3109,3262,3385,3475,3530,3548,3530,3475,3385,3262,3109,2930,2729,2512,2283,2048,1813,1584,1367,1166,987,834,711,621,566,548,566,621,711,834,987,1166,1367,1584,1813,2048,2283,2512,2729,2930,3109,3262,3385,3475,3530,3548,3530,3475,3385,3262,3109,2930,2729,2512,2283,2048,1813,1584,1367,1166,987,834,711,621,566,548,566,621,711,834,987,1166,1367,1584,1813,2048,2283,2512,2729,2930,3109,3262,3385,3475,3530,3548,3530,3475,3385,3262,3109,2930,2729,2512,2283,2048,1813,1584,1367,1166,987,834,711,621,566,548,566,621,711,834,987,1166,1367,1584,1813,2048,2283,2512,2729,2930,3109,3262,3385,3475,3530,3548,
29     3521,3443,3314,3141,2930,2687,2421,2142,1860,1584,1325,1092,892,734,621,560,551,595,691,834,1021,1244,1496,1767,2048,2329,2600,2852,3075,3262,3405,3501,3545,3536,3475,3362,3204,3004,2771,2512,2236,1954,1675,1409,1166,955,782,653,575,548,575,653,782,955,1166,1409,1675,1954,2236,2512,2771,3004,3204,3362,3475,3536,3545,3501,3405,3262,3075,2852,2600,2329,2048,1767,1496,1244,1021,834,691,595,551,560,621,734,892,1092,1325,1584,1860,2142,2421,2687,2930,3141,3314,3443,3521,3548,3521,3443,3314,3141,2930,2687,2421,2142,1860,1584,1325,1092,892,734,621,560,551,595,691,834,1021,1244,1496,1767,2048,2329,2600,2852,3075,3262,3405,3501,3545,3536,3475,3362,3204,3004,2771,2512,2236,1954,1675,1409,1166,955,782,653,575,548,575,653,782,955,1166,1409,1675,1954,2236,2512,2771,3004,3204,3362,3475,3536,3545,3501,3405,3262,3075,2852,2600,2329,2048,1767,1496,1244,1021,834,691,595,551,560,621,734,892,1092,1325,1584,1860,2142,2421,2687,2930,3141,3314,3443,3521,3548,
30     3512,3405,3233,3004,2729,2421,2095,1767,1452,1166,923,734,608,551,566,653,807,1021,1284,1584,1907,2236,2556,2852,3109,3314,3459,3536,3541,3475,3339,3141,2891,2600,2283,1954,1630,1325,1056,834,671,575,549,595,711,892,1129,1409,1721,2048,2375,2687,2967,3204,3385,3501,3547,3521,3425,3262,3040,2771,2466,2142,1813,1496,1205,955,757,621,555,560,637,782,987,1244,1540,1860,2189,2512,2812,3075,3289,3443,3530,3545,3488,3362,3173,2930,2644,2329,2001,1675,1367,1092,863,691,584,548,584,691,863,1092,1367,1675,2001,2329,2644,2930,3173,3362,3488,3545,3530,3443,3289,3075,2812,2512,2189,1860,1540,1244,987,782,637,560,555,621,757,955,1205,1496,1813,2142,2466,2771,3040,3262,3425,3521,3547,3501,3385,3204,2967,2687,2375,2048,1721,1409,1129,892,711,595,549,575,671,834,1056,1325,1630,1954,2283,2600,2891,3141,3339,3475,3541,3536,3459,3314,3109,2852,2556,2236,1907,1584,1284,1021,807,653,566,551,608,734,923,1166,1452,1767,2095,2421,2729,3004,3233,3405,3512,3548,
31     3501,3362,3141,2852,2512,2142,1767,1409,1092,834,653,560,560,653,834,1092,1409,1767,2142,2512,2852,3141,3362,3501,3548,3501,3362,3141,2852,2512,2142,1767,1409,1092,834,653,560,560,653,834,1092,1409,1767,2142,2512,2852,3141,3362,3501,3548,3501,3362,3141,2852,2512,2142,1767,1409,1092,834,653,560,560,653,834,1092,1409,1767,2142,2512,2852,3141,3362,3501,3548,3501,3362,3141,2852,2512,2142,1767,1409,1092,834,653,560,560,653,834,1092,1409,1767,2142,2512,2852,3141,3362,3501,3548,3501,3362,3141,2852,2512,2142,1767,1409,1092,834,653,560,560,653,834,1092,1409,1767,2142,2512,2852,3141,3362,3501,3548,3501,3362,3141,2852,2512,2142,1767,1409,1092,834,653,560,560,653,834,1092,1409,1767,2142,2512,2852,3141,3362,3501,3548,3501,3362,3141,2852,2512,2142,1767,1409,1092,834,653,560,560,653,834,1092,1409,1767,2142,2512,2852,3141,3362,3501,3548,3501,3362,3141,2852,2512,2142,1767,1409,1092,834,653,560,560,653,834,1092,1409,1767,2142,2512,2852,3141,3362,3501,3548,
32     3488,3314,3040,2687,2283,1860,1452,1092,807,621,549,595,757,1021,1367,1767,2189,2600,2967,3262,3459,3545,3512,3362,3109,2771,2375,1954,1540,1166,863,653,555,575,711,955,1284,1675,2095,2512,2891,3204,3425,3536,3530,3405,3173,2852,2466,2048,1630,1244,923,691,566,560,671,892,1205,1584,2001,2421,2812,3141,3385,3521,3541,3443,3233,2930,2556,2142,1721,1325,987,734,584,551,637,834,1129,1496,1907,2329,2729,3075,3339,3501,3547,3475,3289,3004,2644,2236,1813,1409,1056,782,608,548,608,782,1056,1409,1813,2236,2644,3004,3289,3475,3547,3501,3339,3075,2729,2329,1907,1496,1129,834,637,551,584,734,987,1325,1721,2142,2556,2930,3233,3443,3541,3521,3385,3141,2812,2421,2001,1584,1205,892,671,560,566,691,923,1244,1630,2048,2466,2852,3173,3405,3530,3536,3425,3204,2891,2512,2095,1675,1284,955,711,575,555,653,863,1166,1540,1954,2375,2771,3109,3362,3512,3545,3459,3262,2967,2600,2189,1767,1367,1021,757,595,549,621,807,1092,1452,1860,2283,2687,3040,3314,3488,3548,
33     3475,3262,2930,2512,2048,1584,1166,834,621,548,621,834,1166,1584,2048,2512,2930,3262,3475,3548,3475,3262,2930,2512,2048,1584,1166,834,621,548,621,834,1166,1584,2048,2512,2930,3262,3475,3548,3475,3262,2930,2512,2048,1584,1166,834,621,548,621,834,1166,1584,2048,2512,2930,3262,3475,3548,3475,3262,2930,2512,2048,1584,1166,834,621,548,621,834,1166,1584,2048,2512,2930,3262,3475,3548,3475,3262,2930,2512,2048,1584,1166,834,621,548,621,834,1166,1584,2048,2512,2930,3262,3475,3548,3475,3262,2930,2512,2048,1584,1166,834,621,548,621,834,1166,1584,2048,2512,2930,3262,3475,3548,3475,3262,2930,2512,2048,1584,1166,834,621,548,621,834,1166,1584,2048,2512,2930,3262,3475,3548,3475,3262,2930,2512,2048,1584,1166,834,621,548,621,834,1166,1584,2048,2512,2930,3262,3475,3548,3475,3262,2930,2512,2048,1584,1166,834,621,548,621,834,1166,1584,2048,2512,2930,3262,3475,3548,3475,3262,2930,2512,2048,1584,1166,834,621,548,621,834,1166,1584,2048,2512,2930,3262,3475,3548,
34     3459,3204,2812,2329,1813,1325,923,653,549,621,863,1244,1721,2236,2729,3141,3425,3545,3488,3262,2891,2421,1907,1409,987,691,555,595,807,1166,1630,2142,2644,3075,3385,3536,3512,3314,2967,2512,2001,1496,1056,734,566,575,757,1092,1540,2048,2556,3004,3339,3521,3530,3362,3040,2600,2095,1584,1129,782,584,560,711,1021,1452,1954,2466,2930,3289,3501,3541,3405,3109,2687,2189,1675,1205,834,608,551,671,955,1367,1860,2375,2852,3233,3475,3547,3443,3173,2771,2283,1767,1284,892,637,548,637,892,1284,1767,2283,2771,3173,3443,3547,3475,3233,2852,2375,1860,1367,955,671,551,608,834,1205,1675,2189,2687,3109,3405,3541,3501,3289,2930,2466,1954,1452,1021,711,560,584,782,1129,1584,2095,2600,3040,3362,3530,3521,3339,3004,2556,2048,1540,1092,757,575,566,734,1056,1496,2001,2512,2967,3314,3512,3536,3385,3075,2644,2142,1630,1166,807,595,555,691,987,1409,1907,2421,2891,3262,3488,3545,3425,3141,2729,2236,1721,1244,863,621,549,653,923,1325,1813,2329,2812,3204,3459,3548,
35     3443,3141,2687,2142,1584,1092,734,560,595,834,1244,1767,2329,2852,3262,3501,3536,3362,3004,2512,1954,1409,955,653,548,653,955,1409,1954,2512,3004,3362,3536,3501,3262,2852,2329,1767,1244,834,595,560,734,1092,1584,2142,2687,3141,3443,3548,3443,3141,2687,2142,1584,1092,734,560,595,834,1244,1767,2329,2852,3262,3501,3536,3362,3004,2512,1954,1409,955,653,548,653,955,1409,1954,2512,3004,3362,3536,3501,3262,2852,2329,1767,1244,834,595,560,734,1092,1584,2142,2687,3141,3443,3548,3443,3141,2687,2142,1584,1092,734,560,595,834,1244,1767,2329,2852,3262,3501,3536,3362,3004,2512,1954,1409,955,653,548,653,955,1409,1954,2512,3004,3362,3536,3501,3262,2852,2329,1767,1244,834,595,560,734,1092,1584,2142,2687,3141,3443,3548,3443,3141,2687,2142,1584,1092,734,560,595,834,1244,1767,2329,2852,3262,3501,3536,3362,3004,2512,1954,1409,955,653,548,653,955,1409,1954,2512,3004,3362,3536,3501,3262,2852,2329,1767,1244,834,595,560,734,1092,1584,2142,2687,3141,3443,3548,
36     3425,3075,2556,1954,1367,892,608,560,757,1166,1721,2329,2891,3314,3530,3501,3233,2771,2189,1584,1056,691,549,653,987,1496,2095,2687,3173,3475,3541,3362,2967,2421,1813,1244,807,575,584,834,1284,1860,2466,3004,3385,3545,3459,3141,2644,2048,1452,955,637,551,711,1092,1630,2236,2812,3262,3512,3521,3289,2852,2283,1675,1129,734,555,621,923,1409,2001,2600,3109,3443,3547,3405,3040,2512,1907,1325,863,595,566,782,1205,1767,2375,2930,3339,3536,3488,3204,2729,2142,1540,1021,671,548,671,1021,1540,2142,2729,3204,3488,3536,3339,2930,2375,1767,1205,782,566,595,863,1325,1907,2512,3040,3405,3547,3443,3109,2600,2001,1409,923,621,555,734,1129,1675,2283,2852,3289,3521,3512,3262,2812,2236,1630,1092,711,551,637,955,1452,2048,2644,3141,3459,3545,3385,3004,2466,1860,1284,834,584,575,807,1244,1813,2421,2967,3362,3541,3475,3173,2687,2095,1496,987,653,549,691,1056,1584,2189,2771,3233,3501,3530,3314,2891,2329,1721,1166,757,560,608,892,1367,1954,2556,3075,3425,3548,
37     3405,3004,2421,1767,1166,734,551,653,1021,1584,2236,2852,3314,3536,3475,3141,2600,1954,1325,834,575,595,892,1409,2048,2687,3204,3501,3521,3262,2771,2142,1496,955,621,560,782,1244,1860,2512,3075,3443,3545,3362,2930,2329,1675,1092,691,548,691,1092,1675,2329,2930,3362,3545,3443,3075,2512,1860,1244,782,560,621,955,1496,2142,2771,3262,3521,3501,3204,2687,2048,1409,892,595,575,834,1325,1954,2600,3141,3475,3536,3314,2852,2236,1584,1021,653,551,734,1166,1767,2421,3004,3405,3548,3405,3004,2421,1767,1166,734,551,653,1021,1584,2236,2852,3314,3536,3475,3141,2600,1954,1325,834,575,595,892,1409,2048,2687,3204,3501,3521,3262,2771,2142,1496,955,621,560,782,1244,1860,2512,3075,3443,3545,3362,2930,2329,1675,1092,691,548,691,1092,1675,2329,2930,3362,3545,3443,3075,2512,1860,1244,782,560,621,955,1496,2142,2771,3262,3521,3501,3204,2687,2048,1409,892,595,575,834,1325,1954,2600,3141,3475,3536,3314,2852,2236,1584,1021,653,551,734,1166,1767,2421,3004,3405,3548,
38     3385,2930,2283,1584,987,621,566,834,1367,2048,2729,3262,3530,3475,3109,2512,1813,1166,711,548,711,1166,1813,2512,3109,3475,3530,3262,2729,2048,1367,834,566,621,987,1584,2283,2930,3385,3548,3385,2930,2283,1584,987,621,566,834,1367,2048,2729,3262,3530,3475,3109,2512,1813,1166,711,548,711,1166,1813,2512,3109,3475,3530,3262,2729,2048,1367,834,566,621,987,1584,2283,2930,3385,3548,3385,2930,2283,1584,987,621,566,834,1367,2048,2729,3262,3530,3475,3109,2512,1813,1166,711,548,711,1166,1813,2512,3109,3475,3530,3262,2729,2048,1367,834,566,621,987,1584,2283,2930,3385,3548,3385,2930,2283,1584,987,621,566,834,1367,2048,2729,3262,3530,3475,3109,2512,1813,1166,711,548,711,1166,1813,2512,3109,3475,3530,3262,2729,2048,1367,834,566,621,987,1584,2283,2930,3385,3548,3385,2930,2283,1584,987,621,566,834,1367,2048,2729,3262,3530,3475,3109,2512,1813,1166,711,548,711,1166,1813,2512,3109,3475,3530,3262,2729,2048,1367,834,566,621,987,1584,2283,2930,3385,3548,
39     3362,2852,2142,1409,834,560,653,1092,1767,2512,3141,3501,3501,3141,2512,1767,1092,653,560,834,1409,2142,2852,3362,3548,3362,2852,2142,1409,834,560,653,1092,1767,2512,3141,3501,3501,3141,2512,1767,1092,653,560,834,1409,2142,2852,3362,3548,3362,2852,2142,1409,834,560,653,1092,1767,2512,3141,3501,3501,3141,2512,1767,1092,653,560,834,1409,2142,2852,3362,3548,3362,2852,2142,1409,834,560,653,1092,1767,2512,3141,3501,3501,3141,2512,1767,1092,653,560,834,1409,2142,2852,3362,3548,3362,2852,2142,1409,834,560,653,1092,1767,2512,3141,3501,3501,3141,2512,1767,1092,653,560,834,1409,2142,2852,3362,3548,3362,2852,2142,1409,834,560,653,1092,1767,2512,3141,3501,3501,3141,2512,1767,1092,653,560,834,1409,2142,2852,3362,3548,3362,2852,2142,1409,834,560,653,1092,1767,2512,3141,3501,3501,3141,2512,1767,1092,653,560,834,1409,2142,2852,3362,3548,3362,2852,2142,1409,834,560,653,1092,1767,2512,3141,3501,3501,3141,2512,1767,1092,653,560,834,1409,2142,2852,3362,3548,
40     3339,2771,2001,1244,711,551,807,1409,2189,2930,3425,3536,3233,2600,1813,1092,637,575,923,1584,2375,3075,3488,3501,3109,2421,1630,955,584,621,1056,1767,2556,3204,3530,3443,2967,2236,1452,834,555,691,1205,1954,2729,3314,3547,3362,2812,2048,1284,734,549,782,1367,2142,2891,3405,3541,3262,2644,1860,1129,653,566,892,1540,2329,3040,3475,3512,3141,2466,1675,987,595,608,1021,1721,2512,3173,3521,3459,3004,2283,1496,863,560,671,1166,1907,2687,3289,3545,3385,2852,2095,1325,757,548,757,1325,2095,2852,3385,3545,3289,2687,1907,1166,671,560,863,1496,2283,3004,3459,3521,3173,2512,1721,1021,608,595,987,1675,2466,3141,3512,3475,3040,2329,1540,892,566,653,1129,1860,2644,3262,3541,3405,2891,2142,1367,782,549,734,1284,2048,2812,3362,3547,3314,2729,1954,1205,691,555,834,1452,2236,2967,3443,3530,3204,2556,1767,1056,621,584,955,1630,2421,3109,3501,3488,3075,2375,1584,923,575,637,1092,1813,2600,3233,3536,3425,2930,2189,1409,807,551,711,1244,2001,2771,3339,3548,
41     3314,2687,1860,1092,621,595,1021,1767,2600,3262,3545,3362,2771,1954,1166,653,575,955,1675,2512,3204,3536,3405,2852,2048,1244,691,560,892,1584,2421,3141,3521,3443,2930,2142,1325,734,551,834,1496,2329,3075,3501,3475,3004,2236,1409,782,548,782,1409,2236,3004,3475,3501,3075,2329,1496,834,551,734,1325,2142,2930,3443,3521,3141,2421,1584,892,560,691,1244,2048,2852,3405,3536,3204,2512,1675,955,575,653,1166,1954,2771,3362,3545,3262,2600,1767,1021,595,621,1092,1860,2687,3314,3548,3314,2687,1860,1092,621,595,1021,1767,2600,3262,3545,3362,2771,1954,1166,653,575,955,1675,2512,3204,3536,3405,2852,2048,1244,691,560,892,1584,2421,3141,3521,3443,2930,2142,1325,734,551,834,1496,2329,3075,3501,3475,3004,2236,1409,782,548,782,1409,2236,3004,3475,3501,3075,2329,1496,834,551,734,1325,2142,2930,3443,3521,3141,2421,1584,892,560,691,1244,2048,2852,3405,3536,3204,2512,1675,955,575,653,1166,1954,2771,3362,3545,3262,2600,1767,1021,595,621,1092,1860,2687,3314,3548,
42     3289,2600,1721,955,566,691,1284,2142,2967,3475,3488,3004,2189,1325,711,560,923,1675,2556,3262,3547,3314,2644,1767,987,575,671,1244,2095,2930,3459,3501,3040,2236,1367,734,555,892,1630,2512,3233,3545,3339,2687,1813,1021,584,653,1205,2048,2891,3443,3512,3075,2283,1409,757,551,863,1584,2466,3204,3541,3362,2729,1860,1056,595,637,1166,2001,2852,3425,3521,3109,2329,1452,782,549,834,1540,2421,3173,3536,3385,2771,1907,1092,608,621,1129,1954,2812,3405,3530,3141,2375,1496,807,548,807,1496,2375,3141,3530,3405,2812,1954,1129,621,608,1092,1907,2771,3385,3536,3173,2421,1540,834,549,782,1452,2329,3109,3521,3425,2852,2001,1166,637,595,1056,1860,2729,3362,3541,3204,2466,1584,863,551,757,1409,2283,3075,3512,3443,2891,2048,1205,653,584,1021,1813,2687,3339,3545,3233,2512,1630,892,555,734,1367,2236,3040,3501,3459,2930,2095,1244,671,575,987,1767,2644,3314,3547,3262,2556,1675,923,560,711,1325,2189,3004,3488,3475,2967,2142,1284,691,566,955,1721,2600,3289,3548,
43     3262,2512,1584,834,548,834,1584,2512,3262,3548,3262,2512,1584,834,548,834,1584,2512,3262,3548,3262,2512,1584,834,548,834,1584,2512,3262,3548,3262,2512,1584,834,548,834,1584,2512,3262,3548,3262,2512,1584,834,548,834,1584,2512,3262,3548,3262,2512,1584,834,548,834,1584,2512,3262,3548,3262,2512,1584,834,548,834,1584,2512,3262,3548,3262,2512,1584,834,548,834,1584,2512,3262,3548,3262,2512,1584,834,548,834,1584,2512,3262,3548,3262,2512,1584,834,548,834,1584,2512,3262,3548,3262,2512,1584,834,548,834,1584,2512,3262,3548,3262,2512,1584,834,548,834,1584,2512,3262,3548,3262,2512,1584,834,548,834,1584,2512,3262,3548,3262,2512,1584,834,548,834,1584,2512,3262,3548,3262,2512,1584,834,548,834,1584,2512,3262,3548,3262,2512,1584,834,548,834,1584,2512,3262,3548,3262,2512,1584,834,548,834,1584,2512,3262,3548,3262,2512,1584,834,548,834,1584,2512,3262,3548,3262,2512,1584,834,548,834,1584,2512,3262,3548,3262,2512,1584,834,548,834,1584,2512,3262,3548
44 };
正、餘弦資料表

這裡值得注意的技巧是,我將不同頻率的所有正弦資料放在一個陣列中,所有餘弦資料放在另一個陣列中。這樣做有利於在程式執行時根據前面計算的結果訪問指定頻率的資料,例如已知輸入A訊號的頻率為30KHz,折算成頻率的編號為i=2,則指向表格中頻率為30KHz的資料的首地址指標則為(DAC_SIN + 200*i)。

綜上,所有表格佔用的記憶體大小將為19*2*200*2=15.2KB。常見的STM32的RAM空間無疑都能夠滿足要求。 

本環節揭示出的嵌入式系統教學中的問題:

a) 有的學生不理解計算機實現演算法時“查表法”的重要意義,痴迷於使用解析法得到所需的所有資料,大大限制了程式執行效率。

b) 在何種程度上使用查表法,也是值得演算法開發者針對具體問題仔細斟酌的問題,因為龐大的表格佔用的資源也是嵌入式系統不得不面對的問題。

上述兩個問題過於具體,而對於嵌入式教學的指導意義,仍然指向需要學校進一步加大實踐教學力度,提升嵌入式系統教師的水平,提升具有開發經驗的雙師型教師的比例。或許加大線上線下混合教學的力度,進一步出版真正有技術含量的教科書也是不錯的解決方案。在這裡在推薦一下本教學團隊的教材:《基於STM32的嵌入式系統原理及應用》(科學出版社出版 ISBN:9787030697974)和我個人的B站賬號“何樂生0”,歡迎大家購買和關注。

8.  基於DMA的快速A/D和D/A轉換

1)高速A/D轉換的實現

根據題意,被處理的訊號最高頻率為100KHz,而三角波與正弦波的頻譜相比,主要差異在奇次諧波,因此要對100KHz的三角波進行分析,至少要保留300KHz處的譜線資訊,其奈奎斯特取樣率為600KSPS。我選擇STM32F1系列作為數字訊號處理平臺,其使用一個A/D轉換器的最高取樣率為1MSPS,能夠滿足需要。但在如此高的取樣率下,任何MCU都只有使用DMA模式控制A/D轉換,才能夠保證足夠小的取樣間隔時間孔徑抖(aperture jitter),以獲得足夠高的訊雜比(SNR),並降低軟體工作量。

 1 ///////ADC的初始化配置/////////
 2 void ADC_Config(void)
 3 {
 4   ADC_InitTypeDef ADC_InitStructure;//定義ADC結構體
 5   //DMA_InitTypeDef DMA_InitStructure;//定義DMA結構體  
 6   GPIO_InitTypeDef GPIO_InitStructure;
 7   RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);//使能DMA1時鐘
 8   RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1| RCC_APB2Periph_GPIOA, ENABLE ); //使能ADC1及GPIOA時鐘
 9   /*作為ADC1的6通道模擬輸入的GPIO初始化配置*/
10   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
11   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;//模擬輸入
12   GPIO_Init(GPIOA, &GPIO_InitStructure);
13   RCC_ADCCLKConfig(RCC_PCLK2_Div4);   //設定ADC分頻因子4 56M/4=14,ADC最大時間不能超過14M
14   /*下面為ADC1的配置*/
15   ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;//ADC1工作在獨立模式
16   ADC_InitStructure.ADC_ScanConvMode = ENABLE;//模數轉換工作在掃描模式(多通道)
17   ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//模數轉換工作在連續模式
18   ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//轉換由軟體而不是外部觸發啟動
19   ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//ADC資料右對齊
20   ADC_InitStructure.ADC_NbrOfChannel = 1;//轉換的ADC通道的數目為1
21   ADC_Init(ADC1, &ADC_InitStructure);//要把以下引數初始化ADC_InitStructure
22   //轉換時間Tconv=取樣時間+12.5個週期
23   ADC_RegularChannelConfig(ADC1, ADC_Channel_6, 1, ADC_SampleTime_1Cycles5);
24   /*使能ADC1的DMA傳輸方式*/
25   ADC_DMACmd(ADC1, ENABLE);
26   /*使能ADC1 */
27   ADC_Cmd(ADC1, ENABLE);
28   /*重置ADC1的校準暫存器 */   
29   ADC_ResetCalibration(ADC1);
30   /*獲取ADC重置校準暫存器的狀態*/
31   while(ADC_GetResetCalibrationStatus(ADC1));
32   ADC_StartCalibration(ADC1); /*開始校準ADC1*/
33   while(ADC_GetCalibrationStatus(ADC1)); //等待校準完成
34   ADC_SoftwareStartConvCmd(ADC1, ENABLE);//使能ADC1軟體轉換
35 }

 

ADC配置程式碼中值得注意的是:為了是A/D轉換器獲得1MSPS的取樣率,STM32系統時鐘被調整到56MHz,而非使用了常見72MHz。12位的STM32片上ADC最短需要14個ADC時鐘週期(1.5個取樣週期 + 12.5個逐次逼近週期)能完成一次轉換,將系統時鐘調整到56MHz就是為了在四分頻後獲得14MHz的ADC時鐘,從而實現1MSPS的取樣率(1us的取樣間隔)。當然這也意味著,除取樣和轉換時間外,兩次取樣之間不容許再有其他的資料讀寫時間,只能由“DMA+硬體連續觸發模式”來實現轉換自動觸發和結果自動儲存。

另外,由於系統時鐘、取樣週期和逐次逼近轉換所使用的ADC時鐘數都無法連續調節,採用這種方式實現的ADC的取樣率也就無法連續調節為任意需要的值。這也驗證了使用 “DMA+硬體連續觸發模式”的A/D轉換模式無法使公式(1)中當K為整數的同時L為2的整數次冪的結論。

 1 ///////ADC的DMA傳輸配置////
 2 void ADC_DMA_Config()
 3 {
 4   /*DMA1的通道1配置*/
 5   DMA_DeInit(DMA1_Channel1);
 6   DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;//傳輸的源頭地址
 7   DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)ADCConvertedValue;//目標地址
 8   DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //外設作源頭
 9   DMA_InitStructure.DMA_BufferSize = 1024;//資料長度為1024,卷積演算法用1000點,FFT用1024點
10   DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外設地址暫存器不遞增
11   DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//記憶體地址遞增
12   DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//外設傳輸以位元組為單位
13   DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;//記憶體以位元組為單位
14   DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;//不迴圈
15   DMA_InitStructure.DMA_Priority = DMA_Priority_High;//4優先順序之一的(高優先)
16   DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //非記憶體到記憶體
17   DMA_Init(DMA1_Channel1, &DMA_InitStructure);//根據以上引數初始化DMA_InitStructure
18   DMA_Cmd(DMA1_Channel1, ENABLE);//使能DMA1
21 }

 

控制ADC的DMA的配置程式碼中值得注意的是:1)由於A/D轉換是“轉換一筆資料就處理一次,下次轉換就再次處理”,該DMA通道使用了不迴圈模式DMA_Mode_Normal。關於A/D轉換器的觸發時刻,請參見圖5所示的程式整體流程圖。2)DMA儲存的長度為1024次,而在DFT演算法中使用了前1000次的結果,FFT演算法中則使用了1024次的轉換結果。

2)自動輸出波形的D/A轉換的實現

訊號重建也正好使用STM32F1上的兩個D/A轉換器分別產生A'和B'兩個訊號,它們的輸出重新整理率保持與A/D轉換相同,同為1MSPS。D/A轉換也只能使用DMA模式控制產生連續的模擬輸出。相關的配置程式碼如下所示。

 1 ///////DAC1的DMA傳輸配置////
 2 void DAC1_DMA_Config(short* ROM_TBL)
 3 {
 4     RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2,ENABLE);//使能DMA2時鐘
 5      //DMA2通道3配置 
 6     DMA_DeInit(DMA2_Channel3); //根據預設設定初始化DMA2
 7     DMA_InitStructure.DMA_PeripheralBaseAddr = DAC_DHR12R1_Address;//外設地址
 8     DMA_InitStructure.DMA_MemoryBaseAddr = (u32)ROM_TBL;//記憶體地址
 9     DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;//外設DAC作為資料傳輸的目的地
10     DMA_InitStructure.DMA_BufferSize =200;//資料長度
11     DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外設地址暫存器不遞增
12     DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//記憶體地址遞增
13     DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//外設傳輸以半字為單位
14     DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;//記憶體以半字為單位
15     DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;//迴圈模式
16     DMA_InitStructure.DMA_Priority = DMA_Priority_High;//4優先順序之一的(高優先順序)
17     DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;//非記憶體到記憶體
18     DMA_Init(DMA2_Channel3, &DMA_InitStructure);//根據以上引數初始化DMA_InitStructure
19     //使能DAC的DMA中斷
20   DMA_ITConfig(DMA2_Channel3, DMA_IT_TC, ENABLE);//配置控制DAC的DMA通道傳輸完成中斷         
21     //使能DMA2的通道3
22     DMA_Cmd(DMA2_Channel3, ENABLE);    
23 }
///////DAC2的DMA傳輸配置////
void DAC2_DMA_Config(short* ROM_TBL)
{
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2,ENABLE);//使能DMA2時鐘
     //DMA2通道4配置 
    DMA_DeInit(DMA2_Channel4); //根據預設設定初始化DMA2
    DMA_InitStructure.DMA_PeripheralBaseAddr = DAC_DHR12R2_Address;//外設地址
    DMA_InitStructure.DMA_MemoryBaseAddr = (u32)ROM_TBL;//記憶體地址
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;//外設DAC作為資料傳輸的目的地
    DMA_InitStructure.DMA_BufferSize =200;//資料長度
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外設地址暫存器不遞增
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//記憶體地址遞增
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//外設傳輸以半字為單位
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;//記憶體以半字為單位
    DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;//迴圈模式
    DMA_InitStructure.DMA_Priority = DMA_Priority_High;//4優先順序之一的(高優先順序)
    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;//非記憶體到記憶體
    DMA_Init(DMA2_Channel4, &DMA_InitStructure);//根據以上引數初始化DMA_InitStructure
    //使能DAC的DMA中斷
  DMA_ITConfig(DMA2_Channel4, DMA_IT_TC, ENABLE);//配置控制DAC的DMA通道傳輸完成中斷     
    //使能DMA2的通道4
    DMA_Cmd(DMA2_Channel4, ENABLE);    
}

值得注意的是:1)與A/D的DMA控制方式略有不同,以保證輸出波形的連續性,D/A使用了DMA的迴圈地址模式。而A/D則只需要在進行波形頻率、型別分析,以及間隔一段時間的相位調整時採集一幀訊號即可,因此A/D轉換使用了DMA的單次取樣模式。2)D/A轉換的轉換速度較,因此D/A轉換的間隔只能由TIM6和TIM7來定時實現。當然這也透過這兩個定時器的操作來實現相位的實時校正做好了準備。DAC1和DAC2以及為它們定時的TIM6和TIM7的配置如下所示:

 1 void DAC_Config(void)
 2 {
 3     DAC_InitTypeDef  DAC_InitStructure;//庫函式定義DAC結構體
 4     GPIO_InitTypeDef GPIO_InitStructure;//GPIO結構體
 5     RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);//DAC時鐘使能
 6     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);//使能定時器時鐘
 7     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM7, ENABLE);//使能定時器時鐘
 8     /*將GPIO配置為DAC的模擬複用功能*/
 9     GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_4 | GPIO_Pin_5;
10     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;//模擬輸入
11     GPIO_Init(GPIOA, &GPIO_InitStructure);
12   //////DAC通道1由基本定時器6觸發////////////
13   /* TIM6配置*/
14   TIM_PrescalerConfig(TIM6,1-1,TIM_PSCReloadMode_Update);//設定TIM6預分頻值
15   TIM_SetAutoreload(TIM6, 56-1);//設定定時器計數器值
16   /* TIM6觸發模式選擇,這裡為定時器2溢位更新觸發*/
17   TIM_SelectOutputTrigger(TIM6, TIM_TRGOSource_Update);
18   DAC_InitStructure.DAC_Trigger = DAC_Trigger_T6_TRGO;//定時器6觸發
19   DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None;//無波形產生
20   DAC_InitStructure.DAC_OutputBuffer= DAC_OutputBuffer_Disable;//DAC_OutputBuffer_Enable;//不使能輸出快取
21   DAC_Init(DAC_Channel_1, &DAC_InitStructure);//根據以上引數初始化DAC結構體
22   //////DAC通道2由基本定時器7觸發////////////
23   /* TIM7配置*/
24   TIM_PrescalerConfig(TIM7,1-1,TIM_PSCReloadMode_Update);//設定TIM7預分頻值
25   TIM_SetAutoreload(TIM7, 56-1);//設定定時器計數器值
26   /* TIM7觸發模式選擇,這裡為定時器2溢位更新觸發*/
27   TIM_SelectOutputTrigger(TIM7, TIM_TRGOSource_Update);
28   DAC_InitStructure.DAC_Trigger = DAC_Trigger_T7_TRGO;//定時器7觸發
29   DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None;//無波形產生
30   DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable;//DAC_OutputBuffer_Enable;//不使能輸出快取
31   /*DAC通道2配置*/
32   DAC_Init(DAC_Channel_2, &DAC_InitStructure);//根據以上引數初始化DAC結構體
33     /* 使能DAC通道1*/
34   DAC_Cmd(DAC_Channel_1, ENABLE);
35   //使能DAC通道1的DMA
36   DAC_DMACmd(DAC_Channel_1, ENABLE);
37     /* 使能DAC通道2*/
38   DAC_Cmd(DAC_Channel_2, ENABLE);
39   //使能DAC通道2的DMA
40   DAC_DMACmd(DAC_Channel_2, ENABLE);
41 //使能定時器6和7
42   TIM_Cmd(TIM6, ENABLE);
43   TIM_Cmd(TIM7, ENABLE);
44 }

 本環節揭示出的嵌入式系統教學中的問題:

現階段的嵌入式系統課程教學,止步於讓學生明白DMA是什麼,而沒有足夠的學時讓學生將一些重要的外設用熟、用透,導致學生的程式漏洞百出。我指導的一個很有希望的參賽隊就是由於DMA控制的D/A輸出在測試前臨時失靈,造成現場測試失敗。
對於嵌入式系統一類實踐性較強的專業,只有透過課程設計才能讓學生掌握所學內容的綜合應用知識。而我校的課程設計近年來卻完全從人才培養方案中刪除,應該引起管理者的重視。 

9.  重建訊號之間相位差的控制(發揮部分第(2)問) 

本題發揮部分的第(2)問要求參賽者實現對B’與A’的相位差進行控制,實現0~π的電位差。此處對“相位差”的定義如圖2所示。

 

對於本文所述的全數字演算法,這個發揮部分沒有太大難度。只需要在圖5所示的流程中,根據題意,省去右側迴圈中上半部分的A’訊號相位校正程式碼,先做迴圈下部分的B’訊號的相位校正後,再次在B’校正延遲時間的基礎上再加上“相位-延遲時間”折算公式(8)式得到的延遲時間,就得到了A’訊號的延遲時間。將延遲時間插入A’訊號控制定時器TIM6的定時時間中,即可實現本題發揮部分第(2)問要求的訊號間的相位控制。

 

注:TB’為B’訊號的週期,(8)式中我使用了弧度制,題幹中卻使用了角度制。

值得注意的是,發揮部分第(2)問對相位的解析度的要求達到了5°,在100KHz下5°對應0.1389us,已經遠小於重建訊號D/A取樣間隔的1us。只有直接調節重建訊號D/A間隔時間的定時器才能達到要求的相位解析度。具體方法參見本文第5小節第2部分“實時相位校正”中關於TIM6定時器延遲的程式碼。 

本環節揭示出的嵌入式系統教學中的問題:

有部分學生試圖使用“正點原子”提供的程式模板中的us級延時函式void delay_us(u32 nus);來實現(8)式的延遲。但這顯然是行不通的:

a)該函式無法達到題目要求的0.1389us這樣高的時間解析度。

b)在us級別上該函式定時進度已經相當差勁,僅兩次同樣呼叫之間的時間抖動即可達到0.1us數量級;更別提呼叫該函式本身入棧和出賬的耗時已經在0.1us級別!
這提示我們在未來的嵌入式系統教學中仍然要不遺餘力的推進學生對於電流、電壓和時間等物理量的感性認識,而示波器、訊號發生器和頻譜儀等常用儀器的普及應該是必要的先決條件。

 

10.  嵌入式程式開發中遇到的幾個小問題及其解決辦法 

1) MDK的STM32程式模板中的堆和棧

 堆(heap)和棧(stack)本來是指對記憶體的使用方法,“棧”指先進先出,“堆”指用於實現優先佇列的完全二叉樹。但對編譯器而言,它們通常用於指使用該方法的兩個記憶體區域——堆指用完全二叉樹管理,用於全域性變數和malloc()等函式動態分配的記憶體區域;棧指用先進先出方式管理的,用於函式區域性變數的記憶體區域。

由於STM32片上記憶體資源一般較少(我使用的STM32F103RC只有48KB RAM),一般分配給棧的區域尤其小。如,MDK的啟動程式碼startup_stm32f10x_hd.s中預設條件下就分配了512位元組作為預留的Stack_Size,這在絕大多數情況下沒有問題,因為很少有嵌入式函式會使用超過512位元組的記憶體,但本題中的很多演算法函式使用的記憶體數量遠大於這個值,例如FFT函式使用記憶體數達到10KB以上。如果不對該配置進行修改,這些函式將對分配空間之外的記憶體區進行無警告的覆蓋,從而造成程式莫名其妙出錯。

配置方法很簡單:在啟動檔案中進行如下修改即可:

1 Stack_Size      EQU     0x00004000 

2) 相位校正環節中的延遲的實現

 本文第5節介紹了相位誤差的校正演算法及其實踐,其方法是在計算得到輸入訊號中的A、B和重建訊號A’、B’的相位差後,透過對A’、B’的時域延遲,實現相位對齊。賽後我看了很多同學的報告,他們都簡單的採用了正點原子提供的STM32工程模板中的delay_us()來實現訊號的時域延遲。這樣做的問題在於:1)delay_us()延遲並不準確,由於中斷和Flash指令讀取緩衝等問題其誤差可達20%以上。2)時間調節解析度僅為1us,相當於一次A/D或D/A轉換間隔,對100KHz的輸入訊號相當於36°相角,無法達到相位調節和鎖定進度要求。

我的做法是直接在控制D/A轉換的定時器(TIM6和TIM7)計數值基礎上加延遲時間:這樣做的好處是:1)定時器時間解析度為系統時脈頻率(本例為56MHz)的倒數,遠遠高於1us,從而實現更高進度的相位調節和鎖定。2)直接對定時計數器中的計數值進行操作,可以避免調節程式碼本身執行時間帶來的時間誤差。 

本環節揭示出的電子電工教學中的問題:

a) 學生缺乏複雜工程問題的練習。如果沒有足夠複雜的工程問題作為教學例項或練習題,這些問題佔用記憶體有限,很難造成棧空間的溢位,也不會幫助學生掌握類似知識。

b) 電子電工相關專業的學生缺乏系統的計算機專業知識,即使瞭解問題所在,也很難從理論高度找到解決問題的辦法。計算機知識向各行各業滲透的今天,作為相近專業的電子電工各類專業教學體系中應該滲透更多更深刻的計算機基礎知識,為學生未來的發展打下寬口徑的基礎。

11.  測試結果展示 

我用是德科技的DSOX6004A四通道示波器和普源精電的DS1022U兩通道同步訊號發生器進行了測試。結果令人滿意。

 

1) 直接測試

 

以下圖片中,黃色和綠色的通道1&通道2是訊號發生器產生的標準訊號A和B,藍色和紅色的通道3&通道4則是嵌入式處理器重建的分離訊號A’和B’。圖10所示的是輸入A、B分別為30KHz和60KHz的正弦波條件下的輸出情況。採用通道1輸入的30KHz訊號作為示波器觀察的觸發訊號,可以發現通道2輸入的重建30KHz訊號能夠“連續穩定同頻顯示”(題目要求)。採用通道3輸入的60KHz訊號作為示波器觀察的觸發訊號,可以發現通道4輸入的重建60KHz訊號也能夠“連續穩定同頻顯示”。

注:有的雙通道訊號發生器產生兩路具有倍數關係的訊號時,這兩路訊號自己之間都沒有同步關係,無法“連續穩定同頻顯示”。這可能是由於訊號發生器內部的兩個電路之間沒有同步造成的,例如我用的是德科技的DSOX6004A附帶兩路訊號發生器就無法做到同步輸出,所以後面的測試中我沒有使用DSOX6004A自帶的訊號發生器,而是使用了專用的雙通道訊號發生器DS1022U(普源精電)。當然使用這種兩路訊號不同步的訊號發生器的並不影響本題的完成,因為參賽者不一定要像圖10這樣同時觀察所有四路訊號,而是可以分別觀察A和A’,以及B和B’,並最終保證兩對訊號分別“連續穩定同頻顯示”即可算達到要求。

圖10 A、B分別為30KHz和60KHz的正弦波時的輸出 

下圖所示的是輸入為95KHz的較高頻率下的輸出。除輸出訊號相位略有抖動外,輸出功能正常。 

隨著頻率增加,訊號發生器產生的訊號與STM32重建的訊號頻率之間的差異的絕對值雖然不變,但這個絕對誤差相對於訊號的週期卻會相應增加。所以訊號頻率越高,肉眼觀測到的抖動就會越明顯。

如果想獲得更佳的相位鎖定效果,應降低兩次相位調整之間的間隔,這需要更高的處理速度,可以考慮更高效能的MCU或FPGA。但個人覺得這個解決方案的工作量,已經超過了電子設計競賽幾天能夠完成工作量的上限。

 

圖11 A為35KHz的正弦波時的輸出 

 

 下圖所示的是本文6.2小節所述的:“較高輸入頻率剛好等於較低輸入頻率3倍,且低頻訊號為三角波”的特殊情況,此時會產生低頻訊號三次諧波被高頻訊號“汙染”的情況。我採用了5次諧波判斷的方法,由下圖可知,結果還是很理想的。

圖12 較高輸入頻率為較低頻率3倍時,訊號型別識別結果 

2) 用相位檢測晶片評估系統效能

為驗證系統的效能,我使用了模擬相位檢測晶片AD8302對輸入訊號A和重建訊號A’之間的相位差進行了實時檢測。該項測試不屬於大學生電子設計競賽要求的內容,純屬我自己為了評估演算法的效能,加之手頭又剛好有一塊康威科技的AD8302的測試/開發板,才做的自選內容。

AD8302的效能引數這裡不再贅述,感興趣的可以閱讀ADI的手冊[2]。對於本測試比較有用的是其“輸入訊號相位差<--->輸出電壓”之間的傳遞函式。

圖13 AD8302測試電路及其“輸入訊號相位差<--->輸出電壓”的傳遞函式

 當我關閉STM32中演算法的相位自動調節功能時,把訊號A和A’作為AD8302的兩個輸入,同時連線到示波器的通道1(黃色)和通道3(藍色);代表二者相位差的AD8302輸出VPHS連線到示波器的通道2(綠色)。得到了下圖的輸出波形。

圖14 不進行相位實時調節功能時AD8302的輸出

 

對比手冊中的傳遞函式,可以得到結論:訊號發生器輸出的訊號和STM32重建的訊號具有非常接近和穩定的頻率,但兩者存在基本恆定的微小差異。從而導致了AD8302輸出呈現出穩定的線性遞增的相位差,因此示波器的綠色通道呈現出了類似圖11所示的三角形輸出,其週期約為週期約為600ms,表明A和未經相位實時調節的A’訊號大約會在600ms左右會相差一個正弦週期。

當我開啟STM32中演算法的相位自動調節功能時,AD8302的輸出如下圖所示。注意:此時通道2(綠色)的縱向解析度為200mV

圖15 演算法進行相位實時調節過程中AD8302的輸出

 

而通道4(紅色)測試的是我特意設定的一個GPIO的輸出,它在軟體執行到特定的位置時被置高或置低,以方便除錯時觀察軟體執行狀態。(注:該管腳被我命名為TST_PIN,它被置高和置低的位置,我標註在圖5所示的“程式整體流程圖”中灰色的地方)

觀察圖15所示的相位檢測晶片AD8302的輸出可以得到以下結論:

(1)演算法會在通道4(紅色)所示方波的一個週期內進行一次相位自動調整。調整之前,由於A和A’之間頻率的微小差異造成相位誤差累計增加,體現為AD8302的相位誤差輸出(通道2,綠色)線性增加。每次調整後,相位誤差回覆到相同的水平。在時域觀察就得到圖10所示的波形,相位差基本不變,示波器能夠“穩定不漂移”的顯示原訊號和重建訊號。

(2)當相位調整越頻繁,(即紅色方波週期越短,目前約為200-250ms)時,相位差累計也就越小(即綠色鋸齒波的幅度就越小,目前約為200mV),它所代表的相位波動也就越小。目前使用的STM32F1系列@56MHz,對兩路訊號的相位校正計算時間約為200-250ms。若想進一步提高計算速度,可以改用支援浮點運算的STM32F40X系列(注:至於如何在STM32F40X下開啟浮點運算單元FPU,及其對浮點運算的加速能力評估,請參見鄙人的博文:ARM DSP庫CMSIS-DSP的使用——以STM32F4浮點FFT為例)。當然如果使用FPGA,在資料採集的同時實現DFT和相位估算,計算將不再成為問題,限制相位調整頻率的將只有A/D取樣的時長L而已。

(3)AD8302輸出的相位差電壓(綠色通道),除週期與紅色方波同步的鋸齒波外,顯示曲線“較粗”。這是該電壓訊號線上耦合的高頻訊號,該高頻訊號頻率與A訊號相同。其成因很簡單:AD8302是一隻可以工作到2.7GHz射頻相位檢測器,其輸出頻寬大於100KHz。康威科技的這塊開發板並未對相位輸出VPHS進行濾波,當輸入訊號A和B的頻率小於其輸出頻寬時,難免有部分輸入訊號耦合到輸出。對於想嘗試使用本文第2節所述的方案2的讀者,務必注意這個問題。

參考文獻:

[1] 胡廣書. 數字訊號處理——理論、演算法與實現. 2nd ed. Beijing: 清華大學出版社, 2003. 

[2] Analog Devices, “AD8302: LF–2.7 GHz RF/IF Gain and Phase Detector” Data Sheet, Rev. B,  Date of Publication: September 28, 2006, [Online]. Retrieved from: <https://www.analog.com/media/en/technical-documentation/data-sheets/ad8302.pdf> on January 18, 2024.

 

相關文章