David Skolnick 和 Noam Levine
如果您已經閱讀了本系列的第1部分(或者已經熟悉DSP處理實際信號的一些方法),您可能想詳細了解如何使用DSP實現(xiàn)數(shù)字濾波器(如第1部分中描述的濾波器)。本文是系列文章的第二篇,介紹以下 DSP 主題:
建模過濾器變換函數(shù)
將模型與 DSP 架構相關聯(lián)
嘗試使用數(shù)字濾波器
本系列旨在從希望將DSP添加到其設計庫中的模擬系統(tǒng)設計人員的角度來描述這些主題。使用本系列文章中的信息作為介紹,設計人員可以就何時DSP設計可能比模擬電路更高效做出更明智的決策。
建模過濾器轉換函數(shù)
第1部分比較了模擬和數(shù)字濾波器的特性,并提出了為什么可以通過數(shù)字方式(使用DSP)實現(xiàn)這些濾波器;本部分重點介紹數(shù)字濾波器應用的一些機制。
使用數(shù)字濾波的三個主要原因是(1)更接近理想濾波器近似值,(2)能夠在軟件中調整濾波器特性,而不是通過物理調諧,以及(3)濾波器響應與采樣數(shù)據的兼容性。第1部分介紹的兩個最著名的濾波器是有限脈沖響應(FIR)和無限脈沖響應(IIR)類型。FIR 濾波器響應稱為有限響應,因為它的輸出僅基于一組有限的輸入樣本;它是非遞歸的,沒有極點,在其S平面上只有零。另一方面,IIR濾波器的響應可以無限期地持續(xù)(并且可能不穩(wěn)定),因為它是遞歸的,即其輸出值受到輸入和輸出的影響。它的 s 平面上有極點和零點。圖 1 顯示了第 1 部分中出現(xiàn)的典型濾波器架構和求和公式。
圖1.濾波器方程及其延遲線模型。
要對這些過濾器進行數(shù)字建模,可能需要兩個步驟。首先,將這些公式視為在計算機上運行的程序。此步驟包括將公式分解為數(shù)學步驟(例如,乘法和加法),并確定計算機執(zhí)行所需的所有其他操作(處理指令和數(shù)據,測試狀態(tài)等)以在軟件中實現(xiàn)公式。
其次,將這些操作編寫為程序。這可能是一項相當艱巨的任務。幸運的是,有很多“預制”軟件可用,通常是像C這樣的高級語言(HLL),在某種程度上簡化了(但絕不是消除?。?a target="_blank">編程工作。不過,從學習的角度來看,從匯編語言開始可能更有啟發(fā)性;此外,匯編語言算法通常比必須優(yōu)化系統(tǒng)性能的 HLL 更有用。在某些高級語言的抽象級別,程序可能看起來不太像方程。例如,圖 2 顯示了作為 C 程序實現(xiàn)的 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);
}
有許多支持算法建模的分析包可用;請參閱本文末尾的參考資料,了解幾個流行的軟件包。在本系列的不同時間,我們將回到算法建模?,F(xiàn)在,繼續(xù)討論該過程,在這些濾波器算法建模之后,它們就可以在DSP架構中實現(xiàn)了。
將模型與DSP架構相關聯(lián):對于編程,必須了解DSP架構的四個部分:數(shù)字、存儲器、序列器和I/O操作。此體系結構討論是通用的(適用于一般 DSP 概念),但它也是具體的,因為它與本文后面的編程示例相關。圖 3 顯示了本節(jié)介紹的通用 DSP 架構。
建筑
數(shù)字部分:由于 DSP 必須在單個指令周期內完成乘法/累加、加、減和/或位移運算,因此針對數(shù)字運算優(yōu)化的硬件是所有 DSP 處理器的核心。正是這種硬件將DSP與通用微處理器區(qū)分開來,通用微處理器可能需要許多周期才能完成這些類型的操作。在數(shù)字濾波器(和其他DSP算法)中,DSP必須完成涉及數(shù)據值和系數(shù)的多個算術運算步驟,以實時產生通用處理器無法實現(xiàn)的響應。
數(shù)字運算發(fā)生在DSP的乘法/累加器(MAC)、算術邏輯單元(ALU)和桶形移位器(移位器)中。MAC執(zhí)行乘積總和運算,這些運算出現(xiàn)在大多數(shù)DSP算法(如FIR和IIR濾波器以及快速傅里葉變換)中。ALU 功能包括加法、減法和邏輯運算。對位和字的操作發(fā)生在移位器內。圖 3 顯示了 MAC、ALU 和移位器的并行度,以及數(shù)據如何流入和流出它們。
圖3.有用的 DSP 架構。
從編程的角度來看,使用單獨數(shù)字部分的DSP架構提供了極大的靈活性和效率。數(shù)據有許多不沖突的路徑,允許單周期完成數(shù)值運算。DSP的架構還必須為MAC操作提供寬動態(tài)范圍,能夠處理兩倍于輸入寬度的乘法結果,以及可以安裝而不會溢出的累加器輸出。(在 16 位 DSP 上,此功能相當于 MAC 的 16 位數(shù)據輸入和 40 位結果輸出。需要此范圍來處理大多數(shù)DSP算法(例如濾波器)。
數(shù)字部分的其他功能可以促進實時系統(tǒng)中的編程。通過使操作依賴于由數(shù)值運算產生的各種條件狀態(tài),這些狀態(tài)可以作為程序執(zhí)行、進位、溢出、飽和、標志或其他狀態(tài)測試中的變量。使用這些條件,DSP 可以根據數(shù)值運算快速處理有關程序流的決策。需要不斷將數(shù)據饋送到數(shù)字部分,這是影響DSP存儲器和內部總線結構的關鍵設計因素。
內存部分:DSP存儲器和總線架構設計以速度需求為導向。數(shù)據和指令必須在每個指令周期流入DSP的數(shù)字和排序部分。不能有延誤,不能有瓶頸。設計的所有內容都集中在吞吐量上。
哈佛和馮諾依曼架構的詞源 - 根據弗吉尼亞理工大學計算機科學系的John A. N. Lee: 哈佛系列機器的開發(fā)者霍華德·艾肯(Howard Aiken)堅持在他的所有機器中分離數(shù)據和程序。在我最熟悉的Mark III中,他甚至為每個鼓準備了不同尺寸的鼓。 “馮·諾依曼的概念是,通過將指令視為數(shù)據,可以對程序進行更改,增強程序'學習'的能力。 “出于某種原因,后者被賦予了馮·諾依曼的名字,而前者的名字來自哈佛大學的機器系列?!?/strong> |
為了正確看待吞吐量,可以看看DSP存儲器設計與其他微處理器存儲器之間的區(qū)別。大多數(shù)微處理器使用包含數(shù)據和指令的單個存儲器空間,使用一條總線作為地址,另一條用于數(shù)據或指令。這種架構被稱為馮諾依曼架構。馮諾依曼架構中對吞吐量的限制來自于必須在每個周期的一段數(shù)據或一條指令之間進行選擇。在DSP中,存儲器通常分為程序存儲器和數(shù)據存儲器,每個存儲器都有單獨的總線。這種類型的架構被稱為哈佛架構。通過分離數(shù)據和指令,DSP可以在每個周期中獲取多個項目,從而使吞吐量翻倍。指令緩存、結果反饋和上下文切換等其他優(yōu)化也提高了 DSP 吞吐量。
DSP 存儲器架構中的其他優(yōu)化與重復存儲器訪問有關。大多數(shù)DSP算法(如數(shù)字濾波器)需要以重復訪問模式從存儲器中獲取數(shù)據。通常,這種類型的訪問用于從一系列地址中獲取數(shù)據,該范圍充滿了來自要處理的真實信號的數(shù)據。通過減少“管理”存儲器訪問所需的指令數(shù)量(開銷),DSP可以“保存”指令周期,從而為每個周期處理信號的主要工作留出更多時間。為了減少開銷并自動管理這些類型的訪問,DSP 利用專用數(shù)據地址生成器 (DAG)。
大多數(shù)DSP算法要求在單個周期內從存儲器中獲取兩個操作數(shù),以成為算術單元的輸入。為了以靈活的方式提供這兩個操作數(shù)的地址,DSP 有兩個 DAG。在DSP改進的哈佛架構中,一個地址生成器通過數(shù)據存儲器地址總線提供地址;另一個通過程序存儲器地址總線提供地址。通過為下一條數(shù)字指令及時執(zhí)行這兩個數(shù)據獲取,DSP能夠維持指令的單周期執(zhí)行。
DSP算法(例如示例數(shù)字濾波器)通常需要對地址范圍(緩沖區(qū))中的數(shù)據進行尋址,以便地址指針從緩沖區(qū)的末尾“環(huán)繞”回緩沖區(qū)的開頭(緩沖區(qū)長度)。此指針移動稱為循環(huán)緩沖。(在濾波器方程中,每個求和基本上都是由數(shù)據點循環(huán)緩沖區(qū)和系數(shù)循環(huán)緩沖區(qū)的乘法累加序列得出的)。循環(huán)緩沖的變體(在某些應用程序中是必需的)將地址指針推進每個“步長”大于一個地址的值,但仍以給定長度環(huán)繞。這種變化稱為模循環(huán)緩沖。
通過其DAG支持各種類型的緩沖,DSP能夠在硬件中執(zhí)行地址修改和比較操作,以實現(xiàn)最佳效率。在軟件中執(zhí)行這些功能(如在通用處理器中發(fā)生)會限制處理器處理實時信號的能力。
由于緩沖是一個不尋常的概念,但卻是數(shù)字信號處理的關鍵,因此一個簡短的緩沖示例非常有用。在圖 4 所示的示例中,從地址 30 開始,內存中駐留了八個位置的緩沖區(qū)。地址生成器必須計算保留在此緩沖區(qū)內的下一個地址,但保持適當?shù)臄?shù)據間距,以便跳過兩個位置。地址生成器將地址 30 輸出到地址總線上,同時將地址修改為 33 以進行下一個周期的內存訪問。此過程重復,在緩沖區(qū)中移動地址指針。當?shù)刂?36 修改為 39 時,會出現(xiàn)特殊情況。地址 39 位于緩沖區(qū)外部。地址生成器檢測到地址已落在緩沖區(qū)邊界之外,并將地址修改為 31,就像緩沖區(qū)的末尾連接到緩沖區(qū)的開頭一樣。更新、比較和修改不會產生任何開銷。在一個周期內,地址36被輸出到地址總線上。在下一個周期,地址31被輸出到地址總線上。這種模循環(huán)緩沖可滿足插值濾波器等算法的需求,并節(jié)省處理指令周期。
圖 4.模循環(huán)緩沖示例。
音序器部分:由于大多數(shù)DSP算法(例如示例濾波器)本質上是重復的,因此DSP的程序序列器需要循環(huán)遍歷重復的代碼,而不會產生開銷,同時從循環(huán)的結束返回到循環(huán)的開始。此功能稱為零開銷循環(huán)。能夠在沒有開銷的情況下進行環(huán)路是DSP與傳統(tǒng)微處理器區(qū)別的一個關鍵領域。通常,微處理器要求在軟件中維護程序循環(huán),在循環(huán)的末尾放置條件指令。此條件指令確定地址指針是移動(跳轉)回循環(huán)頂部還是另一個地址。由于從存儲器中獲取這些地址需要時間,而信號處理時間的可用性在DSP應用中至關重要,因此DSP不能浪費周期以這種方式檢索條件程序排序(分支)的地址。相反,DSP 在硬件中執(zhí)行這些測試和分支功能,存儲所需的地址。
如圖5所示,DSP在一個周期內執(zhí)行環(huán)路的最后一條指令。在下一個周期,DSP評估條件并執(zhí)行循環(huán)頂部的第一條指令或環(huán)路外的第一條指令。由于 DSP 使用專用硬件進行這些操作,因此不會在軟件評估條件、檢索地址或分支程序執(zhí)行上浪費額外的時間。
圖5.程序循環(huán)示例。
輸入/輸出 (I/O) 部分:正如一再指出的那樣,需要向DSP提供巨大的數(shù)據吞吐量;關于其設計的所有內容都集中在將數(shù)據匯集到數(shù)字、內存和序列器部分。數(shù)據的來源和輸出的目的地(信號處理的結果)是DSP與其系統(tǒng)和現(xiàn)實世界的連接。完成信號處理任務需要許多I/O功能。非 DSP 存儲器陣列存儲處理器指令和數(shù)據。通信通道(如串行端口、I/O 端口和直接存儲器訪問 (DMA)通道)將數(shù)據快速傳入和傳出 DSP。其他功能(如定時器和程序啟動邏輯)簡化了DSP系統(tǒng)開發(fā)。DSP 系統(tǒng)中典型 I/O 任務的簡要列表包括以下內容(以及許多其他任務):
引導加載:在復位時,DSP通常通過外部存儲器接口從外部源(EPROM或主機)加載指令。
串行通信:DSP 通過同步串行端口 (SPORT) 接收或傳輸數(shù)據,與編解碼器、ADC、DAC 或其他設備通信。
內存映射 I/O:DSP 通過外部設備解碼的非 DSP 存儲器位置接收或傳輸數(shù)據。
試驗數(shù)字濾波器
在對濾波器算法進行建模并查看了一些DSP架構特性之后,人們準備開始研究如何用DSP匯編語言對這些濾波器進行編碼。到目前為止,討論和示例都是通用的,幾乎適用于所有DSP。此處的示例特定于ADI公司的ADSP-2181。該處理器是一個定點、16 位 DSP。術語“定點”是指分隔尾數(shù)和指數(shù)的“點”在算術運算期間不會改變其位位置。定點DSP的編程可能更具挑戰(zhàn)性,但它們往往比浮點DSP便宜。“16位DSP”中的“16位”是指DSP數(shù)據字的大小。該DSP使用16位數(shù)據字和24位寬指令字。DSP 由數(shù)據大小而不是指令寬度指定,因為數(shù)據字大小描述了 DSP 可以最有效地處理的數(shù)據寬度。
該軟件有兩個部分。主例程包括寄存器和緩沖區(qū)初始化以及中斷向量表,以及數(shù)據樣本準備就緒時執(zhí)行的中斷例程。初始化后,DSP 在主例程中執(zhí)行指令,執(zhí)行一些后臺任務、循環(huán)訪問代碼或在低功耗待機模式下空閑,直到從 A/D 轉換器獲得中斷。在此示例中,處理器在低功耗待機模式下空閑,等待中斷。
FIR 濾波器中斷子例程(代碼的最后一段)是濾波器程序的核心。處理器響應中斷,保存主例程的上下文并跳轉到中斷例程。此中斷例程處理濾波器輸入樣本,從存儲器讀取數(shù)據和濾波器系數(shù),并將其存儲在DSP處理器的數(shù)據寄存器中。處理輸入樣本后,DSP將輸出樣本發(fā)送到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 功能,這些功能以零開銷執(zhí)行操作,通常由條件引入。特別是,程序循環(huán)和數(shù)據緩沖區(qū)以零開銷進行維護。濾波器循環(huán)核心中的多功能指令執(zhí)行乘法/累加運算,同時從內存中獲取下一個數(shù)據字和濾波器系數(shù)。
程序檢查過濾器計算的最終結果是否有任何溢出。如果最終值溢出,則該值將飽和以模擬模擬信號的削波。最后,恢復主例程的上下文,并通過中斷返回 (RTI) 指令將指令流返回到主例程。
查看和預覽
本文的目的是提供濾波器理論與數(shù)字濾波器實現(xiàn)之間的聯(lián)系。在此過程中,本文將介紹如何使用 HLL 程序對濾波器進行建模、使用 DSP 架構以及試驗濾波器軟件。本文介紹的問題包括:
過濾器作為程序
DSP 架構(通用)
DSP 匯編語言
由于這些問題涉及許多有價值的細節(jié)級別,在這篇簡短的文章中無法公正地描述,因此您應該考慮閱讀Richard Higgins的文本,VLSI中的數(shù)字信號處理和Paul Embree的文本,實時DSP的C算法(見下面的參考文獻)。這些文本提供了DSP理論,實現(xiàn)問題和實踐簡化(發(fā)布時可用的設備)的完整概述,以及練習和示例。下面的參考部分還包含進一步放大本文問題的其他來源。為準備本系列的下一篇文章,您可能需要免費獲取ADSP-2100系列用戶手冊*或ADSP-2106x SHARC用戶手冊。 這些文本提供有關ADI公司的定點和浮點DSP架構的信息,這是這些文章的主要主題。在本系列中,每個部分都增加了一些功能或信息,有助于實現(xiàn)開發(fā)DSP系統(tǒng)的系列目標。
審核編輯:郭婷
-
dsp
+關注
關注
554文章
8062瀏覽量
351212 -
模擬電路
+關注
關注
125文章
1577瀏覽量
103001 -
濾波器
+關注
關注
161文章
7900瀏覽量
179280
發(fā)布評論請先 登錄
相關推薦
數(shù)字信號處理器DSP技術入門(附送算法設計與系統(tǒng)方案)
哪位大神關于《數(shù)字信號處理與數(shù)字信號處理器》的DSP論.....
DSP數(shù)字信號處理簡述
《DSP系統(tǒng)課程設計》教學大綱
數(shù)字信號處理(DSP)應用系統(tǒng)中的低功耗設計
數(shù)字信號處理器(DSP)
數(shù)字信號處理和DSP系統(tǒng)的學習教程免費下載

數(shù)字信號處理:DSP系統(tǒng)設計入門課程

評論