VYSOK ´ EU ˇ CEN ´ I TECHNICK ´ E V BRN ˇ E BRNO UNIVERSITY OF TECHNOLOGY FAKULTA ELEKTROTECHNIKY A KOMUNIKA ˇ CN ´ ICH TECHNOLOGI ´ I ´ USTAV TELEKOMUNIKAC ´ I FACULTY OF ELECTRICAL ENGINEERING AND COMMUNICATION DEPARTMENT OF TELECOMMUNICATIONS SPEKTR ´ ALN ´ I ODE ˇ C ´ IT ´ AN ´ I V SIGN ´ ALOV ´ EM PROCESORU DIPLOMOV ´ A PR ´ ACE MASTER’S THESIS AUTOR PR ´ ACE Bc. ANTON ´ IN HUDEC AUTHOR
Text of VYSOKE U CEN I TECHNICKE V BRN E - vutbr.cz
Spektrální odeítání v signálovém procesoruFAKULTA ELEKTROTECHNIKY A
KOMUNIKACNICH TECHNOLOGII USTAV TELEKOMUNIKACI
FACULTY OF ELECTRICAL ENGINEERING AND COMMUNICATION DEPARTMENT OF
TELECOMMUNICATIONS
SPEKTRALNI ODECITANI V SIGNALOVEM PROCESORU
DIPLOMOVA PRACE MASTER’S THESIS
AUTOR PRACE Bc. ANTONIN HUDEC AUTHOR
VYSOKE UCENI TECHNICKE V BRNE BRNO UNIVERSITY OF TECHNOLOGY
FAKULTA ELEKTROTECHNIKY A KOMUNIKACNICH TECHNOLOGII USTAV
TELEKOMUNIKACI
FACULTY OF ELECTRICAL ENGINEERING AND COMMUNICATION DEPARTMENT OF
TELECOMMUNICATIONS
SPEKTRALNI ODECITANI V SIGNALOVEM PROCESORU SPEKTRAL SUBSTRACT IN
SIGNAL PROCESSOR
DIPLOMOVA PRACE MASTER’S THESIS
AUTOR PRACE Bc. ANTONIN HUDEC AUTHOR
VEDOUCI PRACE Ing. PETR SYSEL, Ph.D. SUPERVISOR
BRNO 2010
Ústav telekomunikací
Telekomunikaní a informaní technika
Student: Bc. Antonín Hudec ID: 78483 Roník: 2 Akademický rok:
2009/2010
NÁZEV TÉMATU:
POKYNY PRO VYPRACOVÁNÍ:
Cílem diplomové práce je implementovat metodu spektrálního odeítání
na vývojovém kitu DSP56858EVM se signálovým procesorem Freescale. V
první ásti implementujte ízení a komunikaci s kodekem Cyrrus Logic
CS4218 osazeném na vývojovém kitu. V další fázi implementujte
segmentaci vstupního signálu a rychlý algoritmus dopedné i zptné
Fourierovy transformace. V poslední fázi implementujte detektor
eové aktivity a metodu spektrálního odeítání. Funkci ovte na
zpracování signál v reálném ase.
DOPORUENÁ LITERATURA:
[1] Cirrus Logic. CS4218 16-Bit Stereo Audio Codec. Datasheet.
1996.[1] Freescale. 56858 Evaluation Module User Manual. Rev. 3.
2005. [2] Freescale. CodeWarrior Development Studio for Freescale
56800/E Digital Signal Controllers: MC56F8xxx/DSP5685x Family
Targeting Manual. Rev. 2007. [3] Freescale. DSP56800E 16-Bit DSP
Core Reference Manual. Rev. 2.16. 2005.
Termín zadání: 29.1.2010 Termín odevzdání: 26.5.2010
Vedoucí práce: Ing. Petr Sysel, Ph.D.
prof. Ing. Kamil Vrba, CSc. Pedseda oborové rady
UPOZORNNÍ:
Autor diplomové práce nesmí pi vytváení diplomové práce porušit
autorská práva tetích osob, zejména nesmí zasahovat nedovoleným
zpsobem do cizích autorských práv osobnostních a musí si být pln
vdom následk porušení ustanovení § 11 a následujících autorského
zákona . 121/2000 Sb., vetn moných trestnprávních dsledk
vyplývajících z ustanovení ásti druhé, hlavy VI. díl 4 Trestního
zákoníku .40/2009 Sb.
ABSTRAKT Tato diplomova prace je zamerena na realizaci spektralnho
odectan na signalovem kontroleru DSC56858. Prvn cast se zameruje na
inicializaci DSC, nastaven kodeku a zprovoznen komunikace mezi
kodekem a DSC. Druha cast pojednava o spektralnm odectanm a
realizaci programu.
KLICOVA SLOVA zpracovan cslicovych signalu, DSP, zpracovan reci,
spektraln odectan, FFT, DSC, 56858, kruhova pamet’
ABSTRACT This master’s thesis is focused on realization spectral
subtract on signal controller DSC56858. The first part is focusing
on initialization DSC, setting codec and set up communication
between DSC and codec. The second part treat about spectral
subtract and realization of code.
KEYWORDS digital signal processing, DSP, voice processing, spectral
subtract, FFT, DSC, 56858, circular memory
HUDEC, Antonn Spektraln odectan v signalovem procesoru: diplomova
prace. Brno: Vysoke ucen technicke v Brne, Fakulta elektrotechniky
a komunikacnch technologi, Ustav telekomunikac, 2010. 36 s. Vedouc
prace byl Ing. Petr Sysel, Ph.D.
PROHLASENI
Prohlasuji, ze svou diplomovou praci na tema ” Spektraln odectan v
signalovem
procesoru“ jsem vypracoval samostatne pod vedenm vedoucho diplomove
prace a
s pouzitm odborne literatury a dalsch informacnch zdroju, ktere
jsou vsechny citovany
v praci a uvedeny v seznamu literatury na konci prace.
Jako autor uvedene diplomove prace dale prohlasuji, ze v
souvislosti s vytvorenm
teto diplomove prace jsem neporusil autorska prava tretch osob,
zejmena jsem nezasahl
nedovolenym zpusobem do cizch autorskych prav osobnostnch a jsem si
plne vedom
nasledku porusen ustanoven § 11 a nasledujcch autorskeho zakona c.
121/2000 Sb.,
vcetne moznych trestnepravnch dusledku vyplyvajcch z ustanoven §
152 trestnho
zakona c. 140/1961 Sb.
1.2 Nastaven kokedu a DSC . . . . . . . . . . . . . . . . . . . . .
. . . . 13
1.2.1 Nastaven na vyvojove modulu DSC56858XUM . . . . . . . .
14
1.2.2 Inicializace ESSI . . . . . . . . . . . . . . . . . . . . . .
. . . 14
1.2.4 Cten a zapis dat z kodeku . . . . . . . . . . . . . . . . . .
. . 18
1.3 Detekce reci . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . 19
1.4 Spektraln odectan . . . . . . . . . . . . . . . . . . . . . . .
. . . . . 20
1.4.5 Rychla Fourierova transformace . . . . . . . . . . . . . . .
. . 23
1.4.6 Kruhova vyrovnavac pamet’ . . . . . . . . . . . . . . . . . .
. 24
1.4.7 Reprezentace dat . . . . . . . . . . . . . . . . . . . . . .
. . . 25
2 Vlastn resen 28
2.1 Popis resen . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . 28
2.2 Popis programu . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . 30
2.2.1 Funkce main . . . . . . . . . . . . . . . . . . . . . . . . .
. . . 30
2.2.3 Funkce readFromCodec . . . . . . . . . . . . . . . . . . . .
. . 32
2.2.4 Funkce sendToCodec . . . . . . . . . . . . . . . . . . . . .
. . 33
2.2.5 Funkce VAD . . . . . . . . . . . . . . . . . . . . . . . . .
. . . 34
SEZNAM OBRAZKU
1.3 Propojen kodeku s DSC na vyvojove desce . . . . . . . . . . . .
. . . 11
1.4 Struktura ramce na ESSI sbernici . . . . . . . . . . . . . . .
. . . . . 12
1.5 Struktura ramce na SPI sbernici . . . . . . . . . . . . . . . .
. . . . . 12
1.6 Prenos na ESSI . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . 15
1.7 Registr STXCR . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . 16
1.8 Registr SRXCR . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . 16
1.9 Registr SCR2 . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . 17
1.10 Registr SCR3 . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . 17
1.11 Registr SCR4 . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . 17
1.12 Registr SFCSR . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . 18
1.15 Schema casove posloupnosti zpracovavan dat . . . . . . . . . .
. . . 22
1.16 Princip kruhove pameti . . . . . . . . . . . . . . . . . . . .
. . . . . . 25
4.1 Vyvojovy diagram programu main . . . . . . . . . . . . . . . .
. . . . 37
4.2 Vyvojovy diagram programu main 2.cast . . . . . . . . . . . . .
. . . 38
4.3 Vyvojovy diagram programu Codec OnFullRxBuf . . . . . . . . . .
. 39
4.4 Vyvojovy diagram programu Codec OnFullRxBuf 2.cast . . . . . .
. . 40
4.5 Vyvojovy diagram programu sendToCodec . . . . . . . . . . . . .
. . 41
4.6 Vyvojovy diagram programu sendToCodec 2.cast . . . . . . . . .
. . 42
4.7 Vyvojovy diagram programu sendToCodec 3.cast . . . . . . . . .
. . 43
4.8 Vyvojovy diagram programu readFromCodec . . . . . . . . . . . .
. . 44
4.9 Vyvojovy diagram programu readFromCodec 2.cast . . . . . . . .
. . 45
4.10 Vyvojovy diagram programu VAD . . . . . . . . . . . . . . . .
. . . . 46
SEZNAM TABULEK
1.2 Nastaven frekvence vzorkovan pomoc pinu na prepnaci SW5. . . .
14
1.3 Pomer SCLK ku CLKIN . . . . . . . . . . . . . . . . . . . . . .
. . . . 15
1.4 Odhad pamet’ova narocnost programu . . . . . . . . . . . . . .
. . . . 23
1.5 Zavislost pamet’ove narocnosti na velikosti segmentu . . . . .
. . . . . 23
UVOD
Diplomova prace se zameruje na spektraln odectan a implementac na
DSC (Dig-
ital Signal Controller). Spektraln odectan je oblbenou metodou pro
odstranovan
sumu u hovorovych signalu. Tato metoda je zalozena na tom, ze pri
mluven vznikaj
pauzy (pro oddelen slov, vet, atd.) bez uzitecneho signalu, ze
kterych se da odhad-
nout sum, ktery se pak ve spektraln oblasti od puvodnho signalu
odecte. Tato
metoda patr mezi jednokanalove metody (k separovan zvuku od sumu
mame jen je-
den signal), filtr je nelinearn (protoze filtrace je realizovana
odectanm ve spektraln
oblasti), v case prispusobuje odhad sumu , ale trp tzv. hudebnm
sumem, dky
nepresnemu odhadu sumu jsou nektere kmitocty potlaceny uplne, coz
clovek vnma
jako neprjemne zvuky.
obsahuje i kodek CS4218.
1 TEORETICKY POPIS
1.1 Audio Kodek
CS4218 firmy Cirrus Logic je stereofonn audio kodek, ktery obsahuje
2 A/D a D/A
prevodnky (levy a pravy kanal), vstupn antialiasing filtry a
vystupn vyhlazovac
filtry a zeslen vstupu i vystupu. Dokaze vzorkovat s kmitocty 8 az
48 kHz pri
16bitove presnosti.
Tento kodek je pouzit, protoze je soucast vyvojoveho kitu pro DSC
56858
(viz [4]), na kterem se bude spektraln odectan realizovat.
1.1.1 Popis jednotlivych bloku
Obr. 1.1: Blokove schema kodeku cs4218
Na obr. 1.1 vidme schema kodeku CS4218, ktery se sklada z
jednotlivych lo-
gickych bloku.
Vstupn obvody Kodek ma pary vstupu RIN1,LIN1 a RIN2,LIN2, ze
kterych je
mozne v kodeku zvolit, ale v nasem prpade je na vyvojovem modulu
pouzit jen
9
jeden vstup, druhy je uzemnen. Vstup RIN1 a LIN1 je zapojen tak, ze
na vstupech
RIN1 a RIN1 ocekavame linkovou uroven signalu (0,1 az 0,9 V) pres
3,5 mm Jack
konektor.
Vystupn obvody Kodek CS4218 ma jeden vystupn par LOUT1 a LOUT2, na
desce
je vystup veden do konektor Jack 3,5 mm, ale take paralelne napojen
na operacn
zesilovac LM4850, ktery zesl signal pro pripojen sluchatek (jeho
parametry viz [5]).
Zapojen vidme na obr. 1.2 .
Obr. 1.2: Zapojen vstupu a vystupu
Vstupn filtry Vstupn (antialiasing) filtry pro levy i pravy kanal
jsou reseny
pomoc decimace vzorku. Podle nastaveneho kmitoctu vzorkovan jsou
odfiltrovany
vets kmitocty nez je Fvz/2 . Takze pro prpad kdyz nastavme
vzorkovan kmitocet
na 16 kHz, tak doln propust vstupnho filtru bude mt propustne pasmo
(utlumu
3 dB ) do 6,4 kHz a nepropustne pasmo (utlum 74 dB ) dosahne u 9,6
kHz.
Vystupn filtry Na vystupu jsou pro kazdy kanal doln propusti, ktere
vystupn
signaly vyhlad, vce o problematice viz [3].
Mody kodeku Kodek muze pracovat v nekolika modech (vce informac o
rezimech
modu kodeku viz [3]).
• Mod kodeku 3 a 5 - Kodek pouzva jen ESSI, pres kterou prijma
hovorove
data a rdc data, a posla na vzorkovane data se stavovymi
informacemi jako
verze kodeku, detekce chyby aj. viz [3]
• Mod kodeku 4 - Kodek pouzva ESSI a SPI sbernici. Rdc informace
jsou
prenaseny pomoc SPI sbernice zvlast’ a pres ESSI se prenas jen
vzorky.
10
U vyvojovem modulu DSP 56858 je pouzit mod 4, takze pres ESSI se
poslaj jenom
navzorkovane data, a pres SPI se poslaj rdic data pro kodek
zvlast’. Zapojen je
videt na obr. 1.3 .
sbernice, ktera byla vyvinuta z potreby leps synchronizace. V
prpade, kdyz se
periodicky poslaj data, je dulezita presna synchronizace
jednotlivych ramcu. ESSI
podporuje duplexn prenos, umoznuje komunikovat v rezimu synchronnm
i asyn-
chronnm (se synchronizac na ramce), v nasem prpade ma jeden kanal
pro prjem a
3 kanaly pro vyslan s tm, ze vyslac a prijmac kanaly mohou pracovat
na jinych
kmitoctech.
Kodek pouzva pro komunikaci jeden kanal pro prjem vzorku a jeden
kanal pro
vyslan vzorku. Strukturu ramce pro prenos vzorku vidme na obr. 1.4.
V jednom
ramci, ktery ma velikost 32 bitu, je prvnch 16 bitu pro levy kanal
a dalsch 16 bitu
pro pravy kanal.
Sbernice SPI SPI (Serial Peripheral Interface) je synchronn seriova
sbernice,
ktera muze pracovat ve duplexnm rezimu Master nebo Slave. Podporuje
az 16bitove
ramce s teoretickou rychlost az destky MHz. Kodek v modu 4 pouzva
sbernici SPI
k prenaseni rdcch dat. Struktura vyslanych dat kodeku a prijmanych
dat z DSC je
na obr. 1.5, ale na vyvojovem modulu nen vyslan od kodeku
podporovano (vystup
CDOUT je uzemnen).
Pomoc prijmaneho ramce od DSC lze nastavit predzeslen na vstupu
kodeku,
zeslen vystupu kodeku a zakazat vystup (mute). V tab 1.1 je uveden
popis jed-
notlivych bitu ramce. SPI sbernice, kterou DSP 56858 ma, je na
vyvojovem modulu
pouzita ke komunikaci s extern pamet, sice by bylo mozne na
vyvojovem modulu
prepojit sbernici SPI ke kodeku, ale vzhledem k tomu, ze se data
poslaj jen pri
zmene nastaven kodeku a to je zpravidla jen pri inicializaci (po
zapnut), tak nen
zapotreb k tomu SPI sbernici vyclenit, ale lze to efektivne vyresit
i softwarove, emu-
lac SPI. Dky tomu, ze data z DSC jsou pouze vyslana, a nen nutne
resit prijman
je softwarova realizace relativne jednoducha.
Obr. 1.5: Struktura ramce na SPI sbernici
Zeslen vstupu a vystupu je nastavovano z DSC pomoc SPI sbernice a
tak,
ze se da kdykoliv v prubehu cinnosti zmenit, poslanm noveho
nastaven. Na vstupu
kodeku lze signal zeslit az o 22,5 dB a vyuzt tak lepe rozsah A/D
prevodnku. Na
vystupu lze zeslit signal az o 46,5 dB.
12
Symbol Popis
1 = DAC vystup potlaceny
1 =vstup leveho kanalu je LIN2
ISR 0 = vstup praveho kanalu je RIN1
1 = vstup praveho kanalu je RIN2
LG3-LG0 zeslen vstupu leveho kanalu
zvetsuje se o 1,5 dB
0000 = zadne zeslen (0 dB)
1111 = maximaln zeslen (22,5 dB)
RG3-RG0 zeslen vstupu praveho kanalu
zvetsuje se o 1,5 dB
0000 = zadne zeslen (0 dB)
1111 = maximaln zeslen (22,5 dB)
LA4-LA0 zeslen leveho vystupnho kanalu
zvetsuje se o 1,5 dB
0000 = zadne zeslen (0 dB)
1111 = maximaln zeslen (22,5 dB)
RA4-RA0 zeslen praveho vystupnho kanalu
zvetsuje se o 1,5 dB
0000 = zadne zeslen (0 dB)
1111 = maximaln zeslen (22,5 dB)
Hodiny Kodek CS4218 nema integrovany krystal, mus se k nemu
pripojit extern
krystal jehoz kmitocet mus byt minimalne 256krat vets, nez je
kmitocet vzorko-
van (plat pro 4. mod kodeku ). Extern krystal se pripojuje na vstup
CLKIN a to
bud’ 11,2896 MHz nebo 12,288 MHz. Na zvolene kmitoctu kodeku zavis
rychlost
vzorkovan, zavislost vidme v tab. 1.2. Na vyvojove modulu je pouzit
krystal 12,288
MHz.
Nastaven je nutne napred udelat na vyvojovem modulu, nastavenm
prepnace SW5
(nastavuje se vzorkovac kmitocet Fvz), pak nastavenm periferi DSC a
nasledneho
nastaven kodeku pomoc SPI.
Tab. 1.2: Nastaven frekvence vzorkovan pomoc pinu na prepnaci
SW5.
SW 5 SW 5 SW 5
Pozice 1 Pozice 2 Pozice 3 Vzorkovac kmitocet Fvz (kHz)
(MF6) (MF7) (MF8) 12,288 MHz 11,2896 MHz
ON ON ON 48,00 44,10
ON ON OFF 32,00 29,40
ON OFF ON 24,00 20,05
ON OFF OFF 19,20 17,64
OFF ON ON 16,00 14,70
OFF ON OFF 12,00 11,025
OFF OFF ON 9,60 8,82
OFF OFF OFF 8,00 7,35
1.2.1 Nastaven na vyvojove modulu DSC56858XUM
Vzorkovac kmitocet kodeku Fvz nastavme na hodnotu 16 kHz pomoc
prepnace
SW5. Ke kodeku je pripojen krystal 12,288 MHz, tak podle tabulky
1.2 je Fvz rovno
16 kHz pri nastavenm pozic prepnacu OFF ON ON.
1.2.2 Inicializace ESSI
Vyvojovy modul je navrhnut tak ze, ESSI na DSC pracuje v Slave modu
a v kodeku
jako Master, je to kvuli tomu, ze kodek je pak mene nachylny k
rusen. Pri zmene
vzorkovacho kmitoctu se zakonite mus zmenit rychlost prenosu na
ESSI lince,
protoze je kodek Master, a vysla casovan, tm je situace jednodus, a
nen nutne
menit nastaven ESSI na DSC. Zavislost kmitoctu sbernice na kmitoctu
vzorkovan
vidme v tab. 1.3 CLKIN je kmitocet externch hodin a SCLK je
kmitocet hodin na
ESSI sbernici.
Na obr. 1.6 vidme, jak kodek komunikuje pres ESSI sbernici. Pred
samotnou ko-
munikac vysle synchronizacn bit, ktery mus byt aktivn v sestupne
hrane casovan
SCLK, a pote zacne vyslat a prijmat data od DSC. Ale pri vychozm
nastavenm
(po resetu) je sbernice ESSI na DSC nastavena jinak, a proto ji
musme spravne
nakonfigurovat.
Doporucene porad inicializace registru pro sbernici ESSI
1. Nastavit registry SRXCR, STXCR, SCR2, SCR3, a SCR4 na rezim
Slave (kodek je
pri vyslan Master) mode Normal (na sbernici komunikuje jen jedno
zarzen).
14
8 48,00
12 32,00
16 24,00
20 19,20
24 16,00
32 12,00
40 9,60
48 8,00
Obr. 1.6: Prenos na ESSI
2. Nastavit casovan prijmace a vyslace, DSC pracuje jako Slave
takze signal
CLOCK prijma.
4. Povolit sbernici ESSI ( ESSIEN = 1).
5. Povolit RXFIFO ( RFEN = 1) a RTFIFO ( RTEN = 1) nastavit prijmac
a
vyslac threshold pro RXFIFO a TXFIFO.
6. Povolit prerusen vyslan a prjmu.
7. Nastavit RE a TE bit (RE = 1 a TE = 1) k povolen vyslan a prjmu
na
15
Registr STXCR a SRXCR
WL = 3 (World length) velikost slova 16 bitu
DC = 1 (Frame Rate Divider Control) kazdy ramec je prijat
PM = 0 (Prescaler Modulus Select) Modulo registr pred-delicky nen
pouzit
Nastaven registru STXCR = 0x6100 a SRXCR = 0x6100
Obr. 1.7: Registr STXCR
Obr. 1.8: Registr SRXCR
TIE = 1 (Transmit Interrupt Enable) povol prerusen pri odeslan
dat
SYN = 1 (Synchronous Mode) povol synchronizaci
TSHFD = 0 (Transmit Shift Direction) nejvce vyznamny bit se bude
vyslat jako
prvn
TSCKP = 0 (Transmit Clock Parity) data jsou cteny pri nabezne hrane
signalu SCLK
ESSIEN = 1 (ESSI Enable) povol sbernici ESSI
NET = 1 (Network Mode)povol network mode
TFSI = 0 (Transmit Frame Sync) synchronizace ramce je pri urovni
HIGH u SYNC
signalu
TFSL = 1 (Transmit Frame Sync Length) nastavuje velikost
synchronizace na 1 bit
TEFS = 1 (Trensmit early Frame Sync) synchronizacn bit je vyslan
pred daty
16
Registr SCR3
RSHFD = 0 (Receive Shift Direction) v prijatych datech je prvn bit
nejvyznamnejs
RSCKP = 0 (Receive Clock Polarity) data jsou ctena behem vzestupne
hrany
RFSI = 0 (Receive Frame Sync Invert) synchronizace ramce je pri
urovne u SYNC
signalu
Registr SCR4
TXSF0 = 1 (Transmit Status Flag Control 0) povolen aby vyslac kanal
0 mohl
menit prznaky (flagy TFF, TDE, TUE, a TFE) a tm vyvolat
prerusen
SCKD = 0 (Clock Source Direction) SCK pin se chova jako vstupn (mod
slave)
Nastaven registru SCR4 = 0x400
Obr. 1.11: Registr SCR4
Registr SFCSR
RFWM = 8 (Receive FIFO Full Watermark) prznak pretecen FIFO bude az
bude
17
TDWM = 1 (Transmit FIFO Empty Watermark) prznak naplnen TXFIFO
bude
pokud zbude uz jen jeden volny slot
Nastaven registru SFCSR = 0x129
Obr. 1.12: Registr SFCSR
1.2.3 Inicializace SPI a kodeku CS4218
Vzhledem k tomu, ze pouzvame softwarove emulovanou SPI (viz kap.
1.1.1 ) je
zapotreb nastavit jen registry GPIO obvodu. Na obr. 1.3 je videt,
ze jsou pouzity
piny PE2 pro MOSI, PE3 pro CCLK a PC3 pro CS. Pro kazdy pin je
nutno nastavit
prslusne bity v registrech.
Registr GPIOX PER
(Peripheral Enable Register) urcuje, jestli se pin chova jako GPIO
(General Pur-
pose Input/Output - standardn in/out pin) nebo ma nejakou jinou
funkci, pokud
to pin umoznuje (naprklad ACMP, A/D aj.). Zapsanm nuly (vychoz
hodnota
registru) se vsechny piny chovaj jako GPIO pro dany port, takze
hodnota registru
GPIOE PER muzeme nechat v poresetovych hodnotach, ale v portu GPIOC
PER musme
nastavit chovan pinu PC0 az PC2 a PC5 jako vstupy a vystupy ESSI
sbernice. Tedy
do registru GPIOC PER nastavme hodnotu 39.
Registr GPIOX DD
(Data Direction) nastavuje smer. Pokud je pin v modu GPIO tak tento
registr
urcuje, jestli je to vstupn nebo vystupn pin. Zapsan nuly znamena,
ze pin je
vstupn, zapsanm jednicky znamena, ze pin je vystupn. Piny, ktere
pouzvame
k SPI komunikaci, jsou vsechny vystupn. Do registru GPIOE DDR
nastavme 6 a do
registru GPIOC DDR nastavme hodnotu 8.
1.2.4 Cten a zapis dat z kodeku
Jakmile DSC prijme pres ESSI vzorek od kodeku, vyvola se prerusen,
data z prij-
macho registru se zkopruj do vstupn pameti (vstupn i vystupn pamet’
je kruhova
18
Obr. 1.13: Prenost na SPI
vyrovnavac pamet’ viz kap. 1.4.6 ), pokud jsou ve vystupn pameti
nachystany data,
tak jsou zkoprovana do vyslacho registru ESSI sbernice.
1.3 Detekce reci
Pri spektralnm odectanm je nutne urcit, ktery segment obsahuje
uzitecnou infor-
maci (rec) a ktery segment prenas jen sum. A k tomu se pouzvaj
detektory hlasove
aktivity.
Detektory hlasove aktivity (VAD voice activity detection) jsou
algoritmy navrzene
pro to, aby dokazali v hovorovem signalu urcit, zdali dany usek (v
nasem prpade
segment) obsahuje nebo neobsahuje rec. Obecne se v reci vyskytuje
mnoho pauz a
odmlk, ktere jsou vetsinou pro zpracovani reci nezadouc a proto je
nutne je od reci
nejakym zpusobem odlisit, a prave pro to se pouzvaj VAD algoritmy.
V nasem
prpade je pouzit detektor na principu prahovan energie segmentu.
Tato metoda
vychaz z predpokladu ze rec ma vyrazne vets energii nez sum.
19
1.4 Spektraln odectan
Princip spektralnho odectan je videt na obr. 1.14 Vzorky x jsou
poslany z kodeku
do DSP a ukladana do vstupn pameti, pote jsou jako segment x[n]
pomoc FFT
prevedeny do spektraln oblasti X[n]. Vhodnou metodou je odhadnuto
spektraln
hustota sumu S[n], a to je odecteno od spektralnch koeficientu
X[n], vysledne
spektrum Y [n] (zbavene sumu) je inverzne transformovano pomoc IFFT
do casove
oblasti y[n]. Nakonec jsou jednotlive vzorky y poslany z vystupn
pameti do kodeku.
Obr. 1.14: Schema spektralnho odctan
1.4.1 Segmentace
Hovorove signaly se obvykle segmentuj do ramcu s dobou trvan okolo
20 az 30
ms, ktere se jev pro lidsky sluch jako kvazistacionarn (po castech
stacionarn).
Algoritmus FFT je nutne poctat s velikost segmentu mocniny dvou
(viz [1]). Takze
je nutne prizpusobit velikost ramce vzorkovacmu kmitoctu.
Vzorec pro vypocet velikosti segmentu je
N = Fvz ∗ Tseg (1.1)
kde je Tseg velikost segmentu v case a N je pocet vzorku. V nasem
prpade, mame
vzorkovac kmitocet Fvz =16 kHz a po dosazen do vztahu 1.1
vychazej
pro Tseg = 20 ms je N = 380,
pro Tseg = 30 ms je N = 480,
nejblizs mocnina dvou je 256 a 512. Ze vztahu 1.1 muzeme odvodit
vztah pro
vypocet delky segmentu
Fvz
(1.2)
po dosazen zjistme ze, Tseg256 =16 ms a Tseg512 = 32 ms. Vybral sem
segment
o velikosti 512, protoze se blz vc pouzvanym casum a bude mt leps
kmitoctove
20
1.4.2 Vahovan segmentu
Algoritmus vypoctu FFT bere vstupn signal jako periodicky, ale
segment ve vetsine
prpadu periodicky nebyva a proto ho zperiodizujeme v algoritmu
vypoctu, tm
ale vznikne problem toho, ze spektra zperiodizovaneho signalu se
prekryvaj a tm
sctaj, tm vznika chyba (jednotlive spektraln slozky se rozmazavaj),
resenm to-
hoto problemu je pouzit nektere vahovac okenko, napr Hammingovo,
ktere vynaso-
beno se signalem potlac vyss kmitocty (vce o problematice viz
[1]).
Pro vahovan segmentu je vybrano Hammingovo okenko.
Presah segmentu K problematice segmentace patr i nutnost presahu
vysledku
po uprave dat. Pri vahovan okenkem je cast energie potlacena a
pouhym zarazenm
segmentu za sebe by vznikaly vyrazne zmeny v amplitude vysledneho
signalu.
Spektraln odectan patr mezi nelinearn metody filtrace(na vc v case
se men
odhad sumu - tudz i filtrace) a pouhem razenm jednotlivych segmentu
by vznikaly
nespojitosti v mstech navazovan segmentu. To je reseno presahem,
kdy pro vypocet
aktualnho spektra jsou pouzita i cast dat z minuleho vzorku, na na
vystupu jsou
k aktualnmu vysledku prictena data z minuleho vysledku prave o
velikost presahu.
Tm je zpusobeno, ze jednotlive vzorky na sebe plynuleji navazuj, a
navc vhodnou
volbou presahu se res i problem pr vahovanm okenkem, protoze dochaz
ke ztrate
energie, a prave dky presahu segmentu je mozne dostat energii
vystupnho signalu
rovnou energie signalu pred zpracovanm.
1.4.3 Vypocetn narocnost
Vyznam jednotlivych cast:
• Segment znac cas potrebny k navzorkovan dat pro segment a ulozen
do
vstupn pameti.
• Vypocet zobrazuje maximaln dobu po, ktere muze DSC pracovat s
daty
(vahovan okenkem, fft,atd.)
• Vystup znamena odeslan dat z vystupn pameti do kodeku.
V dobe Segment 1 vyckava DSC dokud neprijme N vzorku od kodeku,
jakmile je
toto splneno, zkopruje se segment ze vstupn pameti do intern a
zacna Vypocet
1 a zaroven DSC prijma dals vzorky od kodeku. Doba Vypocet 1 mus
byt mens
21
nez je doba prijmut vzorku o poctu N − p, kde N je velikost
segmentu a p je
velikost presahu, v prpade nedodrzen by doslo ke ztrate nasledujcho
segmentu
(vzhledem k tomu, ze algoritmus ma v case konstantn slozitost, tak
by se ztrata
segmentu periodicky opakovala), k cemuz nesm dojt. Na zacatku doby
Vysledek 1
jsou data zkoprovany do Vystup 1 (vystupn kruhova pamet’) a odtud
jsou poslana
do kodeku a zaroven bylo prijatych novych N − p vzorku od kodeku a
ty jsou
spolecne se vzorky se Segment 1, o velikosti presahu, zkoprovany
pro Vypocet 2.
V case dokoncen Vypoctu 2, se presah z Vysledek 1 pricte k Vysledku
2 a data,
ktera byla v casti presahu jsou pripravena k odeslan ke kodeku. A
tento cyklus se
opakuje pro vsechny dals segmenty.
Obr. 1.15: Schema casove posloupnosti zpracovavan dat
Dulezite informace o systemu pracujc v realnem case je zpozden
systemu.
Z obr. 1.15 nam vychaz, ze zpozden vystupu je
Ts = 1
∗ (N + N − p), (1.3)
kde N je pocet vzorku v segmentu a p znac velikost presahu
segmentu. Dals
dulezitou hodnotou je doba po kterou muze DSC pracovat s daty, a ta
je
Tv = 1
∗ (N− p). (1.4)
Po dosazen pouzitych hodnot (N = 512 a p = 256) vychaz doba zpozden
systemu
na 48 ms a doba na zpracovan segmentu je 16 ms.
1.4.4 Pamet’ove pozadavky programu na DSC
Obecne maj mikrokontrolery relativne malo pameti a ani tento DSC
nen vyjmkou,
proto je dulezite se zamerit i na pamet’ove narocnost, aby bylo
vubec v moznostech
tohoto DSC tento program provadet. V tabulce 1.4 jsou vypsany
nejvets datove pole
22
programu. Lze tedy usoudit, ze priblizna velikost programu v pameti
RAM bude
uzce souviset s velikost segmentu, ale musme jeste poctat s
mnozstvm globalnch
i lokalnch promennych, stack, heapu a dale, ze data byvaj v pameti
ukladana
v blocch, ktere nemus odpovdat puvodn velikosti.
Priblizna velikost pameti z tabulky 1.4 vychaz na 20 ∗N ,kde N je
pocet vzorku
v segmentu. Z toho predpokladu vychaz tab. 1.5 kde vidme odhad
velikosti pameti
pro jednotlive velikosti segmentu. Podle manualu (viz [4]) ma DSC
56858 pamet’
RAM o velikosti az 24000*16bitu, takze pravdepodobne nejvets mozna
velikost je
prave 512 vzorku na segment, u velikosti segmentu 1024 vzorku je
rezerva okolo
4000*16bitu coz je nedostatecne (je mozne, ze po optimalizaci kodu
by velikost
segmentu 1024 byla realna ale 2048 je uz mimo pamet’ove moznosti
tohoto DSC).
Tab. 1.4: Odhad pamet’ova narocnost programu
Nazev pameti Velikost v RAM
Vstupn kruhova pamet’ 4 ∗N Vystupn kruhova pamet’ 4 ∗N
Pamet’ pro vypocet L+R kanal 2 ∗ 2 ∗N Pomocna pamet’ pro vypocet
FFT 2 ∗N
Pamet’ pro ulozen Hammingova okna N
Pamet’ pro ulozen twidle faktoru N
Pamet’ pro ulozen odhadu sumu L+R kanal 2 ∗ 2 ∗N
Tab. 1.5: Zavislost pamet’ove narocnosti na velikosti
segmentu
Pocet vzorku v segmentu Odhadovana velikost v pameti RAM
N 16-ti bitove slova
lyzovan obrazu (signalu). V obecnem prpade se jedna o vyjadren
funkce popisujc
obraz v jinych promennych pomoc integraln transformace (v podstate
vyjadren
funkce v jine bazi). V nasem prpade se uvazuje tzv. trigonometricka
Fourierova
23
transformace, ktera za bazove funkce poklada sin(kt), cos(kt) nebo
v komplexnm
tvaru exp(jkt), kde k je cele cslo v prpade Fourierovy rady nebo
realna promenna
v prpade Fourierovy transformace.
Rychla Fourierova transformace (FFT Fast Fourier transform) je
algoritmus,
ktery umoznuje rychlejs vypocet oproti vypoctu z definicnho vztahu
(viz [1]). Kla-
sicka fourierova transformace ma narocnost na vypocet O(N2), rychla
Fourierova
transformace ma narocnost O(N ∗ logN), ale mus byt dodrzeno, ze
velikost dat nad
kterymi je FFT poctano je mocnina dvou. Vzorec pro vypocet
diskretnch hodnot
FFT je
xne (−j2πk n
N ) (1.5)
kde N je celkovy pocet hodnot, k je index spektraln slozky a nabyva
hodnoty 0 az
N -1. Inverzn FFT je rozdlna ve znamenku u twidle faktoru a s tm,
ze kazdy prvek
je na vystupu podelen poctem vzorku
xk = 1
paraleln a naopak, takze vstupn vyrovnavac pameti ze vstupnch dat,
ktere jsou
poslany po vzorcch (seriove), vytvar segment ktery je zkoprovan pro
vypocet
(paraleln presun) a naopak u vystupnho je segment po vypoctu
(paraleln vstup)
postupne preposlan kodeku (seriovy vystup).
K resen problemu prijman a odeslan vzorku by vyrovnavac pamet’ s
kla-
sickym adresovanm byla nevhodna z duvodu prekryvan segmentu, kde je
nutne mt
ulozenou historii dat o velikost presahu, takze je nutne krome
aktualne nactaneho
ramce mt nekde ulozen cast minuleho, a vyresenou adresaci pri
vyctan dat ze
stareho segmentu a aktualnho, a navc jsou neustale od kodeku
poslany data nove,
coz zpusobuje velice slozity zpusob adresace. Proto se pouzvaj
kruhove pameti,
ktere mnoho problemu odstranuj, ale nektere pridavaj.
V kruhove vyrovnavac pameti software pouzva kazdou pamet’ovou
lokaci sek-
vencne, dokud nenaraz na konec bloku. Pak proces zacna znovu na
pocatku adre-
soveho prostoru a data prepisuje, tedy opakuje se v kruhu obr.
1.16.
U kruhove vyrovnavac pameti se pouzvaj dva ukazatele Read a Write.
Read
slouz pro zapisovan dat do pameti a Write slouz pro cten dat z
pameti. Na
zacatku ukazuj Read i Write na prvn polozku pameti. Pokazde, kdyz
je pomoc
Read precten vzorek, tak je tento ukazatel zvetsen a pokud je jeho
adresa vets, nez
je velikost pameti, tak je do Read ulozena adresa prvn polozky
(stejne se pracuje i
24
Obr. 1.16: Princip kruhove pameti
s ukazatelem Write). To znamena ze vzdalenosti Read od Write urcuje
pocet dat
ve vyrovnavac pameti, vzorec pro vypocet poctu dat v kruhove pameti
je
Ndat = (Write−Read) mod Nb (1.7)
kde Ndat je aktualn pocet vzorku ve vyrovnavac pameti, Write a Read
obsahuj
adresy dat a Nb je velikost kruhove vyrovnavac pameti.
Ze vzorce 1.7 muzeme urcit dva limitn stavy, ktere kdyz nastanou je
nutne je
osetri.
Limitn stavy jsou:
1. Pokud plat Read = Write, a je vyvolana instrukce cten, dojde k
podtecen a
Read ukazuje na data, ktera nejsou aktualn. V praxi se s tm setkame
pokud
vyctame z pameti data rychleji nez jsou zapisovana. Nen moznost jak
tuto
chybu napravit, a je nutne cekat na dals data.
2. Pokud se Write = Read+1, a je vyvolan zapis do pameti, dojde k
pretecen a
Read neukazuje na prvn polozku fronty (nejstars vzorek), ale na
prvn (nej-
novejs vzorek). Tato chyba se odstranuje bud’ tak, ze jsou vsechny
nove data
zahozena, dokud se nevyctou nejstars (nezvets se Read ukazatel)
nebo ze
se zapisem (zvetsen ukazatele Write) zvets i ukazatel Read tak, aby
stale
platilo Write ≥ Read + 1, neboli nejstars data jsou
odstranovana.
1.4.7 Reprezentace dat
Cslicova technika pracuje s csly ve dvojkove soustave. Dvojkova
soustav je polyadicka
cselna soustava se zakladem Z = 2. Jako v kazde jine polyadicke
soustave je i zde
kazde cslo tvoreno posloupnost cslic, ktere nabyvaj hodnot 0, . . .
Z − 1, v binarn
cselne soustave tedy 0,1. Kazda cslice ma svou vahu 2i a libovolne
realne cslo A
lze vyjadrit jako soucet mocnin o zakladu 2
25
Ve dvojkove soustave definovane vztahem 1.8 lze zobrazit jakekoliv
realne cslo.
Omezena delka registru v cslicovych systemech ma za nasledek i
omezeny pocet
zobrazitelny csel a z toho duvodu i omezenou presnost zobrazen. Pro
delku registru
B lze prepsat vztah 1.8 do tvaru
A = k∑
k−1 + . . . + a12 1 + a0 + a−12
−1 + . . . + a−b2 −b, (1.9)
kde k znac nejvyss vahu cele casti csla A a b nejmene vyznamneho
bitu, ktery
urcuje rozlisen dvou sousednch csel, tzv. kvantizacn krok g,
g = 2−b. (1.10)
V registru delky B muzeme zobrazit jak celou, tak i zlomkovou cast
csla. Delka
registru B je
B = k + b + 1. (1.11)
Pri tomto vyjadren cslaAje umstena radova carka za clenem a0 a
rozdeluje cast
celou (integer) Ai a zlomkovou (fractional) Af
A = Ai + Af = k∑ i=0
ai2 i +
a−i2 −i. (1.12)
Umsten radove carky v registru je fiktivn, zalez jen na nas volbe
reprezentace
dat. Mus byt vsak dodrzeno a respektovano pro vsechny registry a
vsechny aritmet-
icke operace. V nasem prpade je umsten radove carky bud’ za
poslednm zprava,
pak se jedna o celocselnou reprezentaci(integer) nebo ze prvnm
bitem zleva, pak
se jedna o zlomkovou reprezentaci csel(fractional).
Zaporna csla
Ve vetsine algoritmu DSP pracujeme s kladnymi i zapornymi csly.
Existuj v zasade
tri nejbeznejs metody reprezentace zapornych csel
• znamenkovy bit s absolutn hodnotou
• dvojkovy doplnek
• jednickovy doplnek
26
V predchozch odstavcch jsme poznali, ze v B-bitovem registru lze
zobrazit 2B
ruznych csel. Budeme-li chtt v registru ulozit jak kladna tak i
zaporna csla, pak
budeme muset rozdelit registr priblizne na dva stejne casti. V
mikrokontrolerech
se skoro vyhradne pouzva jen dvojkovy doplnek, takze nasleduj uvahy
budou
smerovany ohledne neho.
Dvojkovy doplnek Jedna se nejcasteji pouzvany zpusob zobrazen csel
v tech-
nickych realizacch. Pro kladna csla X ≥ 0 je zobrazen shodne s
neznamenkovymi
csly. Pro csla X < 0 se vytvar dvojkovy doplnek jako doplnek
absolutn hodnoty
csla |X| do hodnoty 2B, kde B je pocet bitu pouziteho registru.
Odtud plyne nazev
2-doplnek. Prepis pro vytvoren dvojkoveho doplnku X2K binarn csla
Xbin pro dane
dekadicke cslo Xdek v registru delky B = b + 1 je
Xbin(b + 1) ≡
Dvojkovy doplnek k danemu binarnmu cslu nalezneme podle
vztahu
X = XM
kde XM znac libovolnou celocselnou konstantu, ktera slouz jako
mertko. Bule-li
napr. XM = 2b bude se jedna o zobrazen integer, pro XM = 20 se
jedna o zo-
brazen fraction. Jako praktickou pomucku, vyplyvajc ve vztahu 1.13
pri stanoven
dvojkoveho doplnku negujeme cslo XB bit po bitu, a pricteme 1 v
nejnizsm radu
X2K(b + 1) = Xbin(b + 1) + 1 (1.15)
Pri aplikacnch se signalovymi procesory pracujeme nejcasteji se
zlomkovymi csly,
tedy
Dvojkovy doplnek zlomkoveho csla s radovou carkou za prvnm bitem
zleva,
vytvarme jako doplnek do csla 21 = 2.0. Vaha nejvyssho bitu je 20 a
nejnizsho
2−b. Dekadickou hodnotu zlomkoveho csla −1 ≤ X ≤ 1 stanovme z
binarnho
vyjadren podle vztahu 1.14 pro XM = 20:
Xdek = −XS + b∑ i=1
Xi2 −i (1.16)
Definicn obor csel ve dvojkovem doplnku je nesymetricky vzhledem k
nule. Zlomkova
csla lze zobrazit v intervalu(−1, 1− 2−b).
27
2 VLASTNI RESENI
2.1 Popis resen
Program je psan v jazyce C ve vyvojovem prostred CodeWarrior. Jako
zaklad pro
program jsem pouzil demoprojekt (umsten je Precessoru Expert
Stationery→ DemoApplication→Telephony→Codec→56858). Tento ukazkovy
projekt nastav
DSC a kodek a po te v hlavn smycce prijma a vysla bloky dat vzorku.
Pro-
jekt byl pro potrebu spektralnho odctan kompletne predelan. Obsluha
prijman a
vyslan vzorku byla presunuta do prerusen Codec OnFullRxBuf, kde
jsou ukladany
do vstupn a vystupn vyrovnavac kruhove pameti. Ve hlavn smycce
programu se
vykonava samotne spektraln odctan.
Projekt pouzva pro nastaven DSC a kodeku beany. Bean je kompoment
pro-
gramu Precessoru Expert (je soucast CodeWarrioru), ktery umoznuje
jednoduse
nastavit registry dane periferie, obsluhovat prerusen a jine
funkce. Pomoc beanu
56858 je nastaveno CPU, bean Audio Codec CS4218 inicializuje ESSI,
posla nas-
taven kodu a obsluhuje prerusen.
V beanu Audio Codec CS4218 je komunikace (prijman a vyslan dat) na
ESSI
resena pomoc intern vstupn a vystupn vyrovnavac pameti. Ovsem pro
nase ucely
jsou tyto vyrovnavac pameti nevhodne (jsou to intern funkce
Procesora Experta,
ktery pri kazdem pregenerovan intern funkce prepisuje - vrac
uzivatelske zmeny),
tak je nastavena hodnota techto pameti na 32 (v Bean Inspektrou
polozka Fifo
size) s tm, ze tato hodnota by nemela byt nikdy dosazena. V beanu
je prijman
implementovano tak, ze ESSI ma vlastn buffer na 8 vzorku, pote co
prijme 8 vzorku
vyvola prerusen Inhr2 InterruptRx,a uloz tyto data na intern
kruhove pameti a
zavola se funkce Codec OnFullRxBuf, kde je muzeme pomoc funkce
Codec Read
vycst. Pomoc funkce Codec Write zapisujeme data do intern vystupn
pameti
kodeku, ktere jsou zkoprovana do vyslacho registru ESSI jakmile je
prazdny.
V prubehu vytvaren kodu se objevilo nekolik problemu. DSC 56858
podle ma-
nualu (viz [6]) nepodporuje standardn trigonometricke a algebraicke
funkce s csly
s pohyblivou desetinou carkou (double a float), coz nam zpusobovalo
problemy s gen-
erovanm tabulky pro Hammingovo okno a tabulku twidle faktoru, tento
problem
byl vyresen predgenerovanm tabulek pro 1024 vzorku. Chtena velikost
tabulky se
vytvor podvzorkovanm. Dalsm problemem je, ze kodek vysla priblizne
prvnch
160 vzorku jako nuly, nez zacne vyslat skutecne hodnoty (plat jen
po inicializaci,
takze v realnem case zanedbatelne)
28
2.1.1 Volan funkc assembleru
Program je psan v jazyce C, ale jazyk C neumoznuje u promennych s
pevnou de-
setinnou carkou (viz kap 1.4.7), definovat jestli se jedna o
zlomkovy tvar, nebo cela
csla. Pouzit csel s pohyblivou carkou, nebo prevaden csel , by bylo
vypocetne
velmi neefektivn a kvuli tomu je nutne volat funkce z assembleru.
Existuj tri metody
jak pouzvat funkce z assembleru v jazyku C:
• Klcove slovo asm
• Intrizitn funkce.
Klcove slovo asm
Za klcovym slovem asm jsou bud’ slozene zavorky(v nich muze byt vce
assem-
bler funkc) nebo nasleduj normaln zavorky (v nich muze byt pouze
jedna funkce
v assembleru). V nasem prpade nen pouzit tohoto zpusobu volan
funkce vhodne,
protoze v prubehu programu nevme co je v kterych registrech
ulozeno, a jenom
velice slozite by se to resilo.
Ukazka volan:
Volanm funkce napsane v assembleru
Kod v assembleru je napsan jako funkce v jazyce C, vyhodou toho
volan je ze pred
vyvolanm funkce jsou vsechny registry ulozeny, takze muzeme s
registry bezpecne
pracovat. Ukazka volan:
{
Intrizitn funkce, jsou obsazene v knihovne intrinsics 56800E.h,
ktera je soucast
29
assembleru. Vyhodou tohoto prstupu je to, ze umoznuje jednoduseji
volat volat
funkce z assembleru, a tm lze urcit jak se ma s promennymi pracovat
(nejenom typ,
ale take saturace, velikost slova atd.) a zefektivn to provaden
vypoctu.
Ukazka volan:
result = L_sub(la,lb);
vych diagramu.
2.2.1 Funkce main
Jedna se o hlavn funkci, z ktere jsou volane jednotlive
podprogramy. Program po
inicializaci DSC prejde do nekonecne smycky, ve ktere ceka na
navzorkovan seg-
mentu a nasledneho vypoctu.
1. Jedna se o intern funkci beanu Audio Codec CS4218 , kde je
inicializace CPU
a vsech pouzvanych periferi.
2. Jedna se o funkci beanu, ktera povoluje prerusen pri prjmu na
ESSI, a tm
padem je zabezpeceno, aby nedoslo k nechtenemu prijet dat od
kodeku, dokud
nen hotova cela inicializace.
3. Napln tabulku pro vahovan Hammingovym oknem a twidle faktoru
(pro-
kladane funkce cos a sin pouzity pro vypocet FFT) pomoc
predgenerovane
tabulky. Vzorky jsou pro segmenty o velikosti 1024 vzorku a ostatn
rozmery
jsou vytvoreny pomoc podvzorkovan, prpadne aproximac.
4. Program ceka dokud nen promenna start rovna jedne, tato promenna
se nas-
tav v prerusen Codec OnFullRxBuf pokud je uz prijat segment pro
vypocet.
5. Vynulovan promenne start zpusob, ze pri prstm prechodu se u 4.
bodu
zastav, dokud nebudou pripraveny vstupn data. Promenna inprog se
nastav
na hodnotu 1, aby program vedel, ze je aktualne ve vypoctu
spektralnho
odctan. A pokud by doslo v prerusen Codec OnFullRxBuf k
navzorkovan
dostatecneho mnozstv dat (bude splnena podmnka u 4. bodu, tak
5.bod
zabezpec, aby nebyli prepsany data s kterymi se provad vypocet.
Jedna se
o chybovy stav, kdy DSC nestha spoctat spektraln odctan vcas. To se
da
napravit zmensenm segmentu (narocnost je N∗logN) , zmensen
vzorkovacho
kmitoctu (zvets se perioda prijmanych dat od kodeku), zmensen
presahu
30
(zavislost je linerarn) a nebo pokud je vypocet dvoukanalovy
(stereo), tak
zmenit na jednokanalovy (dvakrat mene narocne na vypocet).
6. Nacte navzorkovane data z kodeku. Popis viz 2.2.3.
7. Detekuje jestli segment obsahuje rec. Popis viz 2.2.5.
8. Funkce fft potrebuje vstupn data v reverzne bitovem adresovan, o
coz se
postara tato funkce. Je psana v assembleru a nen to in-place
metoda, takze
potrebuje zvlast’ pole pro vstupn data a zvlast’ pole pro vystupn
data (pro
nase ucely by byla vhodnejs metoda in-place).
Vstupnmi parametry: vstupn vektor, vystupn vektor a pocet
vzorku.
9. Vypocet FFT, je to funkce psana v assembleru, optimalizovana na
tento DSC
(prevzato z ucebnch materialu k predmetu MSPR viz [8]). Upravil
jsem tento
program tak, aby se dal volat z jazyka C a aby se spravne predaly
parametry.
Vstupn pole je zaroven i vystupn (in-place metoda), jelikoz vystup
z funkce
fft je komplexn cslo (ulozeno ve tvaru Real1,Img1,Real2,Img2...),
tak vstup-
n pole mus mt dvojnasobnou velikost, nez je velikost
segmentu.
Parametry funkce jsou: velikost segmentu, pole dat, pocet sekc FFT,
tabulka
twidle faktoru.
10. Pokud byl aktualn segment detekovan jako bez uzitecne informace
(obsahuje
pouze sum a ne rec), tak je spektrum sumu ulozeno (poprpade
vhodnou
metodou pricteno k aktualnmu odhadu sumu).
11. Od vypocteneho spektra hovoroveho signalu odecteme odhad sumu.
Aby ne-
dochazelo k nulovym ci dokonce k zapornym hodnotam u spektralnch
koefi-
cientu, je zavedena podmnka, ze spektraln koeficient po odecten
sumu muze
mt minimalne 1/128 velikosti puvodn hodnoty.
Prklad: Pokud by mel spektraln koeficient na pozici 200 hodnotu 100
a
odhad sumu z minuleho segmentu by byl pro tuto pozici 300, po
odecten
vznikne zaporna hodnota, coz je osetreno a na danou pozici je
ulozena hod-
nota 100/128.
12. Vypocet inverzn Fourierovi transformace. Jedna se upravenou
funkci fft
(v 9.bode), ve ktere je zmeneno znamenko u twidle faktoru, a
odstraneno
delen 2 v jednotlivych sekc (u puvodn fft je to osetren proti
pretecen
promennych).
13. Protoze v 8.bode nen pouzita in-place metoda, je nutne
prekoprovat data do
intern pameti prslusneho kanalu.
14. Do promenne lastStateN L je ulozeno, jak byl segment detekovan,
to je nutne
pro detektor VAD u rozhodovan pro prst segment.
15. V nasledujcm bode se opakuje cely vypocet od bodu 7 az 14 pro
pravy kanal.
16. Zkoprovan dat do vystupn pameti (popis funkce viz 2.2.4.
17. Promenna Result se nastav do 1, a tm padem mohou byt v
udalosti
31
Codec OnFullRxBuf poslany vystupn data do kodeku.
18. Nekonecne smycka, navrat na zacatek zpracovan (bod 4) a cekan
na nacten
dalsho segmentu.
Vyvojovy diagram popisuje podprogram Codec OnFullRxBuf, ktery se
vola v pre-
rusen jak bylo zmneno vyse (viz 2.1).
1. Je nacten jeden vzorek z kodeku, strdave jsou nactany 16bitova
slova pro
levy a pro pravy kanal.
2. Je inkrementovan ukazatele vstupn kruhove pameti pWRITE a ctac
prijatych
vzorku.
3. Je implementovana aritmetika modulo kruhove pameti.
4. Pokud je navzorkovano dostatecny pocet dat v nasem prpade 1024
pro prvnm,
pro druhe je to uz NUM SAMPLES-2*OVERLAP SIZE to je zabezpeceno dky
pod-
mnce v 5.bode
5. Nastaven, aby prste bylo vyvolano koprovan (splnena 4.podmnka)
po prijet
NUM SAMPLES-2*OVERLAP SIZE, pokud se do counter uloz hodnota
presahu
(vzorky jsou pro levy a pravy, takze dvojnasobna hodnota), tak
podmnka
4. bude splnena za prave 512 vzorku.
6. Pokud by se promenna inprog rovnala 1 znamenalo by to, ze v
hlavnm pro-
gramu prave probha vypocet, a ze CPU nestacilo vypoctat hodnoty
vcas, a
uzivatel je informovan o chybe.
7. Nastav se prznak pro spusten vypoctu v hlavnm programu main,
ktery se
zacne vykonavat po navratu programu z prerusen.
8. Pokud uz jsou nejake data ve vystupn vyrovnavac pameti, tak se
spust
prekoprovan.
2.2.3 Funkce readFromCodec
Prekopruje vzorky ze vstupn pameti pFromCodec do pamet pro vypocet
pCompR
a pCompL tak, ze vyctan z pameti pFromCodec je vzdy posunuto o
velikost presahu.
Vyvojovy diagram znazornujc algoritmus pro cten vstupn vzorku jsou
na
obr. 4.8 a 4.9.
1. Cyklus ktery prekopruje NUM COMPT-OVERLAP SIZE vzorku ze vstupn
pameti
do pameti urcene pro vypocet pCompR a pCompL, je dulezite v celem
programu
32
dodrzovat stejne porad v jakem porad je zapisovano a vyctany vzorky
pro
pravy a levy kanal.
2. Prekoprovan vzorku ze vstupn pameti pFromCodec do pameti pCompR
(data
v pCompR jsou v komplexnm tvaru, proto dvojnasobna adresa pro
realnou
cast), a zvetsen ukazatele.
3. V tomto podprogramu dochaz k vynasoben vzorku s odpovdajc pozic
pole
Hammingova okna.
4. Kontrola pretecen kruhove pameti, pokud by byla splnena podmnka
zname-
nalo byto, ze doslo k podtecen, tudz ze kodek nedodava data.
5. Zkoprovan vstupu i do pCompL.
6. Vahovan vzorku.
7. Pouzit logiky kruhove pameti.
8. Kontrola podtecen kruhove pameti.
9. Ulozen aktualn hodnoty pREAD, do pomocne promenne pREAD, aby
bylo mozne
v prstm segmentu adresovat presah od promenne pREAD.
10. Cyklus pro adresaci druheho presahu v segmentu.
11. Do pameti pFromCodec jsou zkoprovany vzorky z pamet pCompR/L s
indexac
na druhy segment.
2.2.4 Funkce sendToCodec
Prekopruje segmenty z pamet pCompR a pCompL do vystupn kruhove
pameti pToCodec
s tm, ze pricte presah segmentu. Vyvojovy diagram vidme na obr. 4.5
az 4.7
1. Cyklus, ktery provad pricten presahu segmentu.
2. K presahu z poslednho segmentu se pricte presah z aktualnho
segmentu.
Jelikoz je vypocet dvoukanalovy (stereo), je nutne data pro pravy a
levy kanal
prokladat.
3. Implementace modulo aritmetiky, pro kruhovou pamet’.
4. Pokud je v tomto bode splnena podmnka pREAD2 = pWRITE2, doslo k
pretecen
a je vyvolan chybovy stav.
5. Vzorky v segmentu, ktere jsou mezi presahy (prvn presah v
segmentu je
pricten k vysledku predchozho segmentu, a dals presah v segmentu je
adre-
sovan pomoc pomocne promenne) jsou prekoprovany na vystup. V
nasem
prpade kdy je presah 50% je tento cyklus vynechan, protoze nejsou
zadne
data mezi presahy.
6. Prekoprovan vzorku pro levy a pravy kanal, s tm ze u pamet
pCompR/L je
nutne adresovat od konce prvnho presahu.
7. Implementace modulo aritmetiky, pro kruhovou pamet’.
33
8. Pokud je v tomto bode splnena podmnka pREAD2 = pWRITE2, doslo k
pretecen
a je vyvolan chybovy stav.
9. Pro adresovan je pouzita pomocna promenna pom, aby bylo mozne
adresovat
u prstho segmentu presah od aktualn pozice pWRITE2.
10. Cyklus pro prekoprovan dat v posledn casti segmentu.
11. Prekoprovana vzorku do vystupn v pameti, s tm ze mus byt
spravne index-
ovane vyctan z pamet pCompR/L
12. Implementace modulo aritmetiky, pro kruhovou pamet’.
13. Pokud je v tomto bode splnena podmnka pREAD2 = pWRITE2, doslo k
pretecen
a je vyvolan chybovy stav
2.2.5 Funkce VAD
Urc zda-li segment obsahuje rec, pomoc prahovan energie viz.
1.3.
Algoritmus funkce je popsan na vyvojovem diagramu, ktery je na obr.
4.10.
1. Vstupn promenne funkce jsou v porad: Vstupn vektor (segment),
prahova
energie, promenna obsahujc predchoz vysledek detekce segmentu,
promenna
pro aktualn vysledek detekce segmentu.
2. Prprava pro vypocet sumy energie.
3. Vypocet sumy kvadratu energie segmentu. Kvadrat je pouzit, aby
hodnoty
byly vzdy kladne, ale je nutne resit pretekan pri sctan.
4. Uplatnen hystereze pri rozhodovan jestli segment obsahuje rec.
Pokud byl
minuly segment detekovan jako rec, je prah pro urcen aktualnho
segmentu
jiny, nez by byl pokud by byl minuly segment sum. Tm je
zabezpeceno, aby
pri spatne detekovanem segmentu, nebo u neznelych hlasek (ktere maj
nizs
energii) se vznikla chyba nesrila do vce segmentu. FS a FN jsou
predem nas-
tavene prahy (empiricky zvolene).
5. Pokud byl segment detekovan jako recovy, je aktualizovana
prahova energie
(je dulezite prahovou energii aktualizovat i pri reci, protoze
energie reci se
men) a ulozen vysledek detekce do promenne stateN
6. Pokud byl segment detekovan jako sumovy, je aktualizovana
prahova energie
a ulozen vysledek detekce do promenne stateN.
34
3 ZAVER
V diplomove praci sem se zameril na popsan vlastnost DSC 56858 a
kodeku CS4812
(jake je jejich nastaven a jak probha komunikace mezi nimi), pak
jsem se zameril
na spektraln odectan (vlastnosti a zpusob implementace). Bylo
zapotreb zvolit
metodu detekce reci (vybrana metoda prahovan energie), urcit
velikost segmentu
a presahu (velikost segmentu jsem zvolil 512 vzorku a presah 50%) a
zvolit metodu
ukladan dat (na vstupu a vystupu DSC je kruhova vyrovnavac pamet’,
a samostatne
pameti pro vypocet kazdeho kanalu). Pri realizaci programu byl
nejvets problem od-
laden spravneho nacten segmentu (vzhledem k tomu, ze se pracuje s
daty v realnem
case, bylo obtzne zjistit, v ktere casti kodu je prpadna chyba) a
zprovoznen vypoctu
FFT ( problemy s volanm funkc napsanych v assebmleru bit rev a
fft).
35
LITERATURA
[1] JAN, J. Cslicova filtrace, analyza a restaurace signalu
Brno:VUT, 2002. 472 s
ISBN 80-214-1558-4.
case. Praha: CVUT, 2004. 170 s ISBN 80-01-03114-4.
[3] Cirrus Logic. CS4218 16-Bit Stereo Audio CodecDatasheet.
1996.
[4] Freescale. DSP56800E 16-Bit DSP Core Reference ManualDatasheet.
Rev.
2.16. 2005.
[5] National Semiconductor LM4850 Mono 1.5 W / Stereo 300 mW Power
Ampli-
fierDatasheet.
13.11. 2007.
[7] Freescale. 56858 Evaluation Module User ManualDatasheet. Rev.
3. 2005.
[8] MSPR Signalove procesory [online]. 2009. Dostupne z URL:
37
ne
subtractNoise(pComp_pom,noiseL)
saveNoise(pComp_pom,noiseL)
ifft(NUM_COMPT,pComp_pom,SECTION_FFT,sincos_tab);
sendToCodec();
1
stateN==NOISE
A B
Je opakován bod 7 a 14. Jen s tím, e jsou pouity promnné pCompR,
noiseR, actulStateN_R a stateN_R (tudí pro pravý kanál)
10
11
13
15
12
14
16
ano
38
ne
pWRITE >=FIFO_SIZE
pWrite=0
39
Konec
result==1
40
i=0..OVERLAP_SIZE
pToCodec[pWRITE2]=pToCodec[pWRITE2]+pCompR[2*i] pWRITE2=pWRITE2+1
pToCodec[pWRITE2]=pToCodec[pWRITE2]+pCompL[2*i]
pWRITE2=pWRITE2+1
pWRITE2 >=FIFO_SIZE
pWRITE2=0
i=0..NUM_COMPT-2*OVERLAP_SIZE
pToCodec[pWRITE2]=pCompR[OVERLAP_SIZE*2+i*2] pWRITE2=pWRITE2+1
pToCodec[pWRITE2]=pCompL[OVERLAP_SIZE*2+i*2]
pWRITE2=pWRITE2+1
C
41
9
E
i=0..OVERLAP_SIZE
pToCodec[pom]=pCompR[2*NUM_COMPT-2*OVERLAP_SIZE+2*i] pom=pom+1
pToCodec[pom]=pCompL[2*NUM_COMPT-2*OVERLAP_SIZE+2*i]
pom=pom+1
pom >=FIFO_SIZE
pom=0
42
I
Konec
43
H
pREAD >=FIFO_SIZE
pREAD=0
windowing(&pCompR[2*i],i)
windowing(&pCompL[2*i],i)
5
6
7
3
44
I
i=0..OVERLAP_SIZE
pCompR[2*NUM_COMPT-2*OVERLAP_SIZE+2*i]=pFromCodec[pom] pom=pom+1
pCompL[2*NUM_COMPT-2*OVERLAP_SIZE+2*i]=pFromCodec[pom]
pom=pom+1
pom >=FIFO_SIZE
pom=0
45
ne
ano
VAD()
E=0
En=H_2*(*En)+(1-H_2)*(*E) *stateN=NOISE;
Konec
2
3
4
6
7
5
46
Úvod
Inicializace ESSI
tení a zápis dat z kodeku
Detekce ei
Rychlá Fourierova transformace
Kruhová vyrovnávací pam