You are on page 1of 39

IMPLEMENTAREA UNUI

FILTRU NUMERIC
PENTRU SEMNALE DE TIP VOCAL

OBIECTIVE:
1) Proiectarea unui filtru numeric cu răspuns finit la impuls (FIR)
folosind utilitarul FDATool din Matlab.
2) Implementarea filtrelor cu răspuns finit la impuls pentru un
sistem cu microprocesor lac!fin "#$.
MATERIALE NECESARE:
1) %ard&are ' ()*+IT ,ite F "#$- 2. /ablu Audio 2. R/A0ac!
stereodata.
2) 1oft&are' Matlab- 2isualD1P33.
PREZENTARE TEORETICĂ
Filtrarea este una dintre cele mai frec4ent utili5ate te6nici de
prelucrare a semnalelor pentru eliminarea sau atenuarea
componentelor nedorite ale semnalului.
Filtrele se pot 7mpăr i 7n două cate8orii 7n func ie de răspunsul lor' ț ț
filtre cu răspuns finit la impuls i filtre cu răspuns infinit la impuls ș
Filtrul cu răspuns finit la impuls (FIR) este cel al cărui răspuns
de4ine 5ero după un număr finit de e antioane de la aplicarea unui ș
impuls la intrare.
Filtrele cu răspuns infinit la impuls (IIR) repre5intă o alternati4ă la
filtrele cu răspuns finit la impuls caracteri5ată prin e4olu ia nenulă a ț
ie irii după aplicarea unui impuls la intrare. Aceste tip de filtre ș
permite ob inerea unei caracteristici de amplitudine cu un efort de ț
calcul mult mai mic 7nsă cu pre ul neliniarită ii fa5ei i al ț ț ș
problemelor de stabilitate ce pot apărea la cuanti5are. 1unt sisteme
liniare- in4ariante 9n timp- cu a0utorul cărora se pot 8enera o
mul ime de tipuri de răspunsuri 7n frec4en ă. Filtrele IIR au poli- ț ț
deci au linii de reac ie care pot 8enera instabilitate atunci c:nd polii ț
nu sunt 7n re8iunea de con4er8en ă. Instabilitatea poate fi produsă ț
i prin cuanti5area coeficien ilor filtrului datorită deplasării po5i iei ș ț ț
polilor.
Filtrele FIR cu lun8ime , pot fi repre5entate prin răspunsul acestora
la un semnal de intrare de tip impuls unitar 6 (n). ;n filtru FIR este
de asemenea numit <i filtru trans4ersal. (cua=ia filtrului FIR este
următoarea'
unde bi sunt coeficien=ii filtrului.
Filtrele IIR sunt filtre recursi4e- repre5entate prin ecua ii de tipul ț
următor'
7n care constantele bi <i ai repre5intă coeficien=ii filtrului.
PROIECTAREA UNUI FILTRU FIR ÎN MATLAB-
SIMULINK UTILIZÂND FDATool
1. 1e desc6ide biblioteca 1imulin! din cadrul pro8ramului
Matlab d:nd clic! pe butonul e4iden iat cu un sin8ur dreptun86i. > ț
noua fereastră apare d:nd clic! pe butonul e4iden iat cu două ț
dreptun86iuri.
2. ?n noua fereastră se adau8ă blocul From Wave File- din cadrul
Signal Processing Blockset – Signal Processing Sources
(repre5intă semnalul audio care se dore te a fi filtrat). Metoda ș
pentru adău8are 7n noua fereastră este drag-and-drop- 7n sensul că
se selectea5ă blocul dorit din lista 1imulin!- se tra8e deasupra
ferestrei nou*desc6ise i se deselectea5ă. ș
După ce s*a adău8at blocul 7n noua fereastră- se dă dublu clic! pe
acesta i 7n c:mpul pentru nume se 4a scrie ș
speech_tone_48k.wav .Acesta este un fi ier audio care se 4a da ca ș
sursă i care con ine semnal 4ocal peste care este suprapus un ș ț
semnal de ton de 1!%5. Pentru ca pro8ramul să nu dea eroare
trebuie ca fi ierul audio ș speech_tone_48k.wav să se afle 7n
subdirectorul 7n care se lucrea5ă.
#. 1e adau8ă două blocuri Un!""#$.
După adău8area 7n fereastra desc6isă anterior se 4a da dublu clic!
pe fiecare bloc i se 4erifică e.isten a 4alorii @ 7n c:mpul ș ț In%&%'l
(on)%&%on*+
A. 1e adau8ă un bloc To A!)%o D#,%(# pentru redarea
semnalului 4ocal filtrat.
". 1e adau8ă un osciloscop (bloc Scope) pentru a putea 4edea
diferen a dintre semnalul 4ocal filtrat i cel nefiltrat. ț ș
B. 1e adau8ă blocul de filtrare F!"ool cu a0utorul căruia se 4a
7nlătura tonul din semnalul audio.
$. ?n final- -o)#l!l S%-!l%n. 4a a4ea forma '
C. D:nd dublu*clic! pe blocul filtrului se 4a desc6ide o noua
fereastră 7n care se 4or preci5a parametrii de proiectare ai filtrului
dorit . Ini ial parametrii filtrului 4or fi de forma ' ț
D. 1e 4or introduce următoarele specifica ii de proiectare ' ț
filtru opre<te bandă- cu factor de densitate 2@ si ordin #2.
caracteristicile de amplitudine sunt'
/0'**1' ni4elul amplitudinii pentru banda de trecere 0os E1 d
/*&o0' ni4elul amplitudinii pentru banda oprită E B@ d
/0'**2' ni4elul amplitudinii pentru banda de trecere sus E1 d
caracteristicile de frec4en=a sunt'
!n%&*' stabile<te scala frec4en=elor* de e<antionare- de trecere1- de
oprire1- de oprire2- de
trecere2 (%5-!%5-M%5-F%5).
F* (sampling #re$uenc%)' repre5intă frec4en=a de e<antionare *
AC@@@%5
F0'**1' sf:r<itul primei ben5i de trecere * $"@ %5
F*&o01' frec4enta de 7nceput a ben5ii de oprire * D"@ %5
F*&o02: frec4enta de sfarsit a ben5ii de oprire * 11@@ %5
F0'**2' 7nceputul celei de a doua ben5i de trecere * 11"@ %5
pro8ramul de proiectare al filtrului pre5intă op iunea de 8enerare a ț
coeficien ilor pentru implementări 7n 4ir8ulă fi.ă sau mobilă. ț
;tili5area D1P F "#$ impune 4arianta 4ir8ulei fi.e.
După setarea parametrilor- filtrul trebuie să fie de forma '
1@. După rularea pro8ramului se poate obser4a cu a0utorul
osciloscopului diferen a 7ntre semnalul ini ial (cel din dreapta 0os) ț ț
i semnalul filtrat (cel din drepata sus). ș
11. Din spa iul de lucru Matlab se e.portă parametrii filtrului ț
proiectat pentru a putea fi ulterior utili5a i 7n 2isualD1P33 (se ț
utili5ea5ă op iunea Tar8et * Fenerate / 6eader). ț
2a apărea o fereastră de 8enul 7n care trebuie bifată cea de*a doua
op iune pentru e.portare si se 4a ale8e formatul ț Signed &'-(it
)nteger+
D:nd clic! pe butonul Fenerate apare o fereastră 7n care se 4a cere
numele fi ierului 7n care să fie sal4a i coeficien ii ( ș ț ț fda_coefs.h)
Repre5entarea supraunitară este utilă 7n ca5ul implementării pe
placa F"#$ deoarece aceasta nu lucrea5ă decat 7n 4ir8ulă fi.ă.
IMPLEMENTAREA FILTRULUI CU A3UTORUL
MICROPROCESORULUI DE PRELUCRARE A
SEMNALULUI DI4ITAL BF 567
Pentru a pune 7n practică e.emplul dat se porne te de la aplica ia ș ț
demonstrati4ă din V%*!'l DSP88 !udio *odec "alkthrough.
Aplica ia ț !udio *odec "alkthrough implementea5ă o sec4en ă ț
completă de 7nre8istrare*redare a semnalului 4ocal. 1emnalul de
intrare pentru codec este un semnal 4ocal care pro4ine de la un
dispo5iti4 de intrare (microfon). Ie irea codec*ului este redată ș
printr*un dispo5iti4 de iesire (bo.e).
1e modifică sursele aplica iei pentru a permite filtrarea semnalului ț
4ocal dat ca intrare a sistemului. Pro8ramul con ine mai multe ț
fisiere sursă' In%&%'l%9#+(: ISR+(: -'%n+(: P$o(#**;)'&'+( *%
T'l.&<$o!=<&+<+
Aplica ia oferă op iunea redării semnalului ori8inal sau a celui ț ț
filtrat. 1elec ia se face apăs:nd un buton de pe placa ( ț S/11 )-
apăsare care se reflectă 7n starea 4ariabilei push(t_#lag+ ?n
Process_ata.c este detaliată <i func=ia care implementea5ă filtrul
cu răspuns finit proiectat- filtru ai cărui coeficien i sunt importa i ț ț
din fi ierul ș (o#"F%$+ )'& si inclu i 7n ș -'%n+(
(ste 8enerat răspunsul ob inut prin filtrarea datelor de intrare <i ale ț
cărui cadre sunt păstrate 7ntr*un buffer de ie<ire. Gumărul
e<antioanelor de intrare <i lun8imea bufferului de ie<ire sunt
specificate de length. Func=ia men=ine starea filtrului 7n 4ariabila
state- care este declarată <i ini=iali5ată 7nainte ca func=ia să fie
apelată.
Func=ia filtrului folose<te buffere circulare- astfel 7nc:t atunci c:nd
este ac6i5i=ionat un nou e<antion- se 7nlocuie<te cel mai 4ec6i
e<antion din <ir. Pentru a 8estiona buffer*ul circular este ne4oie de
un pointer care să indice 7nceputul buffer*ului 7n memorie- un alt
pointer care să indice sf:r<itul sau o 4ariabilă care să re=ină
lun8imea buffer*ului- <i mai trebuie specificat pasul de citire 7n
memorie. Această metodă- numită stocare circulară- oferă
posibilitatea de a stoca 7n memorie numai e<antioanele care sunt
necesare calculelor- iar astfel se reduce memoria necesară unui
al8oritm mai complicat <i se ob=ine cea mai mare 4ite5ă de e.ecu=ie
posibilă. Trebuie preci5at faptul că e antionarea reali5ată de codec ș
se face cu o frec4en a de DB +%5. ț
1ec iunea următoare descrie instalarea plăcii ț +,--)" BF./0.
Pentru a obser4a func ionalitatea pro8ramului 7n 2isualD1P este ț
necesară conectarea la o sursă audio i un dispo5iti4 de redare ș
audio. ,a intrare pe placa lac!fin "#$- conectorul 1ine )n- se 4a
conecta la semnalul de redare audio al calculatorului folosit pentru
8enerarea semnalului audio de intrare. Pentru redare a4em ne4oie de
o perec6e de căsti sau de bo.e 7n conectorul 1ine 2ut al plăcii. 1e
conectea5ă cablul ;1 de la calculator i la placa ș EZ-KIT după
care conectorul de alimentare este conectat la sursa de alimentare.
1e porne te alimentarea cu ener8ie- se 4erifică daca ledul 4erde este ș
aprins i ledurile (A*D) continuă să se aprindă alternati4 ș
,a prima rulare Windows-!l 4a recunoa te noul dispo5iti4 6ard&are ș
i 4a lansa ș !dd 3ew 4ardware Wi5ard care 4a instala fi ierele ș
necesare de pe /D*ul +,--)".
2. ?n meniul 1ession al 2isualD1P*ului- se selectea5ă Ge&
1ession lans:nd astfel 1ession Hi5ard. Pe pa8ina 1elect Processor-
Processor familI trebuie setat la lac!fin. ?n /6oose a tar8et
processor selectăm AD1P*F"#$.
#. Pe pa8ina S#l#(& Conn#(&%on T>0# selectăm EZ-KIT L%&#.
Aceasta op iune se ale8e numai pentru ca5ul 7n care este conectată ț
placa la calculator.
A. Pe pa8ina S#l#(& Pl'&"o$- ne asi8urăm că platforma selectată
este ADSP-BF567 EZ-KIT L%&# ,%' D#!= A=#n&+ 1pecificăm
numele sesiunii sau acceptăm numele implicit i selectăm ș N#?&+
". 2erificăm informa iile pre5entate apoi se termină confi8urarea ț
sesiunii de lucru. >dată conectat titlul ferestrei principale se
modifică pentru a include numele sesiunii setat anterior.
B. 1e desc6ide proiectul Audio /odec Tal!t6rou86 folosind
>pen din meniul File. Acest proiect se 8ăse te 7n Pro8ram FilesJ ș
Analo8 De4icesJ 2isualD1PJ lac!finJ (.emplesJ AD1P*F"#$
()K+it ,iteJ Audio /odec Tal!t6rou86t
(ste de preferat a fie mutat 7ntr*o altă loca ie i apoi a se modifica. ț ș
In acest scop se selectea5ă folderul !udio *odec "alkthrough
(CTRL8C *'! (l%(. )$#'0&' (o0>) i se copia5ă pe altă parti ie ș ț
(D- ( etc.) (/TR,32 sau clic! dreapta paste).
,a următorul pas se 4a desc6ide proiectul A!)%o Co)#(
T'l.&<$o!=<& (C) de la loca ia unde a fost mutat ț
$. 1e 4a da clic! dreapta - se 4a ale8e 3ew 6 "e7t File iar ca nume
i se 4a da #ir.h.
Apoi se 4a re4eni 7n mediul 2isualD1P unde se da clic! dreapta pe
proiect i se selectea5ă op iune ș ț !dd File (s8 to Pro9ect. 2a apărea o
nouă fereastră 7n care se completea5ă numele fi ierului ( ș @#ir.hA) i ș
apoi se finali5ea5ă ac iunea d:nd clic! pe butonul ț !dd+
C. ?n 6eaderul nou creat- #ir.h- 4or fi declarate constantele-
4ariabilele <i prototipurile func=iilor folosite. ?n #ir.h se copia5ă
codul din fi ierul 6eader ș "alkthrought.h i se poate obser4a cu scris ș
7n8rosat completarea codului ini ial (cel din fi ierul ț ș "alkthrough.h)
cu o serie de 4ariabile i e4enimente de tratare a 7ntreruperilor. ș

Lifndef KK(M;A,I)(RKD(FIG(D
Ldefine KK(M;A,I)(RKD(FIG(D

JJ**************************************************************************JJ
JJ %eader files
JJ**************************************************************************JJ

Linclude NsIsOe.ception.6P
Linclude NcdefF"#$.6P
B%n(l!)# C"$'(&+<D
B%n(l!)# C"%l&#$+<D
B%n(l!)# C*>*$#=+<D
B%n(l!)# C((l."n+<D

JJ**************************************************************************JJ
JJ 1Imbolic constants
JJ**************************************************************************JJ

JJ names for re8isters in AD1C"AJAD1C$ con4erters
Ldefine IGT(RGA,KAD/K,@ @
Ldefine IGT(RGA,KAD/KR@ 1
Ldefine IGT(RGA,KDA/K,@ @
Ldefine IGT(RGA,KDA/KR@ 1
Ldefine delaI @.f@@ JJ intar5ierea este repre5entata pe 1B biti

JJ 1P>RT@ &ord len8t6
B)#"%n# SLEN;2E F?FF17 JJ numarul de biti din fiecare
cu4ant transmis de 1P>RT.

JJ DMA flo& mode
Ldefine F,>HK1 @.1@@@ JJ
este setat modul autobuffer

JJ**************************************************************************JJ
JJ Flobal 4ariables
JJ**************************************************************************JJ

JJ numarul cadrelor de intare ale esantioanelor
B)#"%n# FRAME;SIZE 2

JJ dimensiunea esantioanelor intrate pe fiecare canal
B)#"%n# IP;SIZE 66

JJ initiali5area numarului de coeficienti ai filtrului
B)#"%n# TAPS 66
#?&#$n *<o$& *C<FL#"&InGHI JJcanal prin care se transmit datele din
bufferul de receptie in memorie
#?&#$n *<o$& *C<FR%=<&InGHI
#?&#$n *<o$& *C<FL#"&O!&GHI JJ canal prin care se transmit datele
procesate din memorie in bufferul de transmisie
#?&#$n *<o$& *C<FR%=<&O!&GHI

e.tern int iR.uffer1Q9R JJbuffer de receptie DMA
e.tern int iT.uffer1Q9R JJbuffer de transmie DMA

#?&#$n %n& 0!*<&;"l'=I JJ4ariabila in care se retine 4aloarea @ sau 1
#?&#$n %n& (>(l#Co!n&R JJnumarul de cicluri
#?&#$n !n*%=n#) (<'$ !(LEDI JJ4ariabila uc,(D
#?&#$n "%$;*&'&#;"$1J *&'&#1I JJstarea filtrului
#?&#$n "%$;*&'&#;"$1J *&'&#2I
#?&#$n "$'(&1J l0"GHI JJ tipul filtruluiSlo& pass filter
#?&#$n "$'(&1J l)#l'>GHI JJ left delaI
#?&#$n "$'(&1J $)#l'>GHI JJ ri86t delaI

JJ**************************************************************************JJ
JJ PrototIpes
JJ**************************************************************************JJ
JJ in file Initiali5e.c

4oid InitKFla8s (4oid)R
4oid AudioKReset (4oid)R
4oid InitK1port@ (4oid)R
4oid InitKDMA (4oid)R
,o%) In%&;T%-#$ (,o%))I
4oid InitKInterrupts (4oid)R
,o%) In%&;PF (,o%))I
,o%) In%&;F%l&#$ (,o%))I
4oid (nableKDMAK1port@ (4oid)R

JJ in file ProcessKdata.c
4oid ProcessKData (4oid)R
,o%) "%$( ((on*& "$'(&1J %nGH: "$'(&1J o!&GH: "%$;*&'&#;"$1J *&'&#)I

JJ in file I1Rs.c
(TKIGT(RR;PTK%AGD,(R (1port@KRTKI1R)R
EK;INTERRUPT;LANDLER (SM%&(<;ISR)I
EK;INTERRUPT;LANDLER (T%-#$;ISR)I
Lendif

D. Fi ierul ș )nitiali5e.c este completat pentru permiterea
confi8urării bufferului de recep ie- respecti4 de transmisie. ?n ț
func ia ț void )nit_:! (void8 este confi8urat modul bidimensional
i se setea5ă re8i trii ș ș N;COUNT *% N;MODIFN pentru stabilirea
numărului cadrelor care trebuiesc transmise i dimensiunea pe care ș
se reali5ea5ă transferul. Func ia de ini iali5are a 7ntreruperilor se ț ț
completea5ă cu e4enimente pentru butonul de s&itc6 pe linia
IV412 i pentru timp pe linia ș IV411. Tot 7n fi ierul ș )nitiali5e.c se
adau8ă func iile de initiali5are ale filtrului- timerului . ț

B%n(l!)# O"%$+<O

4oid InitKFla8s (4oid)U

int tempR
JJ confi8ure pro8rammable fla8s
JJ set P>RTF function enable re8ister (need &or!around)
temp S VpP>RTFKF(RR
temp33R
VpP>RTFKF(R S @.@@@@R
VpP>RTFKF(R S @.@@@@R

JJ set P>RTF direction re8ister
VpP>RTFI>KDIR S @.1F/@R

JJ set P>RTF input enable re8ister
VpP>RTFI>KIG(G S @.@@#/R

JJ set P>RTF clear re8ister
VpP>RTFI>K/,(AR S @.@F/@R
W

4oid AudioKReset (4oid)U

int iR
JJ 8i4e some time for reset to ta!e affect
for (i S @R iN delaIRi33)UWR
JJ set port f set re8ister
VpP>RTFI>K1(T S PF12R
W

4oid InitK1port@ (4oid)U

JJ /onfi8urarea buffure*ului de receptie a portului serial 1port@
JJ (.ternal /,+- (.ternal Frame sInc- M1 first- Acti4e ,o&
JJ 2A*bit data- 1econdarI side enable- 1tereo frame sInc enable
JJ ;sers of AD1P*F"#$ ()*+IT oard Re4 1.@ must enable t6e
internal cloc! and frame sInc
JJVp1P>RT@KR/R1 S RF1R X ,RF1 X R/+F( X IRF1 X IR/,+R
Vp1P>RT@KR/R1 S RF1R P LRFS X R/+F(R
Vp1P>RT@KR/R2 S 1,(GK2A X R1F1(R
JJVp1P>RT@KR/,+DI2 S @.@@1#R
JJVp1P>RT@KRF1DI2 S @.@@1FR

JJ /onfi8urarea buffure*ului de transmisie a portului serial 1port@
JJ (.ternal /,+- (.ternal Frame sInc- M1 first- Acti4e ,o&
JJ 2A*bit data- 1econdarI side enable- 1tereo frame sInc enable
JJ ;sers of AD1P*F"#$ ()*+IT oard Re4 1.@ must enable t6e
internal cloc! and frame sInc
JJVp1P>RT@KT/R1 S TF1R X ,TF1 X T/+F( X ITF1 X IT/,+R
Vp1P>RT@KT/R1 S TF1R P LTFS X T/+F(R
Vp1P>RT@KT/R2 S 1,(GK2A X T1F1(R

JJ Vp1P>RT@KT/,+DI2 S @.@@1#R
JJ Vp1P>RT@KTF1DI2 S @.@@1FR

W

4oid InitKDMA (4oid)U

JJ /onfi8ure DMA# * transfer pentru receptie
JJ #2*bit transfers- Interrupt on completion- Autobuffer mode
VpDMA#K/>GFIF S HGR X HD1I)(K#2 X DIK(G X F,>HK1 P
DMA2D P DI;SELR
JJ 1tart address of data buffer
VpDMA#K1TARTKADDR S iR.uffer1R
JJ DMA loop count
VpDMA#KTK/>;GT S 2QIP;SIZER JJ dimensiunea
esantionului care trebuie transmis
JJ DMA loop address increment
VpDMA#KTKM>DIFY S AR JJsetat pt transfer DMA
pe #2 de biti
Q0DMA6;N;COUNT R FRAME;SIZER JJnumarul cadrelor care
trebuiesc transmise
Q0DMA6;N;MODIFN R EI JJ setat pt transfer DMA pe #2 de biti

JJ /onfi8ure DMAA * transfer pentru emisie
JJ #2*bit transfers- Autobuffer mode
VpDMAAK/>GFIF S HD1I)(K#2 X F,>HK1 P DMA2DR
JJ 1tart address of data buffer
VpDMAAK1TARTKADDR S iT.uffer1R
JJ DMA loop count
VpDMAAKTK/>;GT S 2QIP;SIZER
JJ DMA loop address increment
VpDMAAKTKM>DIFY S AR
Q0DMAE;N;COUNT R FRAME;SIZEI
Q0DMAE;N;MODIFN R EI
W

4oid (nableKDMAK1port@ (4oid)U

JJ enable DMAs
VpDMAAK/>GFIF S (VpDMAAK/>GFIF X DMA(G)R
VpDMA#K/>GFIF S (VpDMA#K/>GFIF X DMA(G)R

JJ enable 1port@ TT and RT
Vp1P>RT@KT/R1 S (Vp1P>RT@KT/R1 X T1P(G)R
Vp1P>RT@KR/R1 S (Vp1P>RT@KR/R1 X R1P(G)R
W

4oid InitKInterrupts (4oid)U

JJ 1et 1port@ RT (DMA#) interrupt prioritI to 2 S I2FD
Vp1I/KIAR@ S @.ff2fffffR
Vp1I/KIAR1 S @.ffffffffR
Vp1I/KIAR2 S @.ffffAfffR
Vp1I/KIAR# S @.ffff"fffR

JJ assi8n I1Rs to interrupt 4ectors
JJ 1port@ RT I1R *P I2F D
re8isterK6andler (i!Ki48D- 1port@KRTKI1R)R
$#=%*&#$;<'n)l#$ (%.;%,=12: SM%&(<;ISR)I
$#=%*&#$;<'n)l#$ (%.;%,=11: T%-#$;ISR)I

JJ enable 1port@ RT and PF interrupt
Vp1I/KIMA1+ S @.FSFSFF2@R
W

JJ Initiali5area filtrului FIR
,o%) In%&;F%l&#$ (,o%))T
"%$;%n%& (*&'&#1: l0": l)#l'>: TAPS: 1)I
"%$;%n%& (*&'&#2: l0": $)#l'>: TAPS: 1)I
U

JJ Initiali5e t6e pro8rammable fla8s as input
,o%) In%&;PF (,o%))T
Q0PORTFIO;INEN R F?FF6CI JJ Pus6buttons
Q0PORTFIO;DIR R F?FFCFI JJ ,(Ds
Q0PORTFIO;ED4E R F?FF6CI
Q0PORTFIO;MASKA R F?FF6CI
Q0PORTFIO;CLEAR R F?FFCFI
Q0PORTFIO;SET R !(LED CC JI
U

JJ Initiali5ea5a timpul folosit pentru sc6imbarea starii ledurilor
,o%) In%&;T%-#$ (,o%)) T
JJ;sin8 Timer@ instead core timer
Q0TIMERF;CONFI4 R F?FF1VI
Q0TIMERF;PERIOD R F?FFSFFFFFI
Q0TIMERF;/IDTL R F?FFEFFFFFI
Q0TIMER;ENABLE R F?FFF1I
U

1@. 1tructura fi ierului ș )S;.c se 4a modifica astfel 7nc:t să se
introducă c:te o 7ntrerupere pe butonul S/ i pe timp. Rutina de ș
tratare a 7ntreruperilor se apelea5ă după recep ia completă a unui ț
cadru de date. 1e parcur8e bufferul circular de recep ie iar ț
următoarele e antioane din bufferul de intrare (iR.uffer1) sunt ș
sal4ate 7n 4ariabilele *C<FL#"&InG%H % *CLFR%=<&InG%H ș . 1e
apelea5ă apoi func ia ț P$o(#**;D'&' () 7n care se rulea5ă func ia ț
firc- menită să filtre5e semnalul 4ocal. 1e parcur8e bufferul circular
de transmisie iar datele procesate sunt sal4ate 7n 4ariabilele
*C<FL#"&O!&G%H % *<FR%=<&O!&G%H+ ș

B%n(l!)# O"%$+<O

(TKIGT(RR;PTK%AGD,(R (1port@KRTKI1R)U

%n& %I
*&'&%( *<o$& WRF:.RFI

JJ rutina de tratare a intreruperii
VpDMA#KIRMK1TAT;1 S @.@@@1R
"o$ (% R FI % C IP;SIZEI %88)T
JJ copia5a datele primite in bufferul de receptie
*C<FL#"&InG%H R %R?B!""#$1GINTERNAL;ADC;LF8WH DD SI
*C<FR%=<&InG%H R %R?B!""#$1GINTERNAL;ADC;RF8WH DD SI
JJ use t6e builtin circular buffer to update t6e inde.
W R ;;!%l&%n;(%$(%n)#? (W: 2: 2QIP;SIZEQFRAME;SIZE)I
U
JJ call function t6at contains user code
ProcessKData ()R

"o$ (% R FI % C IP;SIZEI %88)T
JJ datele procesate sunt copiate in bufferul de transmisie
%T?B!""#$1GINTERNAL;DAC;LF8.H R (*C<FL#"&O!&G%H CC S)I
%T?B!""#$1GINTERNAL;DAC;RF8.H R (*C<FR%=<&O!&G%H CC
S)I
JJ use t6e builtin circular buffer to update t6e inde.
. R ;;!%l&%n;(%$(%n)#? (.: 2: 2QIP;SIZEQFRAME;SIZE)I
U
W

EK;INTERRUPT;LANDLER (SM%&(<;ISR)T
%n& %I
%" (Q0PORTFIO X PF2) T
Q0PORTFIO;CLEAR R PF2I
U
%" (Q0PORTFIO X PF6) T
Q0PORTFIO;CLEAR R PF6I
U
%" (Q0PORTFIO X PFE) T
Q0PORTFIO;CLEAR R PFER JJ se setea5a butonul 1H11
0!*<&;"l'= R 1I
!(LED R F?F2I
U
%" (Q0PORTFIO X PF5) T
Q0PORTFIO;CLEAR R PF5R JJse setea5a butonul 1H1@
0!*<&;"l'= R FI
!(LED R F?F1I
U
U
EK;INTERRUPT;LANDLER (T%-#$;ISR)T
Q0TIMER;STATUS R F?FFF1R JJIndica intreruperea
Q0PORTFIO;CLEAR R F?FFCFI
Q0PORTFIO;SET R !(LED CC JI
U
11. Proced:ndu*se la fel ca la pasul $ se 4a adau8a un nou fi ier ș
proiectului. Acesta 4a a4ea numele <out.t7t= i 7n el se 4or scrie ș
coeficien ii filtrului proiectat 7n Matlab 1imulin!. ț
După ce s*a adău8at un fi ier 8ol proiectului se re4ine 7n mediul ș
Matlab E1imulin! unde se 4a desc6ide fi ierul ș #ir_coe#s.h creat
anterior. Din acest fisier se 4or selecta coeficien ii filtrului. ț
i se 4or copia 7n ș out.t7t- fi ierul din mediul 2isualD1P. /opierea ș
se 4a face utili5:nd op iunile ț Co0> (CTRL8C)-P'*&# (CTRL8V).

12. ?n func ia ț main.c este initiali5ată 4ariabila push(t_#lag cu @-
adică plecăm de la premisa că butonul de filtrare nu a fost apăsat.
De asemenea- sunt apelate func iile de ini iali5are a 7ntreruperilor- a ț ț
filtrului- a indicatorilor de FPI>. Fi ierul ș @o!&+&?&A este fi ierul din ș
care sunt prelua i coeficien ii filtrului proiectat 7n ț ț M'&l' S%-!l%n.
FDATool.
B%n(l!)# O"%$+<O

JJ 1P>RT@ DMA transmit buffer
int iT.uffer1Q2QIP;SIZEQFRAME;SIZE9R
JJ 1P>RT@ DMA recei4e buffer
int iR.uffer1Q2QIP;SIZEQFRAME;SIZE9R

JJ left and ri86t input data from ad1C#B
*<o$& *C<FL#"&InGIP;SIZEHI
*<o$& *C<FR%=<&InGIP;SIZEHI
JJ left and ri86t output data to ad1C#B
*<o$& *C<FL#"&O!&GIP;SIZEHI
*<o$& *C<FR%=<&O!&GIP;SIZEHI

%n& 0!*<&;"l'=I
%n& (>(l#Co!n&I
!n*%=n#) (<'$ !(LEDI

"%$;*&'&#;"$1J *&'&#1I
"%$;*&'&#;"$1J *&'&#2I
"$'(&1J l0"GTAPSH R T
B%n(l!)# Oo!&+&?&O JJacesta este fisierul in care sunt copiati
coeficientii filtrului
UI

"$'(&1J l)#l'>GTAPSHRTFUI
"$'(&1J $)#l'>GTAPSHRTFUI

4oid main (4oid)U

0!*<&;"l'= R FI
!(LED R F?F1I

InitKFla8s ()R
AudioKReset ()R
InitK1port@ ()R
InitKDMA ()R
In%&;PF ()I
In%&;T%-#$ ()I
InitKInterrupts ()R
In%&;F%l&#$ ()I
(nableKDMAK1port@ ()R

&6ile (1)R
W

1A. ?n cadrul fi ierului ș Process_data.c se modifică prototipul
func iei astfel 7nc:t atunci c:nd 4ariabila ț 0!*<&;"l'= de4ine 1 să
se apele5e func ia de filtrare ț #irc. 1emnalul de intrare este
repre5entat prin 4ariabilele s*h>1e#t)n?@ ș% s*h>;ight)n?@ urm:nd
ca 7n 4ariabilele s*h>1e#t2ut?@ ș% s*h>;ight2ut?@ să se păstre5e
semnalul filtrat. ?n ca5ul 7n care nu este apăsat butonul de pe placa
BlackFin ./0 starea 4ariabilei pushbt_flag este nesc6imbată- adică
semnalul de ie ire 4a fi acela i cu cel de la intrare. ș ș

B%n(l!)# O"%$+<O
%n& (>(l#B#=%n: (>(l#En)I

4oid ProcessKData (4oid)U

int iR
%" (0!*<&;"l'= RR 1)T
JJ Implementare filtru FIR
(>(l#B#=%n R *>*$#=;$#') ($#=;CNCLES)I
"%$( (*C<FL#"&In: *C<FL#"&O!&:*&'&#1)I
(>(l#En) R *>*$#=;$#') ($#=;CNCLES)I
(>(l#Co!n& R (>(l#En) - (>(l#B#=%nI
"%$( (*C<FR%=<&In: *C<FR%=<&O!&:*&'&#2)I
U
#l*# T
JJ Perform a loopbac!
"o$ (%RFI %CIP;SIZEI %88) T
*C<FL#"&O!&G%H R *C<FL#"&InG%HI
*C<FR%=<&O!&G%H R *C<FR%=<&InG%HI
U
U
U

JJ1ubroutines
,o%) "%$( ((on*& "$'(&1J %nGH: "$'(&1J o!&GH:"%$;*&'&#;"$1J *&'&#)T
%n& %: W: .: n(I
"$'(&1J Q$)#l'>!"I
"$'(&1J &#-0I
"$'(&1J Q(o#": QM)#l'>!"I
"$'(&62 '(( R FI
(o#"R*&'&#+<I JJpointer prin care se setea5a coeficientii
$)#l'>!"R*&'&#+)I JJ For readin8 delaI buffer
M)#l'>!"R*&'&#+0I JJ For updatin8 delaI buffer
n(R*&'&#+.I JJ pointer ce se setea5a la nr de coeficienti

(>(l#B#=%n R *>*$#=;$#') ($#=;CNCLES)I
"o$ (%RFI %CIP;SIZEI %88)T
M)#l'>!"GFHR%nG%HI
"o$ (WRFI WCn(I W88)T
'((8R(o#"GWHQM)#l'>!"GWHI
U
o!&G%H R ("$'(&1J) ('(( DD 15)I
"o$ (.R (n(-1)I .DR1I .--)T
M)#l'>!"G.HRM)#l'>!"G.-1HI
U
'(( R FI
U
U

1A. 1e face build i se 7ncarcă pro8ramul e.ecutabil pe placă- ș
utili5:nd comanda Pro9ect Build Pro9ect (*'! "olo*%n) F0)+ >data
ce pro8ramul a fost 7ncărcat- se obser4ă o bară albastră 7n dreptul
primei instruc iuni ce urmea5ă a fi e.ecutată din func ia ț ț -'%n ().
Aceasta arată că pro8ramul este oprit acolo i asteptă o comandă ș
pentru a fi rulat (e4entual 7n modul e(ug - pas cu pas )+
Pentru a se continua cu rularea pro8ramului se apasă tasta F5 sau
din meniul Debu8 se ale8e op iunea ț R!n sau se apasă butonul
e4iden iat cu un dreptun86i rosu. ț
?n timp ce pro8ramul este 7n e.ecu ie se desc6ide fi ierul audiode ț ș
redare apas:nd butonul S/11 i ș S/1F de pe placă pe r:nd.