多通道音頻信號處理 (DTMF decoders) 指導教授:蔡亮宙老師 簡聰富老師

advertisement
多通道音頻信號處理
(DTMF decoders)
指導教授:蔡亮宙老師
簡聰富老師
學
生:劉念宗
中華民國 九十 年 九 月 十二 日
主題架構
• 數位振盪器(Digital Oscillators)
• Goertzel’s algorithm (演算法)
• Interrupt(中斷)之資料結構與應用
數位振盪器原理推導
利用正弦波 sin x 的指數形式 :
可以得到正弦序列 :
的 z 轉換
設系統的轉移函數
H(z) = Y(z)/X(z)
就是正弦序列 sinkwT的
z 轉換,即
Digital Oscillators(數位振盪器)
Digital Sinusoidal Oscillators :
H(z) = [b0*z^(-1)]/[1+a1*z^(-1)+a2*z^(-2)] -----(1)
where
b0 = Asin(w0)
a1 = -2*cos(w0)
a2 = 1
w0= 2πfi/fs ;fs:sampling frequency
 H(z) = [Asin(w0)*z^(-1)]/[1-2*cos(w0)*z^(-1)+z^(-2)]
 P1,2 = [cos(w0)+j sin(w0)],[cos(w0)-j sin(w0)]
= 1∠w0
探討Digital Oscillators
與 DTMF decoders
• P1,2是一對複數根,其振幅值為1,Phase為w0。
振幅值為1的極點對應一個數位振盪器,其頻率
由係數b0,a1和a2來決定 。
b0 = Asin(w0)
-1
1
a1 = -2*cos(w0)
z-plane
a2 = 1
• 因此,設計一個振盪器,主要在於確定這些係數
由上式(1) :
H(z) = [b0*z^(-1)]/[1+a1*z^(-1)+a2*z^(-2)] -----(1)
可得:
Y(z)+a1*z^(-1)*Y(z)+a2*z^(-2)*Y(z) = b0*z^(-1)*X(z)
 y[n]+a1*y[n-1]+a2*y[n-2] = b0*x[n-1]
或是
 y[n] = -a1*y[n-1]-a2*y[n-2]+b0*x[n-1] -------------(2)
上列(2)式,是一個二階差分方程式。
而DTMF decoder 方程式為:
Y(n)= X(n)+2cos(coef)×Y(n-1)+(-1)Y(n-2) ---------(3)
where coef =360×frequency/sample rate
X(n) is the current sample value.
Y(n-1) and Y(n-2) are feedback storage elements
將上式(2) ---數位振盪器的差分方程式與
上式(3) ---DTMF decoder方程式互相比對,此時
b0 = 1
a1 = -2*cos(coef)
a2 = 1
where coef= 2πfi/fs ; fs:sampling frequency
令H(z)的分母[z^2-2*cos(coef)*z+1]=0,求得:
P1,2= [cos(coef)+j sin(coef)],[cos(coef)-j sin(coef)]
= 1∠coef
可以明確的知道:DTMF的行(高頻),列(低頻)等八個
頻率之組合是由數位振盪器來提供的。
再者,DTMF tone 並非只產生頻率,工作時間間隔
也必須指明。根據AT&T的規格說明,對於按鍵式
撥號電話而言,信號的最大傳輸速率必須為
10digits/sec(或100msec/digit)。
因此,a sample-store interval takes approximately 25 ms.
並且為了解決32 channels在DFT processing時,無法儲
存時間(save time)而使得資料遺失(data loss)的問題
使用Buffer來儲存要傳送給DFT處理的輸入資料流
(input stream)。
The buffer uses four levels to store the input data during
a 100msec interval.
Buffer Size = N 4 levels = 32 K words
where the number of samples, N, is 200 ~ 256.
Goertzel’s algorithm (演算法)
X(n)
Vk(n)
+
+
Y(n,k,N)
Z^(-1)
+
2×cos(2πk/N)
- exp(-j2×π×k/N)
Z^(-1)
-1
<Goertzel’s algorithm(演算法)應用於二階IIR濾波器的結構圖>
解析運用在DTMF的Goertzel’s algorithm
• The DTMF frequency is transformed to a discrete fourier
transform (DFT) coefficient. The relationship between the
DTMF frequency (fi) and the DFT coefficient (k) is :
k = N×fi/fs
where
fs = Sampling frequency
N = Filter length
For each k, the state variable, Vk(n) is:
Vk(n) = 2×cos(2×π×k/N)×Vk(n-1)-Vk(n-2)+X(n)
where n = 0,1,---,N
Thereafter, the output, Y(n,k,N) is:
Y(n,k,N) = Vk(N)- exp(-j2×π×k/N) ×Vk(N-1)
Goertzel’s algorithm與DTMF之能量
轉換
• The DTMF frequency at which the incoming signal
has maximum energy is the detected frequency.
This energy calculation is :
經Goertzel’s algorithm運算後的頻譜
|Y(n,k,N)|^2 = Vk(N)^2+Vk(N-1)^2 –2*cos(2πk/N)*
Vk(N)^2*Vk(N-1)^2
DTMF decoders與Goertzel’s algorithm
(1).使用Goertzel’s演算法執行離散傅立葉轉換(discrete
Fourier transform ,DFT)。
每個頻率只需要一個實數係數就可以決定數值的
振幅。
(2).Goertzel’s algorithm只要獲得任何取樣就可以立刻處
理,不必全數獲得取樣之後才進行處理。
(3).Goertzel’s algorithm運用於DTMF解碼上是非常適合
的,其優點為:
A.步驟少、執行速度快。
B.所需常數較少,可節省記憶體空間。
(4) The DTMF decoder equation is:
Y(n)= X(n)+2cos(coef)×Y(n-1)+(-1)Y(n-2)
where coef =360×frequency/sample rate
X(n) is the current sample value.
Y(n-1) and Y(n-2) are feedback storage elements
for the frequency point ,k. The value of k is :
k = N × Freq/(Sample Rate)
The decoder equation uses the initial data :
Y(-1) = 0, Y(-2) = 0, Y(-3) = 0,…for n =0,1,2,…,n-1
The sample rate is 8 KHz.
<Tone Decoder ---16 DFT Transforms >
<Modified DTMF Tone Decoder >
系統流程圖
Below Threshold
Initialize
Signal Strength?
Pointer to Next
2 Channels
Below Threshold
Above Threshold
Relative Peak?
Above Threshold
Get Channel Samples
and Store to Buffer
Channel Column 4 DFTs
No
Channel row.4 DFTs and Find
Max Channel Row Energy
No
Twist & Level
Yes
Channel-2nd Harmonic DFT
of Max Column and Max Row
Nth Sample
of DFT
Yes
Find Max Channel
Column Energy
Yes
2nd Harmonic Signal
too Strong?
No
系統流程圖(續)
to Pointer to Next 2 Channels
to Find Max Channel
No
Column Energy
Yes
Same as 2nd
to Last Digit?
No
No
Same as
Last
Digit Yes
Valid Tone Output
No
Channel
Finished?
Yes
System Implementation
RecvInt4
INT2 ISR ,turn on
IMR Recv int
Overflow?
No
Yes
Main Program
(主程式)
RecvInt
RecvInt5
Cout0Flg(= -1時,205點收到)
PQueFlg(Recv int use Nth
queue block buffer)
RecvInt6
PProcFlg(n)(Block(n)資料
已經填滿時 = -1)
Overflow?
No
Yes
RecvInt7
Interrupt
• Set up the ISR vector
INT2
• INT2 ISR ( Frame 0
INT10
INT11
• Receive int subroutine
RecvInt
RecvInt4
RecvInt5
RecvInt6
RecvInt7
)
Set up the ISR vector
.sect "vectors"
b Main
b Int1
b Int2
b Int3
.space 2 * 16
Rint: b RecvInt
XInt: b TransInt
;02 INT1 interrupt
;04 INT2 interrupt(Frame 0)
;06 INT3 interrupt
;08 TINT interrupt
;0A Serial port receive interrupt RI
;0C Serial port transmit interrupt X
TRnt: b TRecvInt
TXnt: b TTransInt
.space 18 * 16
;0E TDM receive interrupt
;10 TDM transmit interrupt
;12
Ch0 Ch1 Ch2 Ch3
F0
32 Channel
125us
8kHz
Tchannel = 125us/32
= 3.9 us
INT2 ISR ( Frame 0 )
Int2:
;turn on IMR Recv int
;FilCout(取205點)/=0,執行Int10
;Cout0Flg /=0,執行Int11
;否則,read DRR data
Int10:
;FilCout – 1
;set ar5CoefBase3c,ar6F32Ch0
; ar4PQue(B1QueCh0) &
PQue+1
Int11:
;stop Recv Int
;caculate Filter result Block address
;Block move F11Ch31 BnF11Ch31
;以ar5指向Block(n)(第n個Block)
;Clear F11Ch31~F32Ch0
;set Block(0 ~ 3)資料填滿時PProcFlg(n) = -1
;set Block number(0 ~ 3),並以PQueFlg表示
;caculate PQue address
Int2:
ldp
#FilCout
;#FilCout=#205
lmmr IMR,#D16h
;turn on IMR Recv int,
lacc FilCout,0
;FilCout =?0
bcnd Int10,neq
lacc Cout0Flg
;Cout0Flg complement
cmpl
sacl
Cout0Flg
bcnd Int11,neq
lamm DRR
lacc #205
;read DRR data
INT10
INT10:
sub One
;FilCout - 1
sacl FilCout,0
lar ar5,#CoefBase3c ;set Ar5 - Ar6
lar ar6,#F32Ch0
lar ar4,PQue
;set ar4 = PQue & PQue + 1
lacc PQue
add One
sacl PQue
rete
Int11
;stop Recv Int
;caculate Filter result Block addr
;Block move F11Ch31 BnF11Ch31
;Clear F11Ch31 ~ F32Ch0
;set PProcFlg(n) = -1,即表示Block資料已填滿
;caculate PQue addr
Int11
Int11:
lmmr IMR,#D06h ;stop Recv Int,RINT=0
;Stop Recv Int
;caculate Filter result Block addr
lt
PQueFlg
;(PQueFlg)TREG0
;PQueFlg:Block number
mpy #192
;(TREG0)*#192PREG
pac
;(PREG)ACC
adds PB1F11Ch31 ;(ACC)+(PB1F11Ch31)
;B1F11Ch31ACC
sacl TempInt
;16 LSBs of (ACC)TempInt
;TempInt=[(PQueFlg)*#192+B1F11Ch31]
mar *,ar5
;Block move F11Ch31 BnF11Ch31
lar ar5,TempInt ;ar5負責做選取4個Block的哪一個
;Block(Bn)
rpt #191
;#191RPTC,6*32=192
bldd #F11Ch31,*+
lar ar5,#F11Ch31 ;Clear F11Ch31 ~ F32Ch0
zap
;0ACC,0PREG
rpt #191
sacl *+
lacc PQueFlg ;set PProcFlg(n) = -1
;表示由ar5選取到的Block資料已經完
;全填完
adds PPProcFlg0
sacl TempInt
lar
ar5,TempInt
zap
;0ACC,0PREG
sub One
sacl *
lacc PQueFlg
;PQueFlg+1 & #3 PQueFlg
add One
and Three
;Block number
;(Bn0~3,總共4個Block)
sacl PQueFlg
;caculus PQue addr
lt
PQueFlg
;(PQueFlg)TREG0
mpy #205*32
;(TREG0)*#205*32PREG
pac
;PREGACC
;(ACC)=[(PQueFlg)*#205*32]
adds PB1QueCh0 ;(ACC)+(PB1QueCh0)
;B1QueCh0ACC
sacl PQue
rete
;16 LSBs of (ACC)PQue
lmmr IMR,#D16h
(1)
(2)
(3)
(1)lmmr : Load Memory-Mapped Register
Syntax
Direct:
[label] lmmr dma,#addr
Indirect:
[label] lmmr {ind},#addr [,next ARP]
承上(1)lmmr
Execution
PFC  MCS
(PC)+2  PC
1k  PFC
While (repeat counter/=0):
(src,addressed by PFC)(dst,specified by lower
7 bits of dma)
(PFC)+1  PFC
(repeat counter)-1 repeat counter
MCS  PFC
(2)IMR:
Interrupt Mask Register
A 16-bit memory-mapped register used to mask
interrupts.
15 9 8 7 6 5 4 3 2 1 0
Reserved
/INT4 TXNT TRNT XINT RINT TINT /INT3 /INT2 /INT1
(3)#D16h :以D16h為位址,其內容值為
16h = 0000 0001 0110(2) RINT=1,start Recv Int
lamm DRR
(1)
(2)
(1)lamm : Load Accumulator With Memory Mapped Register
Syntax
Direct:
Indirect:
[label] lamm dma
[label] lamm {ind} [,next ARP]
Execution
(PC)+1  PC
(dma)  ACC , Not affected by SXM
(2)DRR : Data Receive Register
Burst Mode Serial Port Receive Operation
Burst Mode Serial Port Receive Operation
& 16 bits 資料傳送/接收的必備條件
(1).If FSM=1 ,every transfer and the mode is referred
to as burst mode.
(2).If FO=0,data is transmitted and/or received as 16bits words.
(3).在主程式(Main Program)中的Initialization:
splk #00c8h,SPC;定義SPC中FSM=1,FO=0
PQue( B1QueCh0 ~ B1QueCh31) 特寫
;Receive int subroutine
;Processing 2 channels in single Interrupt
RecvInt:
;DRR u_law Expanding
;(1).(DRR)ACCL(Ch1 Ch0)
;(2).取出Ch0(低8Bits)
;(3).經查表(u_Tab)解壓縮後
;
存入B1QueCh0~B1QueCh31
RecvInt4
(2)計算X(n)+(-1)*Y(n-2)
(3)計算cos(coef)*Y(n-1)
;Y(n)=X(n)+2*cos(coef)*Y(n-1)+(-1)*Y(n-2)
;
(ar4) (1)計算Column係數
;(4)計算X(n)-Y(n-2)+cos(coef)*Y(n-1)
;(5)再計算X(n)+2*cos(coef)*Y(n-1)+(-1)*Y(n-2)
;4 frequency IIR
;ar4PQue(B1QueCh0 ~ B1QueCh31;X(n))
;ar5CoefBase3c,2c,1c(cos(coef))
;ar6F32Ch0(Y(n-2)),F31Ch0(Y(n-1))
RecvInt5:
;Get high byte data
RecvInt6:
;4 frequency IIR of 2nd channel
Receive Interrupt
RecvInt:
ldp #TempInt
lamm DRR
sacl TempInt
mar *,ar4
and #0ffh
add #uTab
tblr *,ar5
lar ar7,#3
;*ar4:PQue
;(B1QueCh0 ~ B1QueCh31)
;ACC and 0ffh(保留低8位元)
;(ACC)+#uTabACC
;next *ar5:#CoefBase3c
;4 Freq of 1st channel
tblr *,ar5
tblr : Table Read
Syntax
Direct:
Indirect:
[label] tblr dma
[label] tblr {ind} [,next ARP]
Execution
(PC)+1 PC
(PFC)  MCS
(ACC(15-0)) PFC
承上tblr 所述:
If ( repeat counter )/=0:
Then ( pma,addressed by PFC ) dma
Modify AR(ARP) and ARP as specified,
( PFC )+1 PFC
(repeat counter )-1  repeat counter.
Else ( pma,addressed by PFC )  dma,
Modify AR(ARP) and ARP as specified.
( MCS ) PFC
Example
RecvInt4
RecvInt4
(2)計算X(n)+(-1)*Y(n-2)
(3)計算cos(coef)*Y(n-1)
;Y(n)=X(n)+2*cos(coef)*Y(n-1)+(-1)*Y(n-2)
;
(ar4) (1)計算Column係數
;(4)計算X(n)-Y(n-2)+cos(coef)*Y(n-1)
;(5)再計算X(n)+2*cos(coef)*Y(n-1)+(-1)*Y(n-2)
;4 frequency IIR
;ar4PQue(B1QueCh0 ~ B1QueCh31;X(n))
;ar5CoefBase3c,2c,1c(cos(coef))
;ar6F32Ch0(Y(n-2)),F31Ch0(Y(n-1))
lt
*-,ar4
;ar5(CoefBase3c,2c,1c)TREG0,ar5=ar5-1
;(CoefBase2c,1c,4r),next *PQue ---- (1)
lacc *,12,ar6 ;ar4*2^12ACC,next *ar6
sub *-,16
;(ACC)-[(F32Ch0~F11Ch31)*2^16]ACC
;ar6F31Ch0 ---------------------------- (2)
mpy *
;(TREG0)*(ar6)PREG --------------- (3)
ltd *
;(ar6)TREG0,(ar6)ar6+1-----------(4)
;(ACC)+PREGACC
apac
;(ACC)+PREGACC
apac
;(ACC)+PREGACC
apac
;(ACC)+PREGACC
sach *-,0,ar7
;(ACC)(ar6+1),ar6-1,
;next *ar7(3)
bcnd RecvInt5,ov
;if(Overflow Flag)=1,
;跳至RecvInt5執行
banz RecvInt4,*-,ar5 ;if ar7/=0,跳至RecvInt4執行
ov = 1
RecvInt5:
;Get high byte data
ltd *
ltd : Load TREG0,Accumulate
Previous Product,and Move Data
Syntax
Direct: [label] ltd dma
Indirect: [label] {ind}[,next ARP]
承上ltd所述:
Execution
(PC) +1 PC
(dma) TREG0
(dma)  dma+1
(ACC) + (shifted P register)  ACC
Affected by OVM ,PM,and TRM;affects C and OV.
RecvInt5
RecvInt5
adrk #4
;ar5+4 pointer proces
lar ar7,#3
lacl TempInt ;Get high byte data
;(TempInt)ACC(15-0)
bsar 8
;(ACC)/2^8ACC ----取出高8Bits
;ACCL(00000000 Ch1,3,5,..31)
mar *,ar4
;next *ar4(B1QueCh0)
adrk #205
;ar4+#205ar4
add #uTab
;(ACC)+#uTabACC
tblr *,ar5
;rear table,(ACC(15-0))(ar4)
以陣列形式表示Channel的資料結構
以陣列形式可將“Channel”與“點數”表示為
[Channel][點數]
[0] [0]
[0~31][0~204]
:
[0][204]
即 [0][0]
[1] [0]
:
:
:
[1][204]
[31][204]
:
[31] [0]
:
[31][204]
RecvInt6
RecvInt6
lt
lacc
sub
mpy
ltd
apac
apac
apac
sach
bcnd
banz
*-,ar4
*,12,ar6
*-,16
*
*
;4 frequency IIR of 2nd channel
*-,0,ar7
RecvInt7,ov
RecvInt6,*-,ar5
RecvInt7 ---告知已經Overflow
RecvInt7
adrk #4
;adrk #3
mar *,ar4
;pointer process,ar5+4
;pointer process
;next *ar4,PQue
;(B1QueCh0 ~ B1QueCh31)
adrk #205
;ar4+#205ar4
lacc #0ffffh
;output level 0 to phone
samm DXR
;(ACC)  DXR
rete
;Enable Interrupts and From Interrupt
補充資料
補充: sammStore Accumulator in Memory-Mapped
Register
lmmr Load Memory-Mapped Register
; Ex: lmmr dma,#addr
DXR Data transmit register
DRR Data receive register
XSR Transmit shift register (不能存取,但可
允許雙緩衝功能)
RSR Receive shift register (不能存取,但可
允許雙緩衝功能)
IMR Interrupt mask register(16Bits)
The flow chart of INT2
The flow chart of the
Check Peak level and Twist
Main Program
;------------------------------ Initialization ----------------------------------Main:
setc intm
;Set Interrupt Mode Bit in ST0
setc ovm
;Set Overflow Mode Bit in ST0
ldp #0
;Load data memory pointer=0
opl #003ch,PMST
;ndx=1, ram=ovly=1
splk #00c8h,SPC
;soft=free=0, rrst=xrst=1, txm=0
;mcm=0,fsm=1, fo=0
splk #00c8h,TSPC
;same SPC
Initialization
spm 0
;No shift of multiplier output (PM=00 in ST1)
setc sxm
;sxm=1,produces sign extension on data as it is
;passed into the accumulator through the scaling shifter.
clrc cnf
;B1 = data memory
lmmr INDX,#Two ;indx=2
zap
sacl
sacl
sacl
splk
CWSR
PDWSR
IOWSR
#06h,IMR
;0-->ACC,0-->PREG
;CWSR=PDWSR=IOWSR=0
;Series Recv Int on & Int2 & Int3
Block Move
;----------------------------------- block move---------------------------------mar *,ar1
;table move,*ar1
lar ar1,#CoefBase1r;CoefBase1rar1
rpt #Len-1
;rpt #43
blpd #Table,*+
;#Table=#0800h,#Table(ar1)
;------------------------------------------------------------------------------------Table
ar1 CoefBase1r
Base1r
CoefBase2r
:
:
:
44
Harm1r
:
:
:
Len
PB1QueCh0
lar ar1,#F11Ch31;clear filter result buffer6*32=192
rpt #191
sacl *+
clrc intm
ldp #CoefBase1r ;check if need to process
MainChk0:
lar ar0,PGropSave0 ;PGropSave0(0)-->ar0
lar ar1,PGropSave1 ;PGropSave1(PProcFlg0)-->ar1
lar ar2,PGropSave2 ;PGropSave2(3)-->ar2
MainChk1
lacc *
;ar1(PProcFlg0)ACC
bcnd MainProc0,neq ;PProcFlg(n)=? –1(Block(n)資料已經
;填滿)
mar
*+,ar0
;
mar
*+,ar2
;
banz MainChk1,*-,ar1;
lar
ar0,#0
;
lar
ar1,#PProcFlg0 ;
lar
ar2,#3
;
b
MainChk1
;
MainProc(n)
MainProc0:
zap
;0ACC,0PREG
sacl *
;0 ar1(PProcFlg(n))
sar ar0,PGropSave0
sar ar1,PGropSave1
sar ar2,PGropSave2
lacc #31
sacl PChSave
;set PChSave=#31(32ch)
MainProc1
MainProc1
lt
PGropSave0
mpy #192
;Group start then,PGropSave0TREG0
;1.PFilC31b,PFilC31b
pac
adds PB1F31Ch31
sacl PFilC31b
add
One
sacl PFilC32b
;PB1F31Ch31
MainProc1(續)
lt
PGropSave0
;2.PB1QueCh31
mpy #205*32
pac
bd
MainProc2
adds PB1QueCh31
sacl PQueBuf
;PB1QueCh31
MainProc3
MainProc3:
sar ar1,PChSave
lacc PQueBuf,0
sub #205
sacl PQueBuf
lacc PFilC31b
add #6
sacl PFilC31b
add One
sacl PFilC32b
MainProc2:
lmmr INDX,#Two
;channel change then
;(ar1)PChSave
;1.PQueBuf-205,channel-1
;2.PFilC31b+6&PFilC32b+6
;indx=2
; Caculate Energy at Col 1,2,3,4 and
; Find Max Energy of Col 1,2,3,4
;ENERGY = [(Y(n-2)-Y(n-1))/2]^2 - Y(n-1)*Y(n-2)*(coef-1)
EnergyCol:
lar ar0,Two
;2ar0
lar ar1,PFilC32b
;(PFilC32b)ar1
lar ar2,#CoefBase3c
;(CoefBase3c)ar2
EnergyCol0:
;next * ar2
call EnergySr,*,ar2
;ar2-1,[(ACC)*2^1]ar2
sach *-,1,ar0
;next * ar0
banz EnergyCol0,*-,ar1 ;if ar0/=0,跳至EnergyCo10
;執行,ar0-1,next * ar1
Find Column 1,2,3
Energy Max
Check Column 1,2,3,4 level
and Relative peak
ChkLev:
lacc ColMaxDat ;ColMaxDat must >2^4,(acc) = (ColMaxDat)
sub One,4
bcnd NotCode,lt ;if (ACC<0),執行NotCode
;--------------------------Check col1,2,3 Relative ratio-------------------------ChkRelCol:
;
mar *,ar1
:
lar ar0,Two
;ar0=2
ar2One
1
lar ar1,PFilC31b ;ar1=PFilC31b
:
lar ar2,One
;ar2=1
ar0Two
2
lt ColMaxDat ;P=ColMaxDat*683
mpy #683
ar1PFilC31b
PFilC32b
ChkRelCol0
lacc *0-,12,ar0 ;(ar1) - ColMaxDat*683 & ar1-2
spac
bcnd ChkRelCol1,lt
mar *,ar2
;ar2 - 1
mar *-,ar0
ChkRelCol1
banz ChkRelCol0,*-,ar1 ;ar0 =?0
mar *,ar2
banz NotCode,*,ar1
;ar2=?0
Clear Row & Harmonic
Filter result
;--------------------- Clear ROW & Harmonic Filter result -------------------ClearFil:
lar ar1,#FilR11b
zap
rpt #7
sacl *+
lar ar1,#FilR01h
rpt #3
sacl *+
Process DFT of ROW
1,2,3,4
;*********************************************************
; Process DFT of Row 1,2,3,4
;*********************************************************
DFTRow:
lar ar0,BaseLen
;ar0 = 204
lar ar1,#FilR12b
lar ar2,PQueBuf
lar ar3,#CoefBase1r
lacc Four
sacl FreqCout4
call DFTCall,*,ar3
Caculate Energy at ROW
1,2,3,4
;*********************************************************
; Caculate Energy at Row 1,2,3,4 and
; Find Max Energy of Row 1,2,3,4
;*********************************************************
;ENERGY = [(Y(n-2)-Y(n-1))/2]^2 - Y(n-1)*Y(n-2)*(coef-1)
EnergyRow:
lar ar0,Three
lar ar1,#FilR42b
lar ar2,#CoefBase4r
EnergyRow0:
call EnergySr,*,ar2
;21
sach *-,1,ar0
;23..ar1 - 1 (Y(n-2)
banz EnergyRow0,*-,ar1 ;24..ar0(FreqCount)=?0 ar0-1
;---------------------- Find Row 1,2,3,4 Energy Max -------------------------;RowMaxDat = row peak data RowMaxNo= row peak number
FindRowMax:
;
mar *,ar1
lacc Three ;RowMaxNo=3
sacl RowMaxNo
FindRow
lar ar2,Two ;ar2=2
lar ar1,#FilR41b ;RowMaxDat=(#FilR41b)&ar1=#FilR31b
lacc *0sacl RowMaxDat
FindRow0
lacc RowMaxDat
sub
*
bcnd FindRow1,geq
sar
ar2,RowMaxNo
lacc *
sacl RowMaxDat
FindRow1
mar *0-,ar2
banz FindRow0,*-,ar1
;RowMax - (ar1)
;Check Peak level and Twist
TwistLevel:
lacc ColMaxDat
;(ColMaxDat)-(RowMaxDat)ACC
sub RowMaxDat
bcnd TwistLevel0,geq
;if (ACC >=0)執行TwistLevel0
TwistRev
lac ColMaxDat
;row > col
sub One,4
bcnd NotCode,lt
lac RowMaxDat
;row_max - col_max*12
sub ColMaxDat,3
;8dB = 12
sub ColMaxDat,2
bcnd NotCode,geq ;row_max > =col_max*12執行NotCode
b
DFTHarmRow
TwistLevel0:
lac
RowMaxDat
sub
One,4
;col > row
bcnd NotCode,lt
lac
ColMaxDat
;col_max - row_max*3
sub
RowMaxDat
;4dB = 3
sub RowMaxDat,1
bcnd NotCode,geq
;col_max >= row_max*3執行NotCode
;------- Process 2nd Harmonic DFT of Max Row Energy------DFTHarmRow:
mar
*,ar3
lmmr INDX,#RowMaxNo ;INDX=3
lar
ar0,HarmLen
lar
ar1,#FilR02h
lar
ar2,PQueBuf
lar
ar3,#CoefHarm1r
;ar0=200
mar *0+,ar3
lt
*,ar2
;1..T = Cos(*)
DFTHarmRow0之資料
結構
DFTHarmRow0
lacc *+,12,ar1
;3..X(n)
sub
;X(n)-Y(n-2) --> Acc
*-,16
mpy *
;Cos(*) * Y(n-1) --> P
ltd
;X(n)+ Cos(*) * Y(n-1)-Y(n-2)
*,ar3
;Y(n-1)-->Y(n-2)
lta
*,ar1
;X(n)+2Cos(*) * Y(n-1)-Y(n-2)
apac
apac
;X(n)+2*2Cos(*)*Y(n-1)-Y(n-2)
sach *+,0,ar0
;2..--> Y(n-1) Q30
bcnd HarmRowLev,ov ;check overflow
banz DFTHarmRow0,*-,ar2 ;4..ar0(len)=?0
;--------------- Check Row Harmonic Energy ------------HarmRowLev:
lar
; mar *,ar2
ar2,#CoefHarm1r;ar2 = harmonic coefficent Pointer
mar *0+,ar2 ;= #coeff + row_max*2
lar
ar1,#FilR02h ;ar1 = harmonic data pointer
;= #dat + row_mxp*2
call EnergySr,*,ar2
lt
RowMaxDat ;harmonic energy row_max/4
mpy #4096
spac
spac
bcnd NotCode,geq
;*********************************************************
; Process 2nd Harmonic DFT of Max Col Energy and
; Check Col Harmonic Energy
;*********************************************************
DFTHarmCol:
mar
*,ar3
lmmr INDX,#ColMaxNo
;INDX=1
lar
ar0,HarmLen
;ar0=200
lar
ar1,#FilC02h
lar
ar2,PQueBuf
lar
ar3,#CoefHarm1c
mar *0+,ar3
lt
*,ar2
;1..T = Cos(*)
DFTHarmCol0
lacc
*+,12,ar1
;3..X(n)
sub
*-,16
;X(n)-Y(n-2)--> Acc
mpy
*
;Cos(*) * Y(n-1)--> P
ltd
*,ar3
;X(n)+ Cos(*) * Y(n-1)-Y(n-2)
;Y(n-1)-->Y(n-2)
lta
*,ar1
;X(n)+2Cos(*) * Y(n-1)-Y(n-2)
apac
apac
;X(n)+2*2Cos(*)*Y(n-1)-Y(n-2)
sach
*+,0,ar0
;2..--> Y(n-1) Q30
bcnd
HarmColLev,ov ;check overflow
banz
DFTHarmCol0,*-,ar2 ;4..ar0(len)=?0
DFTHarmCol0之資料
結構
;----------------- Check Col Harmonic Energy -----------HarmColLev:
mar
*,ar2
lar
ar2,#CoefHarm1c ;ar2 = harmonic coefficent pointer
mar
*0+,ar2
;= #Coef + ColMax*2
lar
ar1,#FilC02h
;ar1=harmonic data pointer = #dat +
;ColMax*2
call
EnergySr,*,ar2
lt
ColMaxDat
mpy
#4096
spac
spac
bcnd
NotCode,geq
;harmonic energy ColMax/4
;*********************************************************
; Check for valid number
; Compare number with last number and 2nd to last number
;*********************************************************
;--------------------------------- load recognized number ---------------------mar
*,ar1
lt
PChSave ;ch*3 + #Last1Ch0
mpy
Three
lacc
#Last0Ch0 ;ACC= #Last0Ch0
apac
;(PChSave)*3PREG
;(ACC)+(PREG)ACC
sacl
TempMain,0
lar
ar1,TempMain
mar
*+,ar1
mar
*-,ar1
;Last0Ch0+1 = Last1Ch0
dmov *-
;last1 --> last2
dmov *
;last0 --> last1
;----------------------- Check for new number -----------ChkNewCode:
lacc RowMaxNo,2 ;row_mxp*2^2 + col_mxp + Ch*2^8
;--> last0
add ColMaxNo
add PChSave,8
sacl *+
;--> last0
mar *+,ar1
sub *-
;last0 =? last2
bcnd NotCode1,eq ;ACC(last0-last2)=0,執行NotCode1
lac *-
;last0 =? last1
sub *,0,ar1
bcnd ChkNewCode0,neq ;last0/=last1,執行ChkNewCode0
out *,3
;Output Last0 Digital data
ChkNewCode0
lar ar1,PChSave
banz MainProc3,*-,ar1 ;PChSave=?0 & PChSave-1
b
MainChk0
;Load ar0,ar1,ar2
Not New Code
-當(1)row_max-col_max >=8dB (2)col_max-row_max>=4dB
時執行
;---------------------- NOT New CODE --------------------NotCode:
lt
PChSave
;ch*3 + #Last0Ch0
mpy Three
lacc #Last0Ch0
apac
;ch*3 + #Last0Ch0ACC
sacl TempMain,0 ;ACCTempMain
NotCode1
lar ar1,TempMain
mar *,ar1
lacc #0ffh
bd ChkNewCode0
dmov *
;last0 --> last1
sacl *
;********************************************************
; DFT Subroutine
;********************************************************
DFTCall:
lt *,ar2
;1..T = Cos(*) ,next *ar2
;*ar3(CoefBase1r,2r,3r,4r)
DFTCall0
lacc *+,12,ar1
;3..X(n)
sub *-,16
;X(n)-Y(n-2)--> Acc
mpy *
;Cos(*) * Y(n-1) --> P
ltd *,ar3
;X(n)+ Cos(*) * Y(n-1)-Y(n-2)
;Y(n-1)-->Y(n-2)
lta *,ar1
;X(n)+2Cos(*) * Y(n-1)-Y(n-2)
apac
apac
;X(n)+2*2Cos(*)*Y(n-1)-Y(n-2)
sach *+,0,ar0
;2..--> Y(n-1) Q30
bcnd DFTCall1,ov
;check overflow
banz DFTCall0,*-,ar2 ;4..ar0(len)=?0
DFT Subroutine之資料
結構
DFTCall1
lar ar0,BaseLen
;ar0=204
lar ar2,PQueBuf
mar *,ar1
mar *0+,ar3
mar *+,ar3
lacc FreqCout4
;FreqCout4-1
sub One
sacl FreqCout4
bcnd DFTCall,neq
ret
;ACC(FreqCout4-1)/=0,跳至DFTCall執行
Energy Subroutine
CoefBase1r
ar2=(coeff-1),負責指到Coefficent ~CoefHarm4c
ar1Y(n-2),ar1-1Y(n-1)
運算式:[(Y(n-2)-Y(n-1))/2]^2-Y(n-1)*Y(n-2)*(coef-1)
執行步驟:(1).(coef-1)/2
(2).Y(n-2)*(coef-1)/2
(3).Y(n-1)*Y(n-2)*(coef-1)/2
(4).ABS[Y(n-2)-Y(n-1)]/2
(5).{[Y(n-2)-Y(n-1)]/2} ^2
(6).{[Y(n-2)-Y(n-1)]/2}^2-Y(n-1)*Y(n-2)*(coef-1)
;------------------- ENERGY Subroutine-------------------EnergySr:
lac NegMax,15
;(coef-1)/2
add *-,15,ar1
;ar2=&coeff-1
sach TempMain
;[(Coef-1)/2]TempMain
lt
;Y(n-2)*(coef-1)/2,Y(n-2)TREG0
*-
mpy TempMain
;(TREG0)*(TempMain)PREG
pac
;[Y(n-2)*(coef-1)/2]ACC
sach TempMain,1
lt
*+
mpy TempMain
;Y(n-1)*Y(n-2)*(coef-1)/2,Y(n-1)Y(n-2)
pac
sach TempMain,1
lac *-,15
;ABS[Y(n-2)-Y(n-1)]/2,Y(n-1)Y(n-2)
sub *,15
;*Y(n-1)
abs
sach *
lt
*
;[Y(n-2)-Y(n-1)]/2 ^2
mpy *
pac
;[(Y(n-2)-Y(n-1))/2]^2-Y(n-1)*Y(n-2)*(coef-1)
sub TempMain,15
ret
Energy Subroutine
;caculate Energy at column 1,2,3:
;ar0=2,ar1PFilC32b,ar2CoefBase3c
Energy Subroutine(續)
;caculate Energy at Row 1,2,3,4:
;ar0=3,ar1FilR42b,ar2CoefBase4r
Energy Subroutine(續)
;check column Harmonic Energy
;ar0HarmLen(200),ar1FilC02h,ar2CoefHarm1c
Energy Subroutine(續)
;check Row Harmonic Energy:
;ar0HarmLen(200),ar1FilR02h,ar2CoefHarm1r
謝謝各位指導!!
學生:劉念宗 製作
Download