David Skolnick 和 Noam Levine
如果您已經閱讀了本系列的第1部分(或者已經熟悉DSP處理實際信號的一些方法),您可能想詳細了解如何使用DSP實現數字濾波器(如第1部分中描述的濾波器)。本文是系列文章的第二篇,介紹以下 DSP 主題:
建模過濾器變換函數
將模型與 DSP 架構相關聯
嘗試使用數字濾波器
本系列旨在從希望將DSP添加到其設計庫中的模擬系統設計人員的角度來描述這些主題。使用本系列文章中的信息作為介紹,設計人員可以就何時DSP設計可能比模擬電路更高效做出更明智的決策。
建模過濾器轉換函數
第1部分比較了模擬和數字濾波器的特性,并提出了為什么可以通過數字方式(使用DSP)實現這些濾波器;本部分重點介紹數字濾波器應用的一些機制。
使用數字濾波的三個主要原因是(1)更接近理想濾波器近似值,(2)能夠在軟件中調整濾波器特性,而不是通過物理調諧,以及(3)濾波器響應與采樣數據的兼容性。第1部分介紹的兩個最著名的濾波器是有限脈沖響應(FIR)和無限脈沖響應(IIR)類型。FIR 濾波器響應稱為有限響應,因為它的輸出僅基于一組有限的輸入樣本;它是非遞歸的,沒有極點,在其S平面上只有零。另一方面,IIR濾波器的響應可以無限期地持續(并且可能不穩定),因為它是遞歸的,即其輸出值受到輸入和輸出的影響。它的 s 平面上有極點和零點。圖 1 顯示了第 1 部分中出現的典型濾波器架構和求和公式。
圖1.濾波器方程及其延遲線模型。
要對這些過濾器進行數字建模,可能需要兩個步驟。首先,將這些公式視為在計算機上運行的程序。此步驟包括將公式分解為數學步驟(例如,乘法和加法),并確定計算機執行所需的所有其他操作(處理指令和數據,測試狀態等)以在軟件中實現公式。
其次,將這些操作編寫為程序。這可能是一項相當艱巨的任務。幸運的是,有很多“預制”軟件可用,通常是像C這樣的高級語言(HLL),在某種程度上簡化了(但絕不是消除!)編程工作。不過,從學習的角度來看,從匯編語言開始可能更有啟發性;此外,匯編語言算法通常比必須優化系統性能的 HLL 更有用。在某些高級語言的抽象級別,程序可能看起來不太像方程。例如,圖 2 顯示了作為 C 程序實現的 FIR 算法的示例。
float fir_filter(float input, float *coef, int n, float *history)
{
int i;
float *hist_ptr, *hist1_ptr, *coef_ptr;
float output;
hist_ptr = history;
hist1_ptr = hist_ptr; /* use for history update */
coef_ptr = coef + n -1; /* point to last coef */
/*form output accumulation */
output = *hist_ptr++ * (*coef_ptr-);
for(i = 2; i < n; i++)
{
*hist1_ptr++ = *hist_ptr; /* update history array */
output += (*hist_ptr++) * (*coef_ptr-);
}
output += input * (*coef_ptr); /* input tap */
*hist1_ptr = input; /* last history */
return(output);
}
有許多支持算法建模的分析包可用;請參閱本文末尾的參考資料,了解幾個流行的軟件包。在本系列的不同時間,我們將回到算法建模。現在,繼續討論該過程,在這些濾波器算法建模之后,它們就可以在DSP架構中實現了。
將模型與DSP架構相關聯:對于編程,必須了解DSP架構的四個部分:數字、存儲器、序列器和I/O操作。此體系結構討論是通用的(適用于一般 DSP 概念),但它也是具體的,因為它與本文后面的編程示例相關。圖 3 顯示了本節介紹的通用 DSP 架構。
建筑
數字部分:由于 DSP 必須在單個指令周期內完成乘法/累加、加、減和/或位移運算,因此針對數字運算優化的硬件是所有 DSP 處理器的核心。正是這種硬件將DSP與通用微處理器區分開來,通用微處理器可能需要許多周期才能完成這些類型的操作。在數字濾波器(和其他DSP算法)中,DSP必須完成涉及數據值和系數的多個算術運算步驟,以實時產生通用處理器無法實現的響應。
數字運算發生在DSP的乘法/累加器(MAC)、算術邏輯單元(ALU)和桶形移位器(移位器)中。MAC執行乘積總和運算,這些運算出現在大多數DSP算法(如FIR和IIR濾波器以及快速傅里葉變換)中。ALU 功能包括加法、減法和邏輯運算。對位和字的操作發生在移位器內。圖 3 顯示了 MAC、ALU 和移位器的并行度,以及數據如何流入和流出它們。
圖3.有用的 DSP 架構。
從編程的角度來看,使用單獨數字部分的DSP架構提供了極大的靈活性和效率。數據有許多不沖突的路徑,允許單周期完成數值運算。DSP的架構還必須為MAC操作提供寬動態范圍,能夠處理兩倍于輸入寬度的乘法結果,以及可以安裝而不會溢出的累加器輸出。(在 16 位 DSP 上,此功能相當于 MAC 的 16 位數據輸入和 40 位結果輸出。需要此范圍來處理大多數DSP算法(例如濾波器)。
數字部分的其他功能可以促進實時系統中的編程。通過使操作依賴于由數值運算產生的各種條件狀態,這些狀態可以作為程序執行、進位、溢出、飽和、標志或其他狀態測試中的變量。使用這些條件,DSP 可以根據數值運算快速處理有關程序流的決策。需要不斷將數據饋送到數字部分,這是影響DSP存儲器和內部總線結構的關鍵設計因素。
內存部分:DSP存儲器和總線架構設計以速度需求為導向。數據和指令必須在每個指令周期流入DSP的數字和排序部分。不能有延誤,不能有瓶頸。設計的所有內容都集中在吞吐量上。
哈佛和馮諾依曼架構的詞源 - 根據弗吉尼亞理工大學計算機科學系的John A. N. Lee: 哈佛系列機器的開發者霍華德·艾肯(Howard Aiken)堅持在他的所有機器中分離數據和程序。在我最熟悉的Mark III中,他甚至為每個鼓準備了不同尺寸的鼓。 “馮·諾依曼的概念是,通過將指令視為數據,可以對程序進行更改,增強程序'學習'的能力。 “出于某種原因,后者被賦予了馮·諾依曼的名字,而前者的名字來自哈佛大學的機器系列。” |
為了正確看待吞吐量,可以看看DSP存儲器設計與其他微處理器存儲器之間的區別。大多數微處理器使用包含數據和指令的單個存儲器空間,使用一條總線作為地址,另一條用于數據或指令。這種架構被稱為馮諾依曼架構。馮諾依曼架構中對吞吐量的限制來自于必須在每個周期的一段數據或一條指令之間進行選擇。在DSP中,存儲器通常分為程序存儲器和數據存儲器,每個存儲器都有單獨的總線。這種類型的架構被稱為哈佛架構。通過分離數據和指令,DSP可以在每個周期中獲取多個項目,從而使吞吐量翻倍。指令緩存、結果反饋和上下文切換等其他優化也提高了 DSP 吞吐量。
DSP 存儲器架構中的其他優化與重復存儲器訪問有關。大多數DSP算法(如數字濾波器)需要以重復訪問模式從存儲器中獲取數據。通常,這種類型的訪問用于從一系列地址中獲取數據,該范圍充滿了來自要處理的真實信號的數據。通過減少“管理”存儲器訪問所需的指令數量(開銷),DSP可以“保存”指令周期,從而為每個周期處理信號的主要工作留出更多時間。為了減少開銷并自動管理這些類型的訪問,DSP 利用專用數據地址生成器 (DAG)。
大多數DSP算法要求在單個周期內從存儲器中獲取兩個操作數,以成為算術單元的輸入。為了以靈活的方式提供這兩個操作數的地址,DSP 有兩個 DAG。在DSP改進的哈佛架構中,一個地址生成器通過數據存儲器地址總線提供地址;另一個通過程序存儲器地址總線提供地址。通過為下一條數字指令及時執行這兩個數據獲取,DSP能夠維持指令的單周期執行。
DSP算法(例如示例數字濾波器)通常需要對地址范圍(緩沖區)中的數據進行尋址,以便地址指針從緩沖區的末尾“環繞”回緩沖區的開頭(緩沖區長度)。此指針移動稱為循環緩沖。(在濾波器方程中,每個求和基本上都是由數據點循環緩沖區和系數循環緩沖區的乘法累加序列得出的)。循環緩沖的變體(在某些應用程序中是必需的)將地址指針推進每個“步長”大于一個地址的值,但仍以給定長度環繞。這種變化稱為模循環緩沖。
通過其DAG支持各種類型的緩沖,DSP能夠在硬件中執行地址修改和比較操作,以實現最佳效率。在軟件中執行這些功能(如在通用處理器中發生)會限制處理器處理實時信號的能力。
由于緩沖是一個不尋常的概念,但卻是數字信號處理的關鍵,因此一個簡短的緩沖示例非常有用。在圖 4 所示的示例中,從地址 30 開始,內存中駐留了八個位置的緩沖區。地址生成器必須計算保留在此緩沖區內的下一個地址,但保持適當的數據間距,以便跳過兩個位置。地址生成器將地址 30 輸出到地址總線上,同時將地址修改為 33 以進行下一個周期的內存訪問。此過程重復,在緩沖區中移動地址指針。當地址 36 修改為 39 時,會出現特殊情況。地址 39 位于緩沖區外部。地址生成器檢測到地址已落在緩沖區邊界之外,并將地址修改為 31,就像緩沖區的末尾連接到緩沖區的開頭一樣。更新、比較和修改不會產生任何開銷。在一個周期內,地址36被輸出到地址總線上。在下一個周期,地址31被輸出到地址總線上。這種模循環緩沖可滿足插值濾波器等算法的需求,并節省處理指令周期。
圖 4.模循環緩沖示例。
音序器部分:由于大多數DSP算法(例如示例濾波器)本質上是重復的,因此DSP的程序序列器需要循環遍歷重復的代碼,而不會產生開銷,同時從循環的結束返回到循環的開始。此功能稱為零開銷循環。能夠在沒有開銷的情況下進行環路是DSP與傳統微處理器區別的一個關鍵領域。通常,微處理器要求在軟件中維護程序循環,在循環的末尾放置條件指令。此條件指令確定地址指針是移動(跳轉)回循環頂部還是另一個地址。由于從存儲器中獲取這些地址需要時間,而信號處理時間的可用性在DSP應用中至關重要,因此DSP不能浪費周期以這種方式檢索條件程序排序(分支)的地址。相反,DSP 在硬件中執行這些測試和分支功能,存儲所需的地址。
如圖5所示,DSP在一個周期內執行環路的最后一條指令。在下一個周期,DSP評估條件并執行循環頂部的第一條指令或環路外的第一條指令。由于 DSP 使用專用硬件進行這些操作,因此不會在軟件評估條件、檢索地址或分支程序執行上浪費額外的時間。
圖5.程序循環示例。
輸入/輸出 (I/O) 部分:正如一再指出的那樣,需要向DSP提供巨大的數據吞吐量;關于其設計的所有內容都集中在將數據匯集到數字、內存和序列器部分。數據的來源和輸出的目的地(信號處理的結果)是DSP與其系統和現實世界的連接。完成信號處理任務需要許多I/O功能。非 DSP 存儲器陣列存儲處理器指令和數據。通信通道(如串行端口、I/O 端口和直接存儲器訪問 (DMA)通道)將數據快速傳入和傳出 DSP。其他功能(如定時器和程序啟動邏輯)簡化了DSP系統開發。DSP 系統中典型 I/O 任務的簡要列表包括以下內容(以及許多其他任務):
引導加載:在復位時,DSP通常通過外部存儲器接口從外部源(EPROM或主機)加載指令。
串行通信:DSP 通過同步串行端口 (SPORT) 接收或傳輸數據,與編解碼器、ADC、DAC 或其他設備通信。
內存映射 I/O:DSP 通過外部設備解碼的非 DSP 存儲器位置接收或傳輸數據。
試驗數字濾波器
在對濾波器算法進行建模并查看了一些DSP架構特性之后,人們準備開始研究如何用DSP匯編語言對這些濾波器進行編碼。到目前為止,討論和示例都是通用的,幾乎適用于所有DSP。此處的示例特定于ADI公司的ADSP-2181。該處理器是一個定點、16 位 DSP。術語“定點”是指分隔尾數和指數的“點”在算術運算期間不會改變其位位置。定點DSP的編程可能更具挑戰性,但它們往往比浮點DSP便宜?!?6位DSP”中的“16位”是指DSP數據字的大小。該DSP使用16位數據字和24位寬指令字。DSP 由數據大小而不是指令寬度指定,因為數據字大小描述了 DSP 可以最有效地處理的數據寬度。
該軟件有兩個部分。主例程包括寄存器和緩沖區初始化以及中斷向量表,以及數據樣本準備就緒時執行的中斷例程。初始化后,DSP 在主例程中執行指令,執行一些后臺任務、循環訪問代碼或在低功耗待機模式下空閑,直到從 A/D 轉換器獲得中斷。在此示例中,處理器在低功耗待機模式下空閑,等待中斷。
FIR 濾波器中斷子例程(代碼的最后一段)是濾波器程序的核心。處理器響應中斷,保存主例程的上下文并跳轉到中斷例程。此中斷例程處理濾波器輸入樣本,從存儲器讀取數據和濾波器系數,并將其存儲在DSP處理器的數據寄存器中。處理輸入樣本后,DSP將輸出樣本發送到D/A轉換器。
.module/RAM/ABS=0 FIR_PROGRAM;
/******** Initialize Constants and Variables *****************/
.const taps=127;
.var/dm/circ data[taps];
.var/pm/circ fir_coefs[taps];
.init fir_coefs: ;
.var/dm/circ output_data[taps];
/******** Interrupt vector table *****************************/
reset_svc: jump start; rti; rti; rti;
/*00: reset */
irq2_svc: /*04: IRQ2 */
si=io(0); /* get next sample */
dm(i0,m0)=si; /* store in tap delay line */
jump fir; /* jump to fir filter */
nop; /* nop is placeholder */
irql1_svc: rti; rti; rti; rti; /*08: IRQL1 */
irql0_svc: rti; rti; rti; rti; /*0c: IRQL0 */
sp0tx_svc: rti; rti; rti; rti; /*10: SPORT0 tx */
sp0rx_svc: rti; rti; rti; rti; /*14: SPORT1 rx */
irqe_svc: rti; rti; rti; rti; /*18: IRQE */
bdma_svc: rti; rti; rti; rti; /*1c: BDMA */
sp1tx_svc: rti; rti; rti; rti; /*20: SPORT1 tx or IRQ1 */
sp1rx_svc: rti; rti; rti; rti; /*24: SPORT1 rx or IRQ0 */
timer_svc: rti; rti; rti; rti; /*28: timer */
pwdn_svc: rti; rti; rti; rti; /*2c: power down */
/******* START OF PROGRAM - initialize mask, pointers **********/
start:
/* set up various control registers */
ICNTL=0x07; /* set IRQ2, IRQ1, IRQ0 edge sensitive */
IFC=0xFF; /* clear all pending interrupts */
NOP; /* add nop because of one cycle */
/* synchronization delay of IFC */
SI=0x0000;
DM(0x3FFF)=SI; /* sports not enabled */
/* sport1 set for IRQ1, IRQ0, FI, FO */
IMASK=0x200; /* enable IRQ2 interrupt */
i0=^data; /* index to data buffer */
l0=taps; /* length of data buffer */
m0=1; /* post modify value */
i4=^fir_coefs; /* index to fir_coefs buffer */
l4=taps; /* length of fir_coefs buffer */
m4=1; /* post modify value */
i2=^output_data; /* index to data buffer */
l2=taps; /* length of data buffer */
cntr=taps;
do zero until ce;
dm(i0,m0)=0; /* clear out the tap delay data buffer */
zero: dm(i2,m0)=0; /* clear out the output_data buffer */
/**** WAIT for IRQ2 Interrupt - then JUMP to INTERRUPT VECTOR **/
wait: idle; /* wait for IRQ2 interrupt */
jump wait;
/******* FIR FILTER interrupt subroutine ***********************/
fir cntr=taps-1; /* set up loop counter */
mr=0, mx0=dm(i0,m0), my0=pm(i4,m4);
/* fetch data and coefficient */
do fir1loop until ce; /* set up loop */
fir1loop: mr=mr+mx0*my0(ss), mx0=dm(i0,m0), my0=pm(i4,m4);
/* calculations */
/* if not ce jump fir1loop;*/
mr=mr+mx0*my0(rnd); /* round final result to 16-bits */
if mv sat mr; /* if overflow, saturate */
io(1)=mr1; /* send result to DAC */
dm(i2,m0)=mr1;
rti;
/******* END OF PROGRAM *************************************/
.endmod;
請注意,此程序使用 DSP 功能,這些功能以零開銷執行操作,通常由條件引入。特別是,程序循環和數據緩沖區以零開銷進行維護。濾波器循環核心中的多功能指令執行乘法/累加運算,同時從內存中獲取下一個數據字和濾波器系數。
程序檢查過濾器計算的最終結果是否有任何溢出。如果最終值溢出,則該值將飽和以模擬模擬信號的削波。最后,恢復主例程的上下文,并通過中斷返回 (RTI) 指令將指令流返回到主例程。
查看和預覽
本文的目的是提供濾波器理論與數字濾波器實現之間的聯系。在此過程中,本文將介紹如何使用 HLL 程序對濾波器進行建模、使用 DSP 架構以及試驗濾波器軟件。本文介紹的問題包括:
過濾器作為程序
DSP 架構(通用)
DSP 匯編語言
由于這些問題涉及許多有價值的細節級別,在這篇簡短的文章中無法公正地描述,因此您應該考慮閱讀Richard Higgins的文本,VLSI中的數字信號處理和Paul Embree的文本,實時DSP的C算法(見下面的參考文獻)。這些文本提供了DSP理論,實現問題和實踐簡化(發布時可用的設備)的完整概述,以及練習和示例。下面的參考部分還包含進一步放大本文問題的其他來源。為準備本系列的下一篇文章,您可能需要免費獲取ADSP-2100系列用戶手冊*或ADSP-2106x SHARC用戶手冊。 這些文本提供有關ADI公司的定點和浮點DSP架構的信息,這是這些文章的主要主題。在本系列中,每個部分都增加了一些功能或信息,有助于實現開發DSP系統的系列目標。
審核編輯:郭婷
-
dsp
+關注
關注
554文章
8059瀏覽量
350439 -
模擬電路
+關注
關注
125文章
1574瀏覽量
102898 -
濾波器
+關注
關注
161文章
7860瀏覽量
178934
發布評論請先 登錄
相關推薦
評論