Você está na página 1de 72

Reny Jos Perucchi Sobrinho

IMPLEMENTAO DE ALGORITMO DE REDUO DE


RUDO E ESTUDO DO COPROCESSADOR NEON NO
DISPOSITIVO ZYNQ

Trabalho de Concluso de Curso


submetido ao Programa de graduao
da Universidade Federal de Santa
Catarina para a obteno do ttulo de
Engenheiro Eletricista.
Orientador: Prof. Joceli Mayer, PhD.

Florianpolis
2014

Reny Jos Perucchi Sobrinho

IMPLEMENTAO DE ALGORITMO DE REDUO DE


RUDO E ESTUDO DO COPROCESSADOR NEON NO
DISPOSITIVO ZYNQ

Este Trabalho foi julgado adequado para obteno do Ttulo de


Engenheiro Eletricista, e aprovado em sua forma final pelo Programa de
Graduao em Engenharia Eltrica.
Florianpolis, 19 de Novembro de 2014.
________________________
Prof. Renato Lucas Pacheco, Dr.
Coordenador do Curso
Banca Examinadora:

________________________
Prof. Joceli Mayer, PhD.
Orientador
Universidade Federal de Santa Catarina

________________________
Prof. Eduardo Luiz Ortiz Batista, Dr.
Universidade Federal de Santa Catarina

________________________
Prof. Leonardo Silva Resende, Dr.
Universidade Federal de Santa Catarina

Este trabalho dedicado aos meus


queridos pais.

AGRADECIMENTOS
Aos meus pais pelo apoio incondicional e amizade. Obrigado por
toda dedicao muito importante para minha formao.
Ao Prof. Joceli Mayer, orientador desse trabalho, pela
oportunidade de trabalhar no Laboratrio de Pesquisas em
Processamento Digital de Sinais, LPDS, e o apoio cedido a mim.
minha irm Marih, por estar presente em todos os momentos e
me apoiar quando necessrio.
minha namorada Lgia pelo carinho e por ter vivenciado passo
a passo todos os momentos da minha formao.
Aos meus colegas de trabalho Cristiano, Davi, Eugnio e Ronaldo
pelo apoio fundamental para realizao deste trabalho.

RESUMO
O presente trabalho de concluso de curso aborda o desenvolvimento de
algoritmos de processamento de sinais em um dispositivo Zynq, que faz
uso de uma nova tecnologia SoC. Este um chip que engloba tanto um
processador padro quanto uma lgica programvel FPGA no mesmo
silcio. Na parte de lgica programvel foi desenvolvido e implementado
um algoritmo de reduo de rudo. Na parte do processador foram
desenvolvidos cdigos otimizados em forma vetorial usando o
coprocessador NEON. Primeiro ser explicado o Zynq, em seguida o
algoritmo de reduo de rudo e, por fim, a anlise e desenvolvimento de
algoritmos no NEON. No final os resultados do algoritmo de reduo de
rudo e a otimizao para algoritmos no NEON so apresentados.
Palavras-chave: Zynq. ARM. Reduo de Rudo. NEON.

ABSTRACT
The follow project of completion discusses the development of signal
processing algorithms on a device Zync that makes use of a new
technology SoC. This is a chip comprising both a standard processor and
a programmable logic FPGA on the same silicon. In the programmable
logical part was developed and implemented an algorithm of noise
reduction. On the processor part optimized codes have been developed
in vector form using the NEON coprocessor. First will be explained the
Zynk then the algorithm noise reduction, and finally, analysis and
development of algorithms in NEON. In the end the results of the
algorithm for noise reduction and optimization algorithms are presented
in NEON.
Keywords: Zynq . ARM. Noise Reduction. NEON.

LISTA DE FIGURAS
Figura 1: Modelo bsico do Zynq ......................................................... 28
Figura 2: Localizao dos processadores .............................................. 29
Figura 3: Sistema de processamento ..................................................... 30
Figura 4: APU ....................................................................................... 31
Figura 5: Lgica programvel ............................................................... 33
Figura 6: CLB ....................................................................................... 34
Figura 7: SLICE .................................................................................... 35
Figura 8: DSP ........................................................................................ 36
Figura 9: Modelo de reduo de rudo .................................................. 39
Figura 10: Modelo do algoritmo de reduo de rudo ........................... 42
Figura 11: Janelamento retangular ........................................................ 44
Figura 12: Vazamento espectral no janelamento retangular ................. 44
Figura 13: Janelamento Hamming ........................................................ 45
Figura 14: Overlap-add ......................................................................... 47
Figura 15: VAD externo........................................................................ 54
Figura 16: Mquina de estados principal .............................................. 57
Figura 17: Sinal com rudo de trem, SNR = 15dB ................................ 63
Figura 18: Sinal filtrado ........................................................................ 63
Figura 19: Sinal com rudo Babble, SNR = 10 dB ................................ 64
Figura 20: Sinal filtrado ........................................................................ 64
Figura 21: Sinal com rudo branco, SNR = 5dB ................................... 65
Figura 22: Sinal filtrado ........................................................................ 65
Figura 23: Soma em paralelo com o NEON.......................................... 68

LISTA DE TABELAS
Tabela 1: interfaces externas ................................................................. 32
Tabela 2: Recursos utilizados pelo redutor de rudo ............................. 62

LISTA DE ABREVIATURAS E SIGLAS


VoIP Voice Over Internet Protocol
FPGA Field Programmable Gate Array
SoC System on Chip
IP Internet Protocol
DSP Digital Signal Processor
HDL Hardware Description Language
I/O Input/Output
VAD Voice Activity Decision
RAM Random Acess Memory
PS Processing System
PL Programmable Logic
VHDL VHSIC Hardware Description Language
IEEE Institute of Electrical and Electronic Engineers

SUMRIO
1 INTRODUO ................................................................................ 25
1.1 OBJETIVOS ................................................................................ 26
1.2 METODOLOGIA ........................................................................ 26
2 ZYNQ ................................................................................................ 27
2.1 SISTEMA DE PROCESSAMENTO ........................................... 27
2.2.1 UNIDADE DE PROCESSAMENTO E APLICAES .......... 30
2.2.2 Interfaces externas no sistema de processamento ............ 32
2.3 LGICA PROGRAMVEL ....................................................... 33
2.3.1 Elementos da lgica programvel ...................................... 33
2.4 COMUNICAO ENTRE PL E PS ............................................ 37
3 ALGORITMO DE REDUO DE RUDO.................................. 39
3.1 RUDO ......................................................................................... 40
3.2 AVALIAO PRELIMINAR DE ALGORITMOS.................... 40
3.3 DESCRIO DO ALGORITMO SELECIONADO ................... 42
3.3.1 Transferncia para o domnio da frequncia.................... 42
3.3.2 Filtro de Wiener na domnio da frequncia ...................... 47
3.3.3 Relao sinal rudo Posteriori e a Priori ........................... 50
3.3.4 Detector de atividade de voz e estimativa de rudo .......... 52
3.3.5 Detector de atividade de voz externo ................................. 53
3.4 CONSIDERAES FINAIS ....................................................... 54
3.5 IMPLEMENTAO EM FPGA ................................................. 55
3.5.1 Mquina de estados principal ............................................ 56
3.5.2 IP(Intellectual Property) .................................................... 60
3.5.3 Otimizao ........................................................................... 60
3.5.4 Resultados ............................................................................ 62
4 NEON ................................................................................................ 67
4.1 CONCEITOS BSICOS ............................................................. 67
4.2 FUNCIONAMENTO................................................................... 68
4.3 ANLISE DE CICLOS DO PRODUTO INTERNO ................... 70
5 CONCLUSO .................................................................................. 71
REFERNCIAS .................................................................................. 73
APNDICE A CDIGOS USADOS NO CAPTULO 4 .............. 75

25

1 INTRODUO
O princpio bsico do sistema VoIP [1] (Voice Over Internet
Protocol) baseia-se em realizar conversas usando a internet, ou uma rede
de computadores, desde que seja utilizado o protocolo de internet. Como
uma conversao feita pela internet, preciso primeiro digitalizar a
voz da origem em pacotes que trafeguem pela rede IP, e, quando chegar
ao destino, converter em voz novamente.
Quando uma ligao efetuada de VoIP para VoIP, esse servio
geralmente gratuito, enquanto que uma ligao para rede pblica
taxada. Dessa forma, preciso ter uma central VoIP, onde todo o
processo executado. Este processo consiste em converter o sinal
analgico para digital e vice-versa, detectar e gerar os tons para
realizao de chamada, cancelar o eco gerado pelas ligaes, codificar e
decodificar os pacotes do servio IP, reduzir o rudo, alm de outras
funcionalidades.
O custo para realizao de uma central VoIP pode variar, entre
outros fatores, pela definio do dispositivo que ser usado para o
desenvolvimento dessa central. Quanto maior o nmero de canais
disponveis para realizar ligaes, maior o processamento do
dispositivo, levando em conta que todo o processamento pode ser
realizado em vrios canais simultaneamente.
Os DSPs so dispositivos otimizados para clculos de
processamento digital de sinal, pois possuem funcionalidades bsicas
todas projetadas em hardware. Por possurem tais vantagens, alm do
preo competitivo, so bastante usados para o desenvolvimento de uma
central VoIP. Mas, quando o nmero de canais ampliado, surge a
necessidade de mais DSPs para garantir o processamento correto. Sendo
assim, o custo j no se torna um fator atraente.
O FPGA pode ser definido como um hardware programvel, pois
possui lgica digital que chaveada conforme a especificao do
projeto. Entretanto, no o suficiente para uma aplicao completa,
como uma central telefnica VoIP de vrios canais, onde um sistema
completo deve rodar. H FPGAs que possuem grande volume de lgica,
mas a um custo elevado e so destinados a outras aplicaes.
dentro deste contexto que o dispositivo Zynq avaliado. O
Zynq possui um processador ARM com dois ncleos e um FPGA
integrados no mesmo chip, logo, possvel ampliar o nmero de canais
de uma central VoIP a um custo competitivo.

26

Este trabalho de concluso de curso baseado no estudo do


dispositivo Zynq, bem como na elaborao de algoritmos funcionais em
uma central VoIP.

1.1 OBJETIVOS

Realizar o estudo do dispositivo Zynq para ento realizar o


desenvolvimento de algoritmos;
Implementar na lgica programvel um algoritmo de reduo de
rudo;
Estudar o coprocessador NEON para otimizao de cdigos
essenciais para o funcionamento da central VoIP.

1.2 METODOLOGIA
Este trabalho de concluso de curso foi desenvolvido durante o
perodo de estgio na Intelbras [2]. A documentao fornecida pelo
fornecedor do dispositivo Zynq [3], Xilinx, foi extensivamente utilizada
para elaborao do projeto, bem como a documentao do processador
ARM [4]. A ferramenta de desenvolvimento utilizada foi o Planahead
[5] que integrada para implementao tanto de cdigos para FPGA,
quanto para o processador ARM.
Por questes de segurana, nenhum cdigo com destino
comercial pode ser exposto nesse trabalho.

27

2 ZYNQ
O dispositivo Zynq definido como um SoC(System on Chip) e
foi criado para ser flexvel e formar uma plataforma completa para uma
grande variedade de aplicaes. A caracterstica bsica que o define a
combinao de um sistema de processamento (PS) cuja arquitetura
Dual-Core ARM Cortex-A9 [6] e uma lgica programvel (PL),
equivalente a um FPGA, no mesmo silcio. Apesar de que processadores
dedicados j tenham sido acoplados em FPGA, estes nunca tiveram a
mesma proposta do Zynq. Neste, o ARM Cortex-A9 pode rodar sistemas
operacionais completos tais como o Linux, enquanto que o FPGA
baseado na arquitetura Xilinx 7-Series [7].O sistema ainda possui uma
interface AXI, que proporciona baixa latncia e uma grande largura de
banda para conexo entre as partes. Isso significa que o processador e o
FPGA podem ser utilizados para o que eles fazem de melhor sem a
perda de tempo para realizar a comunicao entre eles (overhead).
A unio de um processador e um FPGA em um nico chip
simplifica o sistema e reduz a rea fsica bem como o custo total do
projeto. A desvantagem est no desenvolvimento do fluxo, j que
necessrio ter conhecimento em linguagens estruturadas e orientadas a
objetos, linguagens de programao de hardware, como VHDL ou
Verilog, trabalhar com sistema Linux, entender os protocolos de
comunicao AXI e em muitos casos, como na otimizao de algoritmos
complexos, saber programar em linguagem assembly da arquitetura
ARM Cortex-A9. O assembly ARM possui dois mdulos, um para
otimizao de algoritmos sequenciais (assembly ARM) e outro para
otimizao de algoritmos vetoriais (assembly ARM-NEON).
O Zynq possui ainda possui vrios perifricos e memrias
integradas, mas seu modelo bsico compreende duas partes principais: O
processador, PS, e a lgica programvel, PL, que se comunicam por
uma interface chamada AXI. A figura 1 representa o modelo bsico do
Zynq.
2.1 SISTEMA DE PROCESSAMENTO
Apesar do Zynq possuir dois elementos fundamentais em um
mesmo chip, o PL e o PS, estes podem ser utilizados de forma
independente. Como ambas as partes so configuradas em domnios
diferentes, o que no est em uso desativado e no h consumo de
energia do mesmo. Entretanto, o uso mais completo do Zynq acontece
quando as duas partes so utilizadas em conjunto e, por isso,

28

importante a anlise da estrutura de ambas as sees e a interface entre


elas.
Figura 1: Modelo bsico do Zynq

Fonte: Reny Perucchi

No que diz respeito estrutura do Zynq, todos os dispositivos da


srie possuem a mesma arquitetura fundamental. Cada um tem como
base do sistema de processamento (PS) um processador ARM CortexA9.
Este processador definido como hard processor, j que um
elemento dedicado e otimizado do dispositivo Zynq. O outro tipo de
processador o soft processor, o qual criado a partir de elementos
lgicos do FPGA. A vantagem do soft processor que este pode ser
flexvel em sua implementao e instanciao. Ou seja, pode ser
instanciado mais de um soft processor no Zynq ou nenhum. Caso seja
utilizado possvel definir opes de otimizao do uso de recursos
lgicos instanciados do FPGA. Uma vez que o soft processor posto
na lgica(PL), o nmero de tarefas do processador ARM reduzido e h
melhora no sistema geral. No caso do Zynq, o soft processor o
MicroBlaze [8]e pode ser empregado em conjunto com o processador
ARM. A figura 2 exibe a localizao do soft processor e hard
processor do dispositivo Zynq.
importante notar que o PS no engloba somente o processador
ARM, mas sim um conjunto de recursos, que tem com base o
processador ARM, e formam a unidade de processamento e aplicaes
(APU) mais alguns perifricos. Estes perifricos so memrias cache,
interfaces de memrias, circuitos de gerao de clock e interconexes. A
figura 3 mostra o PS inteiro, o APU e os outros constituintes.

29

Figura 2: Localizao dos processadores

Fonte: Reny Perucchi

30

Figura 3: Sistema de processamento

Fonte: Reny Perucchi

2.2.1 UNIDADE DE PROCESSAMENTO E APLICAES


O diagrama de blocos simplificado da unidade de processamento
e aplicaes (APU) est esquematizado na Figura 4. O APU tem
essencialmente dois ncleos de processadores ARM, cada um associado
com uma unidade de NEON. O ARM Cortex-A9 pode operar at a
frequncia de 1GHz. O elemento NEON definido como um
coprocessador ARM que particularmente eficiente quando so
executados algoritmos em que os dados esto dispostos na forma
vetorial. J o FPU uma unidade otimizada para clculos de ponto
flutuante. NEON ser explicado na seo 4.
Cada ncleo apresenta ainda uma memria cache de nvel 1 (L1),
que est divida entre L1(D) para dados e L1(I) para instrues. A
memria cache um tipo memria mais rpida e serve para acompanhar
a velocidade do processador, j que o processador espera dados
liberados pela memria para executar suas tarefas. Caso no houvesse a

31

memria cache, o processador seria limitado pela velocidade da


memria RAM, que muito mais lenta que a velocidade do processador.
Este tipo de memria cache L1 possui 32KB, est bem prxima do
processador e serve ento para armazenar dados e instrues
frequentemente utilizados.
Figura 4: APU

Fonte: Reny Perucchi

Um outro bloco que est conectado a cada ncleo a unidade de


gerncia de memria(MMU). Esta unidade responsvel por fazer a
traduo entre memria virtual e endereo fsico. A memria virtual
serve para simular uma maior quantidade de memria fsica. A
fundamentao de memria virtual exige conhecimentos de paginao/
segmentao e Linux, o que foge do escopo deste trabalho, j que
memria virtual no ser utilizada, para uma explicao sobre o assunto,
ver [9], [10].
Os dois ncleos de processamento compartilham uma memria
cache nvel 2 (L2). Este tipo de memria mais lento que o L1, mas
ainda mais rpido que a memria RAM. H 512KB de memria L2
para instrues e dados e ainda h mais 256KB de memria on chip
(OCM) na unidade de processamento APU.
A unidade Snoop Control Unity(SCU) responsvel por criar
uma ponte entre os processadores e as memrias cache L2 e OCM.

32

2.2.2 Interfaces externas no sistema de processamento


H dois tipos de interfaces no dispositivo Zynq, entre PS e PL, e
entre PS e dispositivos externos. Ser tratada aqui a segunda opo.
A comunicao com dispositivos externos feita essencialmente
com via MIO (Multiplexed Input/Output), que fornece 54 pinos de
conectividade flexvel. Algumas conexes podem ser feitas via EMIO
(Extend Multiplexed Input/Output), estas no passam por um caminho
direto do PS para conexes externas, mas em vez disso, passam via PL.
Tanto MIO quanto EMIO esto visveis na figura 2.2.
Os pinos de entrada e sada disponveis incluem algumas
comunicaes j padronizadas e GPIO(General Purpose Input/Output),
estes podem ser usados para acionar Leds, botes ou chaves. A lista
completa de pinos de entrada e sada est na tabela 1 abaixo.
Tabela 1: interfaces externas
Interfaces I/O
SPI

I2C

CAN

UART

GPIO
SD
USB

GigE

Descrio
Serial Peripheral Interface, o padro
para comunicao serial. Utiliza
quatro pinos e funciona com
Master/Slave
Inter-Integrated Cirtuit, barramento
serial com apenas dois pinos e
funciona como multi-master, multislave.
Controller Area Network, barramento
de interface que est em conformidade
com a ISO 118980-1.
Universal Asynchronous Receiver
Transmitter,
comunicao
serial
geralmente usada para conexo a um
computador Host.
General Purpose I/O, pinos para uso
geral, h 4 grupos com 32 bits cada.
Para interfaces com carto SD.
Universal Serial Bus, barramento de
interface que est em conformidade
com USB 2.0.
Ethernet, arquitetura de interconexo
para redes locais.

33

2.3 LGICA PROGRAMVEL


A lgica programvel a segunda parte principal do dispositivo
Zynq e est baseada em Artix-7 ou Kintex-7. O Zynq foi construdo em
diversas opes de recursos para atender variados requisitos de projetos
e aplicaes. O Zynq Z-7010, Z-7015 e Z-7020 so baseados em Artix-7
e possuem um baixo custo e consumo de energia, enquanto que o Z7030, Z-7045 e Z-70100 so baseados em Kintex-7 e so ideais para
aplicaes mais sofisticadas que exigem maior desempenho. A tabela
abaixo mostra, de forma resumida, a diferena de recursos entre a srie7 do Zynq [11].

Registradores
LUT
DSP
Memria

7010
35200
17600
80
60

7015
92400
46200
160
95

7020
106400
53200
220
140

7030
157200
78600
400
265

7045
343200
171900
900
500

70100
437200
218600
900
545

2.3.1 Elementos da lgica programvel


Um segmento do PL est exposto na figura 5, com os blocos
principais denotados por nmeros. A figura uma representao da
lgica programvel realizada pela ferramenta da Xilinx Planahead [5]
Figura 5: Lgica programvel

Fonte: Reny Perucchi

34

O nmero 2, da figura 5, representa o bloco fundamental CLB


(Configurable Logic Block) do FPGA, e est ampliado na figura 6.

Figura 6: CLB

Fonte: Xilinx user guide UG474

Os CLBs so os principais recursos lgicos para a implementao


de circuitos sequenciais e combinacionais. Cada CLB possui dois Slices
e est acoplado na matriz de comutao (Switch Matrix) para ento se
conectar a outros recursos lgicos via interconexes programveis,
como mostra a figura 6.
O segundo elemento principal o Slice, nmero 3 da figura 5,
este uma sub-unidade do CLB e contm 8 registradores, 4 LUTs, 3
multiplexadores e lgica carry. Alm de fornecer funes lgicas e
aritmticas, tambm pode ser utilizado como memria RAM distribuda,
caso seja necessrio. A figura 7 mostra um slice do Zynq a partir da
ferramenta Planahead.
Um dos elementos internos do Slice a LUT (look-up tables).
Este um recurso flexvel e possui seis entradas e duas sadas, ento
cada uma das quatro LUTs do slice pode gerar funes booleanas de at
seis entradas. Alm disso a LUT pode gerar pequenas memrias ROM e
RAM, bem como registradores shiftados.
A lgica carry utilizada para criar os caminhos necessrios para
a propagao dos sinais dentro do PL, alm disso oferece uma forma
rpida de realizar somas e subtraes dentro de um slice.

35

Figura 7: SLICE

Fonte: Reny Perucchi

Alm de fornecer a funo bsica de multiplexador, os trs


MUXs dentro do slice podem realizar uma combinao com a LUT e
fornecerem funes booleanas de sete ou oito entradas em um slice.
O ltimo elemento dentro de um slice o registrador flip-flop,
que tem a funo de manter o valor de um sinal a cada ciclo de clock e
possuem os sinais de controle: clock(CLK), clock enable(CE) e
set/reset(SR). Todos esses controles so comuns aos oito registradores
do slice.
Apesar de que a maioria das funes lgicas so transparentes
para o programador - bastando apenas gerar o cdigo de descrio de
hardware, VHDL ou Verilog -, essencial o conhecimento dos
elementos lgicos para o desenvolvimento de uma aplicao econmica
de recursos e que atinja a frequncia desejada.
Como est indicado na figura 5, h ainda dois elementos na
lgica programvel, a memria RAM, nmero 1, e o DSP (Digital
Signal Processing), nmero 4. Tanto as memrias quanto os DSPs esto
dispostos em colunas na matriz de lgica e esto prximos um do outro,

36

a razo disso que clculos computacionais esto diretamente


relacionados com armazenamento.
Cada bloco de memria RAM consegue armazenar at 36Kb de
dados e pode ser configurado como duas memrias independentes de
18Kb ou como uma nica memria de 36Kb. A vantagem de usar a
RAM dedicada que uma grande quantidade de dados pode ser
armazenada em um pequeno espao fsico com um elemento de
memria otimizado para esta funo. Pode-se tambm usar LUTs como
memria, que o caso da memria distribuda, mas uma grande
quantidade de recursos sero utilizados e a aplicao ter um limite de
frequncia global.
Os FPGAs so eficientes para o processamento de sinal porque
podem implementar algoritmos de forma paralela e bastante
customizados em nvel lgico. Os algoritmos de processamento de sinais
fazem extenso uso da multiplicao, multiplicao com acumulao e
somas. Todas essas operaes podem ser realizadas com os elementos
lgicos LUTs, entretanto, so melhores implementadas com o uso dos
blocos dedicados de DSPs, figura 8.
Figura 8: DSP

Fonte: Xilinx use guide UG479

Pela anlise da figura 8, algumas consideraes podem ser feitas.


H um multiplicador em hardware de 25x18 bits, o que resulta em um
sinal de sada de 43 bits. O sinal de de 25 bits pode ser proveniente de

37

uma pr-soma/subtrao. Aps o registro da multiplicao, esse valor


pode ser acumulado com uma ps-soma/subtrao, e esse bloco de pssoma ainda contm todas as operaes booleanas fundamentais. Na
figura ainda h a indicao de um detector de padro, essa funo serve
para identificar um possvel overflow e ento seguir com o
arredondamento, se for desejado. O valor mximo da multiplicao est
definido em 25x18, mas a multiplicao de valores de qualquer tamanho
pode ser alcanada cascateando as sadas, desde que haja um correto
registro dos blocos para que no haja perda por atraso lgico. A opo
padro de implementao da Xilinx que toda multiplicao instancie o
bloco de DSP, mas possvel, a partir de atribuies no cdigo,
instanciar blocos de DSPs para somas e subtraes simples, se
necessrio.
Os ltimos elementos contidos no PL so os pinos de input/output
de uso geral (IOBs). Estes esto organizados em bancos com 50 pinos
cada um e, conforme o modelo do dispositivo do Zynq, h mais ou
menos bancos de IOBs.
O PL ainda possui um bloco conversor analgico para digital
(ADC), um conjunto de portas JTAG para debug e pode receber at
quatro clocks diferentes do PS.
2.4 COMUNICAO ENTRE PL E PS
Apesar de conter dois elementos, o PS e o PL, em um mesmo
chip, necessrio que a comunicao entre as partes seja otimizada a
fim de se obter um sistema completo e integrado. No Zynq, o que forma
a ponte entre as partes o AXI (Advanced eXtensible Inteface).
O AXI faz parte do protocolo AMBA, que um conjunto de
especificaes para conexes e manuteno de blocos funcionais dentro
do SoC. No caso da comunicao, no SoC, com o FPGA, o padro de
interfaces o AXI, que divido em:

General Purpose AXI Este um barramento de 32 bits e


adequado para taxas de transferncias de dados baixas e mdias. A
interface direta e no inclui buffering (reteno temporria de
dados enquanto eles esto sendo movidos).

High Performance Ports Designado para alta performance entre o


PL e os elementos de memria do PS, pois h um buffering.

38

Cada barramento formado por um conjunto de sinais e


protocolos definidos para correto funcionamento. Por exemplo, se um
bloco de FFT criado em lgica e precisa receber dados do PS, o
usurio precisa realizar a comunicao AXI e respeitar todos os critrios
definidos pela comunicao AMBA.

39

3 ALGORITMO DE REDUO DE RUDO


Na parte de lgica programvel do Zynq, PL, o algoritmo de
reduo de rudo foi realizado. No contexto em que foi inserido, h
vrios outros algoritmos, como o cancelador de eco e o gerador e
detector de tons. Por isso h uma limitao de recursos, como LUTs,
registradores e Slices. Alm dos recursos como uma condio inicial, o
algoritmo de reduo de rudo precisa atingir a frequncia do projeto
completo na parte lgica, 110MHz. A figura 9 mostra o principio bsico
do funcionamento do bloco de reduo de rudo.
Figura 9: Modelo de reduo de rudo

Fonte: Cristiano Costa Neves


As equaes bsicas para a reduo de rudo foram utilizadas da
referncia [12]. Enquanto que o desenvolvimento do algoritmo,
adaptaes das equaes e a realizao para ponto fixo foram baseadas
no relatrio tcnico do engenheiro Cristiano Neves [13].
A linguagem adotada para implementao em lgica programvel
foi o VHDL ou VHSIC Hardware Description Language, onde VHSIC
significa Very High Speed Integrated Circuit. A escolha por VHDL foi
baseada em questes de compatibilidade com o ambiente onde o
algoritmo foi desenvolvido. Esta uma linguagem de descrio de
circuitos digitais ou mistos desenvolvida pelo Departamento de Defesa
dos Estados Unidos da Amrica. A linguagem surgiu pela necessidade
de documentar circuitos digitais independente da tecnologia utilizada.
Aps o uso militar, a linguagem foi padronizada pela IEEE e segue
como uma das principais, junto com o Verilog, linguagens para
descrio de hardware digital. Este trabalho no tem o objetivo de
explicar a linguagem de hardware utilizada, mas sim explicar os
conceitos do algoritmo e a implementao em hardware do mesmo. Um
estudo completo e detalhado pode ser visto na referncia [14].
Uma implementao em MATLAB, para ponto fixo, tambm foi
realizada para fins de testes quantitativos. Ento antes de ser de fato

40

colocado em lgica, o algoritmo foi implementado em VHDL, simulado


a partir de testbench e comparado com a implementao em MATLAB.
Em seguida vrios testes qualitativos foram definidos, como a
capacidade de reduo do rudo em diferentes relaes de sinal/rudo e a
anlise da inteligibilidade do sinal aps passar pelo bloco de reduo de
rudo.
3.1 RUDO
O rudo pode ser definido com um sinal indesejado que interfere
na comunicao ou medio de outro sinal. Estamos rodeados por rudos
em qualquer situao cotidiana, por exemplo, quando um carro passa,
construes na cidade, o vento, pessoas falando em um shopping ou
mercado.
Em telecomunicaes, o rudo um dos principais fatores de
degradao dos sinais de fala e por isso seus efeitos devem ser
reduzidos. Os rudos considerados neste trabalho tm as seguintes
caractersticas:

Aditivo: o sinal degradado (com rudo) considerado como o sinal


limpo (sem rudo) somado com o rudo;
Descorrelacionado com o sinal de voz: no h similaridade entre a
voz e o rudo;
Quase estacionrio (considerando pequenos quadros de voz): no
sofre variaes ao longo do tempo.

Uma outra caracterstica importante a relao sinal/rudo(SNR),


que a razo entre a potncia do sinal de voz e a potncia do sinal rudo.
Quando esse valor alto significa que a potncia do sinal de voz bem
maior que o sinal de rudo, o que indica que o sinal pouco afetado. O
contrrio indica que o sinal est bastante prejudicado, j que a potncia
do rudo prxima do sinal de voz. Neste trabalho sero tratados sinais
de voz com diferentes relaes de SNR, de 0dB a 20dB.
3.2 AVALIAO PRELIMINAR DE ALGORITMOS
Primeiro foi realizada uma busca por algoritmos para reduo de
rudos desconhecidos em sinais de voz que serviriam como base e
referncia para o desenvolvimento. Foi verificada uma enorme
dificuldade na obteno de algoritmos funcionais e comprovadamente

41

eficientes. A maioria dos algoritmos presentes em artigos e livros


fornecem solues incompletas para o problema.
A fim de acelerar o processo de seleo de algoritmos para
reduo de rudo, foram realizadas comparaes de algoritmos
desenvolvidos por Philip Loizou [12]. Os algoritmos considerados esto
nas seguintes categorias:
Subespao: processamento no tempo baseado em lgebra linear para
decomposio do sinal em subespaos diferentes;
Baseados em modelos estatsticos: processamento na frequncia
utilizando estimadores no lineares da magnitude;
Baseados em filtro Wiener: processamento na frequncia onde
ocorre a minimizao do erro entre o sinal de sada e o sinal
desejado atravs da filtragem tima;
Subtrao espectral: processamento na frequncia onde o rudo
estimado subtrado do espectro do sinal em cada faixa de
frequncia.
A anlise dos algoritmos levou em conta aqueles que fornecem
ganho de qualidade com reduo de rudo, mantendo a inteligibilidade
com baixa distoro do sinal. Nenhum algoritmo pode ser considerado o
melhor, para cada avaliao e diferentes sinais de entrada um algoritmo
se mostra com melhor desempenho que outro.
Porm foi possvel identificar um grupo de algoritmos que obteve
melhor desempenho geral que os outros:

Multi-band(MB) da categoria subtrao espectral;


Log-MMSE da categoria de modelos estatsticos;
Wiener-AS da categoria filtro Wiener.

Nenhum algoritmo trouxe melhora na inteligibilidade. Esta no


fortemente afetada pela insero do rudo, logo para sinais ruidosos e
limpos ela a mesma. Mas a inteligibilidade pode ser fortemente afetada
pelos algoritmos de reduo de rudo. Os algoritmos citados que no
afetaram a inteligibilidade foram: MB, Log-MMSE e Wiener-AS.
Para todos os algoritmos quanto menor a relao sinal rudo,
maior a distoro que o algoritmo realiza e mais reduzida fica a
inteligibilidade dos sinais.
Existem outros algoritmos de reduo de rudo, como os que so
baseados em predio linear, filtro de kalman, filtragem adaptativa.
Porm no foram avaliados neste trabalho.

42

Os algoritmos da categoria subespao no obtiveram ganho de


qualidade aceitvel e requerem alto custo computacional. Enquanto que
os algoritmos Wiener-AS e MB foram considerados os melhores em
relao a custo computacional e qualidade. Buscando a menor distoro
do sinal e uma considervel reduo do rudo, o algoritmo escolhido foi
o Wiener-AS. Este foi considerado o melhor para as caractersticas do
projeto e foi implementado no PL do Zynq.
3.3 DESCRIO DO ALGORITMO SELECIONADO
No comeo, o sinal segmentado em quadros no domnio do
tempo, transformado para o domnio da frequncia e sua potncia
espectral calculada. A seguir um algoritmo de deteco de atividade de
voz utilizado, no tempo e na frequncia, para quando houver ausncia
de voz, atualizar a estimativa do rudo. Em seguida realizado o clculo
da relao das potncias espectrais do sinal e rudo para com isso
calcular os parmetros do algoritmo. Ento o rudo reduzido na
frequncia e transformado de volta para o domnio do tempo. A figura
10 mostra esse modelo bsico da reduo de rudo.
Figura 10: Modelo do algoritmo de reduo de rudo

Fonte: Cristiano Costa Neves

Todas essas etapas da figura 10 sero descritas nesse trabalho.


3.3.1 Transferncia para o domnio da frequncia
O algoritmo de Wiener-AS realiza o processamento do domnio
da frequncia, por isso a transformada discreta de Fourier utilizada.
Por uma questo de desempenho o algoritmo usado foi a FFT( Fast

43

Fourier Transform). Esse tipo de transformada utiliza


operaes ao invs de
operaes, sendo que
o nmero de
amostras. Aps o processamentos usado a IFFT(Inverse Fast Fourier
Transform).
O algoritmo FFT complexo e por isso foi usado um IP
(Intelectual Property) fornecido pela Xilinx, a fabricante do Zynq. A
opo de utilizao desse IP foi por questes de desempenho j que os
IPs fornecidos pela Xilinx so amplamente testados e otimizados em
hardware. Ser otimizado em hardware significa a escolha certa de Slices
e LUTs na parte lgica para que o algoritmo em questo no faa uso
excessivo de recursos e garanta a frequncia desejada. Esse IP ento
considerado uma caixa preta no algoritmo de reduo de rudo. Ele
recebe as amostras no tempo e as fornece na frequncia. Informaes
completas sobre a FFT podem ser encontradas em [15].
Pelas caractersticas do projeto e do prprio algoritmo FFT,
necessrio que seja realizada a transformada com um nmero limitado
de amostras. A FFT exige que as amostras sejam em valores da potncia
de 2, por exemplo, 64, 128, 256 amostras. Mas realizar esse
processamento em nmeros limitados de amostras significa multiplicar o
sinal por uma janela retangular para selecionar uma faixa. Essa operao
implica em dois problemas:

Partes do sinal que ficam nas bordas do quadro no sero


integralmente obtidos e no sero apresentados adequadamente na
frequncia, onde componentes podem se espalhar por outras faixas
de frequncia corrompendo o sinal;
Aplicar uma janela retangular no tempo, equivale a fazer uma
convoluo na frequncia com uma funo
, que tambm
corrompe o sinal (vazamento espectral).

A figura 11 mostra um exemplo de vazamento espectral. Uma


janela retangular (Window Function) aplicada em uma senide. Ento
realizada a FFT neste quadro da senide. O esperado seria um impulso
na frequncia da senide, mas se percebe um vazamento espectral e
outras faixas de frequncia so poludas.

44

Figura 11: Janelamento retangular

Fonte: Reny Perucchi

A figura 12 mostra com detalhes esse tipo de vazamento.


Figura 12: Vazamento espectral no janelamento retangular

Fonte: Cristiano Costa Neves

45

Esse tipo de vazamento torna difcil distinguir componentes dos


sinais em faixas prximas, alm de corromper o sinal. Para corrigir este
problema, vrios tipos de janelamento so propostos em [15]. Entre os
propostos, necessrio procurar um que atinja os seguintes requisitos:

Lbulo principal estreito;


Lbulos laterais pequenos;
Taxa de decrescimento rpido para lbulos laterais.

Foi escolhido o janelamento do tipo Hamming, pois cumpre com


os requisitos. A figura 13 mostra a janela Hamming e a resposta em
frequncia, bem como o vazamento espectral reduzido em comparao
com o janelamento retangular. O janelamento Hamming possui a
seguinte equao:
(

(1)

Figura 13: Janelamento Hamming

Fonte: Reny Perucchi

No ambiente em que o algoritmo foi desenvolvido, 80 amostras


esto disponveis a cada 10ms. Levando em conta fatores do projeto,
como o nmero de canais que o algoritmo precisa processar e atrasos
relativos a outros blocos, necessrio que o algoritmo realize o
processamento em 17 mil ciclos a uma frequncia de 110Mhz. Ento o
algoritmo recebe 80 amostras e aplica o janelamento, mas pela figura 13
e a equao 1, percebe-se que o janelamento Hamming possui valores
entre 0 e 1. Logo se faz necessria alguma tcnica de recomposio do
sinal janelado. A tcnica utilizada foi a de overlap-add , a FFT utiliza

46

256 amostras( amostras) e o janelamento possui 160 amostras (N =


159 na equao 1). O esquema segue os seguintes passos:
1. 80 amostras so recebidas pelo algoritmo e somente a primeira
metade do janelamento Hamming aplicado, estas 80 primeiras
amostras janeladas so salvas na mmoria do PL.
2. Novas 80 amostras so recebidas e janeladas com a segunda metade
do janelamento Hamming.
3. Com 160 amostras janeladas, o bloco de 256 amostras para FFT
completado com zeros e o algoritmo faz o processamento na
frequncia.
4. Aps o processamento na frequncia, realizada a IFFT e a sada
possui 160 amostras no tempo disponveis.
5. Dessas 160 amostras processadas, somente as 80 primeiras so
entregues como sada do algoritmo, ao passo que as ltimas 80
amostras processadas so salvas na memria.
6. Antes de receber novas amostras, o algoritmo novamente aplica a
primeira parte do janelamento Hamming nas ltimas 80 amostras
temporais recebidas, como preparao.
7. Ento 80 novas amostras so recebidas e janeladas com a segunda
parte do janelamento Hamming. Assim, h 160 amostras janeladas,
o bloco de 256 amostras novamente completo com zeros e o
processamento na frequncia inicia.
8. As 80 primeiras amostras processadas (sada da IFFT) so somadas
com as 80 ltimas amostras processadas anteriormente(overlap-add)
e entregues como sada do algoritmo. As 80 ltimas amostras
processadas so salvas na memria.
9. Voltar ao passo 6.
Percebe-se o seguinte nesses passos (figura 14):

H um atraso na sada do algoritmo, pois o primeiro processamento


no entrega nada.
As primeiras 80 amostras processadas so suavizadas pelo
janelamento hamming, j que ainda no foi realizado o overlap-add.
A partir do segundo processamento, todas as sadas so entregues
com amplitude muito prximas das reais, mas sem rudo e com um
pequeno ganho de aproximadamente 1.08.

47

Figura 14: Overlap-add

Fonte: Reny Perucchi

3.3.2 Filtro de Wiener na domnio da frequncia


Nesta seo ser desenvolvido o mtodo utilizado para
implementao do algoritmo de reduo de rudo aplicado na parte
lgica do Zynq. O rudo definido neste trabalho considerado aditivo,
ou seja:
(2)
Onde indica o ndice no tempo,
o sinal limpo e
o rudo
definido na seo 3.1. Assim, no domnio da frequncia temos:

(3)

Em que
indica o ndice dos coeficientes de sada da FFT. Ser
definido que uma amostra com a barra superior, por exemplo,
indica um nmero complexo. Esta mesma amostra pode ser utilizada
com seu mdulo
) e ngulo
na forma
.
O erro definido como:

48

(4)

Sendo que
o valor desejado, ou seja, o prprio
valor filtrado pelo algoritmo, que definido como:

(5)

o filtro a ser aplicado para reduzir o rudo.


O filtro Wiener tem o objetivo de minimizar o erro mdio

quadrtico, ou seja, minimizar o valor de


. Onde
o
valor esperado ou esperana. Logo:

(6)

Notar que
a potncia espectral de
, e

a potncia espectral cruzada de


e
.

Ento o erro mdio quadrtico,


, pode ser expresso
como:

(7)

Para minimizar o erro quadrtico mdio, preciso aplicar a derivada


complexa na equao 7 em relao a
e igualar a zero:

Usando o fato que

Resolvendo para

:
(8)

49

Apesar de que
sempre real,
complexo porque

um nmero complexo. A equao 8 o filtro de Wiener no


domnio da frequncia.
O filtro de Wiener pode ser usado em vrias configuraes [12], o
que ir mudar o sinal desejado e a forma de simplificar a equao 8.
Para a aplicao em reduo de rudo, o sinal desejado , na
frequncia, o prprio , que sinal limpo.
Ento necessrio calcular
e , conforme a equao
8.
Clculo de

Mas

e pela equao 3:

Pela suposio de que o sinal limpo e o rudo so descorrelacionados:

Agora o clculo de

(9)

Pela equao 3:

Novamente, como o sinal limpo e o rudo so descorrelacionados:

(10)

Substituindo a equao 9 e 10 na equao 8, o filtro de Wiener para a


reduo de rudo :

50

(11)

3.3.3 Relao sinal rudo Posteriori e a Priori


Dois fatores importantes em algoritmos estatsticos de
processamento de sinais so as relaes de sinal rudo de Posteriori
e a Priori :
Por definio, a relao sinal rudo Posteriori :
(12)
Em que
o mdulo ao quadrado da sada e
a varincia do

rudo. Mas
e pode ser obtido com a mdia do mdulo
ao quadrado de , ou seja,
. Essa mdia ser realizada
quando houver quadros de inatividade de voz, o que ser explicado
adiante com o detector de atividade de voz. Ento a relao Posteriori
pode ser definida como:
(13)
A relao a Priori definida como:

(14)

Logo, o ganho do filtro de Wiener pode ser expresso como:

(15)

Pela analise da equao 11, o filtro de Wiener no causal


porque tanto o numerador quanto o denominador so no negativos e
com simetria par, o que sugere que
seja par e tambm no
negativo. Logo, , que pode ser considerado a resposta ao impulso do
sistema, tambm par, o que sugere que
seja no causal. Ento
preciso fazer uma estimativa de para, de fato, implementar o filtro de
Wiener. A estratgia usada neste trabalho, o mtodo da deciso
direta(decision-directed-method) proposto por [16].

51

Como o valor a Priori pode ser escrito como:


(16)
Mas

, referncia [12], logo:

Assim, o valor de
[

relacionado com
[ ]

por:

[ ]

(17)

Fazendo uma mdia das equaes 16 e 17, com ponderao , se obtm


o equao para :
[

(18)

A equao para estimativa de feita a partir da equao 18 de forma


recursiva, mtodo proposto por [12]:
(19)
O ndice
indica o frame, sendo
o frame atual e (
o
frame anterior. Ento
o valor obtido de uma anlise
passada. Resultados prticos indicam que o melhor valor para 0.98.
O operador
serve para garantir que no ser negativo.
A equao 19 uma mdia ponderada da relao sinal rudo
Posteriori no presente, segundo termo, e da relao sinal rudo a Priori
passado, primeiro termo. Mas:

Ento o estimador final resulta em:


(20)
A equao 19 precisa de um valor inicial, recomendado por[6]:

52

(21)

3.3.4 Detector de atividade de voz e estimativa de rudo


O algoritmo usa como entrada uma estimativa do rudo, que
encontrada com a mdia do mdulo ao quadrado do rudo, equao 13.
Para um bom funcionamento da reduo de rudo necessrio que essa
estimativa seja precisa. H dois mtodos principais para tal estimativa, o
primeiro usa algoritmo de estimao de rudo, e o segundo, a forma mais
simples, com algoritmos de deteco de voz, VAD (voice activity
detection). Os algoritmos de estimativa de rudo so mais complexos e
testes prticos, a partir de implementaes no matlab, no trouxeram
melhoria da reduo. Visando baixo custo computacional, j que h um
nmero reduzido de recursos na parte lgica do Zynq para o algoritmo,
o mtodo adotado foi o de deteco de voz, VAD.
Esse tipo de algoritmo colhe informaes de um quadro do sinal e
compara com um limiar, ento indica se h ou no presena de voz. O
que surge como problema quando a relao sinal rudo muito baixa e
o algoritmo de deteco de voz pode no funcionar corretamente. Para
algoritmos de VAD, ver [17].
Para o algoritmo de reduo de rudo estatstico, como Wiener,
foi adotado o VAD estatstico, este faz uso de informaes das relaes
de sinal rudo Posteriori
e a Priori e usa a seguinte regra para
deciso:

(21)

o nmero de coeficientes da FFT,


o ndice desse
coeficiente,
a hiptese de presena de voz,
a hiptese de
ausncia de voz, foi definido como 0.15 conforme[loizou,hu] e

definido como:
(

(22)

Substituindo a equao 21 na 22:

(23)

53

Ento quando a ausncia de voz for detectada, o rudo dever ser


atualizado pela seguinte regra:
(24)
Conforme [12], , que o fator de atualizao suave, deve ser
configurado para 0.98.
3.3.5 Detector de atividade de voz externo
Quando o algoritmo inicia, necessrio ter uma estimativa inicial
do rudo, conforme a equao 13. Fornecer uma estimativa padro do
rudo ou considerar os primeiros quadros como rudo, fez com que o
algoritmo no funcionasse corretamente. Ento foi utilizado um VAD
externo, que atua no tempo.
Foi constatado, tambm, que o VAD estatstico no funciona
corretamente quando h mudana rpida de rudo, ento o mesmo VAD
externo foi utilizado para atualizao rpida do rudo. Ou seja, quando
h mudana muito rpida de rudo, e o VAD estatstico no detectar
ausncia de voz, mas o VAD externo detectar ausncia de voz, o rudo
atualizado de forma rpida, isso feito com
na equao 24. O
VAD externo simplesmente faz o clculo da energia do sinal do tempo,
com a equao a seguir:

(25)

indica o nmero de amostras do frame atual. Caso a energia seja


menor que um limite pr-estabelecido, indicado ausncia de voz e
ento se inicia o clculo da mdia do rudo, como estimativa inicial para
o algoritmo. O esquema da figura 15 indica o funcionamento do VAD
externo. VAD = 1 indica voz, enquanto que VAD = 0 indica ausncia de
voz.

54
Figura 15: VAD externo
INCIO

Contador = 0
No
VAD = 0
sim

Contador += 1
No
Contador = 12
sim
Mdia
FIM
Fonte: Reny Perucchi

O algoritmo inicia com


e o contador = 0. Ento o
VAD externo faz o clculo da energia do frame e compara com um
limiar, se indicar ausncia de voz,
, e o contador
atualizado. Caso o VAD indique voz,
e contador = 0. Aps 12
frames seguidos que o VAD indica ausncia de voz, a mdia do valor de
calculada e o algoritmo pode ento iniciar.
3.4 CONSIDERAES FINAIS
Algumas consideraes prticas devem ser levadas em conta
sobre o algoritmo de reduo de rudo. Principalmente quando o
algoritmo tem fins comerciais.
Pode acontecer o caso em que feita uma estimativa inicial pelo
VAD externo e haja uma mudana muito rpida de rudo. E, alm disso,
o novo rudo possua uma energia alta a ponto de que o VAD externo no

55

consiga mais indicar ausncia de voz. Caso essa mudana rpida


acontea, o VAD estatstico tambm no ir detectar ausncia de voz.
Ento o rudo no ser atualizado, nem de forma normal, nem de forma
rpida, o que ir atrapalhar o funcionamento correto do algoritmo. Para
resolver isso foi colocada uma proteo que verifica quantos frames o
algoritmo est sem fazer nenhuma das atualizaes. Caso esse limite
seja atingido, o algoritmo se reinicia e, na hiptese do rudo ainda
manter a energia alta, o VAD externo no ir detectar ausncia de voz, o
algoritmo no ir reduzir o rudo, mas o sinal no ser distorcido.
Quando houver 12 frames seguidos de ausncia de voz, o algoritmo
volta o seu processamento.
O clculo de deciso de atividade de voz, no VAD estatstico,
equao 23, envolve
. Um algoritmo de busca em rvore foi
utilizado para esse fim. Como a entrada est limitada superior e
inferiormente, foi criada uma tabela com os resultados dessa operao.
Assim o algoritmo busca de forma eficiente o resultado e contas
excessivas so poupadas, como alguma expanso em sries. Os
resultados foram satisfatrios com esse tipo de busca em rvore.
Para os clculos da relao sinal rudo a Priori e Posteriori os
valores foram limitados entre -15dB e 25dB, o que serviu para evitar
distores no sinal e reduzir a gerao de artefatos sonoros aps a
aplicao do algoritmo(musical-noise).
Em algumas equaes foi possvel simplificar as contas,
pensando em operaes posteriores, para evitar processamento
desnecessrio. Como no caso de elevar ao quadrada uma equao e aps
isso aplicar a raiz quadrada.
Todo o processo no domnio da frequncia foi realizado nos
primeiros (
o nmero de
) coeficientes da FFT, onde
coeficientes da FFT. Isso pode ser feito porque os outros coeficientes,
(
) a , so complexos conjugados dos primeiros.
No fim foi efetuada a raiz quadrada do filtro, sugerido por [12].
Quando a raiz quadrada no aplicada, a reduo de rudo maior, mas
h gerao de artefatos no sinal.
3.5 IMPLEMENTAO EM FPGA
A linguagem padro para implementao do algoritmo de
reduo de rudo no PL foi o VHDL. Em uma primeira implementao,
havia apenas uma mquina de estados, a qual executava todas as contas.

56

Essa metodologia foi descartada pelo grande nmero de DSPs


instanciados. Ento foi desenvolvida uma mquina de estados principal,
que funciona controlando todos os blocos matemticos do algoritmo.
Alguns blocos, como no clculo do logaritmo, possuem sua prpria
mquina de estados que controlada pela mquina principal.
O maior desafio foi o de fazer o algoritmo ser completamente
funcional, ou seja, sem reduo de preciso ou e de canais que atende,
baseado nas especificaes do projeto. Logo, manter essa funcionalidade
e ocupar uma rea pr-definida na parte lgica do Zynq, foi uma das
etapas que mais exigiu tempo e estudo. O algoritmo fez uso extensivo de
memrias disponveis no PL. Utilizou uma memria para a mquina de
estados principal, em que os dados de relao sinal rudo, configuraes
de controle e amostras para overlap-add eram armazenados, pois estes
so dados que precisam ser mantidos de um frame para outro. Outra
memria serviu para guardar as constantes, como a tabela de logaritmo e
o janelamento Hamming. Por fim, utilizou-se uma memria de rascunho
para facilitar as contas extensas e aproveitar o pipeline dos blocos. Esta
memria tambm guarda a sada da FFT e IFFT.
3.5.1 Mquina de estados principal
A viso macro da mquina de estados est representada na figura
16. Esta possui uma estrutura direcionada para otimizao de ciclos e
rea. Os estados definidos na figura 16 no correspondem aos estados
reais do cdigo em VHDL, representam apenas uma viso macro do que
acontece no algoritmo e sero explicados a seguir.

57

Figura 16: Mquina de estados principal


Start = 1

Enable = 1

Enable = 0

Janelamento parte 2
Janelamento parte 1

Vad = 1
Vad = 0

Primeira estimativa = 1

Contador = 12

Contador < 12

Restart = 0

Restart = 1

Fonte: Reny Perucchi

58

A mquina de estados fica em repouso no estado Idle aguardando


o sinal de start. Aps o recebimento deste, o processamento inicia. No
estado Inicializao o algoritmo acessa a memria do canal para
verificar os dados de controle, se deve ser habilitado ou reiniciado. Caso
enable esteja setado em 0, o estado seguinte ser Done e o processo
chegou ao fim. Se enable est setado em 1, o algoritmo analisa se
preciso reiniciar ou no a partir da verificao do sinal restart.
A primeira vez em que executado o algoritmo sempre precisa
ser reiniciado. Quando a reinicializao requisitada, o algoritmo
reinicia todos os dados na memria da mquina de estados principal,
pois so fundamentais para o correto processamento. Estes so: zerar a
potncia mdia rudo, zerar o buffer de overlap-add e zerar o controle
interno do algoritmo (primeiro frame, contador de rudo, atividade de
voz do frame passado). Aps a reinicializao, ou no caso em que no
acontece reinicializao, o estado seguinte Vad externo. Nesse estado
o algoritmo faz o clculo para detectar ausncia ou no de voz.
A seguir o janelamento executado no estado Janelamento parte
1 e 2. O algoritmo acessa a memria de constantes e faz o janelamento
da primeira parte das amostras. Um detalhe importante que a FFT,
nesse algoritmo, por questes de desempenho, faz o clculo em um
buffer de 256(2^8) dados, como explicado anteriormente. Ento aps
receber 80 amostras(primeiro frame) o algoritmo executa a primeira
parte do janelamento e escreve na memria essas 80 amostras janeladas.
Segue ento para o estado Done para aguardar o prximo frame.
Aps a chegada do segundo frame, o algoritmo executa todos os
estados anteriores ao estado Janelamento parte 1 e 2, mas agora realiza
a segunda parte do janelamento. O algoritmo ento possui um buffer
janelado de 160 amostras e os completa com zeros para atingir os 256
dados necessrios para a FFT e o estado seguinte FFT. Aps o clculo
da FFT, o algoritmo verifica se o VAD externo retornou ausncia ou no
de voz. O processo de reduo de rudo precisa de 12 deteces de
ausncia de voz consecutivas para fazer uma estimativa inicial do rudo.
Ento, se o VAD indica voz, a potncia do rudo zerada e o
algoritmo ir para o estado IFFT. A explicao desse estado(IFFT) vir
depois, j que quando o algoritmo atinge esse estado, todo o processo a
seguir igual, independente do estado anterior. Retornando a explicao
anterior, mas agora supondo que o VAD externo detectou ausncia de
voz. Com a deteco de ausncia de voz o algoritmo vai para o estado
Clculo da potncia do rudo e calcula 11 vezes a potncia do rudo a
partir da segunda deteco de ausncia de voz.

59

Aps o clculo da potncia do rudo o algoritmo verifica se o


contador atingiu 12. Se sim, vai para o estado Potncia mdia do rudo,
caso contrrio vai para o estado IFFT. Atingida as 12 contagens, a
mdia do rudo realizada, o sinal de primeira estimativa setado em
nvel lgico 1 e o estado seguinte IFFT. Na prxima vez em que o
clculo da FFT for realizado, o algoritmo j possui uma primeira
estimativa do rudo e, concludo o estado FFT, segue direto para o
estado Clculo da potncia do sinal.
Na sequncia realizada a diviso da potncia do sinal pela
potncia mdia do rudo no estado Relao sinal rudo. Por se tratar de
uma diviso de 58 bits, foram usados 6 blocos em paralelo visando a
otimizao de ciclos. O resultado da diviso escrito na memria e o
loop principal inicia-se no estado Loop principal. Nesse macro estado
realizado todo processamento, inclusive o VAD estatstico e o ganho a
ser aplicado no frame para fornecer o sinal filtrado. Pela anlise do
algoritmo, o clculo do logaritmo necessita apenas do valor de priori,
ento a pesquisa em rvore para clculo do logaritmo foi iniciada em
paralelo com o clculo de outros parmetros, o que resultou em uma
reduo significativa no nmero de ciclos. Aps o loop principal
processar todos os 129 dados, o estado seguinte Atualizao do rudo.
Primeiro analisado se o resultado do VAD estatstico detectou
ausncia de voz. Se sim, uma atualizao do rudo feita com
coeficientes pr determinados. Caso contrrio, verificado se o VAD
externo detectou ausncia nas duas ltimas amostras. Se sim, uma
atualizao rpida do rudo feita. Se nenhuma das duas condies foi
satisfeita, o algoritmo entende que h presena de voz e o rudo no
atualizado.
O prximo estado IFFT. Esse estado consecutivo de vrios
macro estados, como Zerar potncia do rudo, Clculo da potncia do
rudo, Potncia mdia do rudo e Atualizao do rudo. O estado IFFT
atingido quando no h mais nada a fazer, seja com o sinal
filtrado(estado anterior Atualizao do rudo), seja com o sinal sem
passar pelo filtro. Aps o clculo da IFFT, o prximo estado
Janelamento parte 1 e 2. Nessa etapa o algoritmo executa a primeira
parte do janelamento apenas para deixar pronto para a prxima iterao
e segue para o estado overlap-add. Nesse estado feita a soma dos
primeiros 80 dados de sada da IFFT com o buffer destinado ao overlap.
Dessa forma o sinal filtrado ou no reconstrudo e escrito na memria.
O estado seguinte Escrever buffer para overlap. Nesse estado
so escritos na memria do canal os 80 dados seguintes da sada da
IFFT, necessrios para soma do overlap-add na prxima iterao. Os

60

valores a partir de 160 da sada da IFFT so desprezados. O prximo


estado Done e o processamento est concludo. O algoritmo seta em
nvel lgico 1 o sinal de done, retorna para o estado idle e aguarda o
prximo sinal de start.
3.5.2 IP(Intellectual Property)
A Xilinx fornece uma variedade de blocos otimizados em
hardware para uso livre. Aps cada IP ser gerado no projeto, um arquivo
de documentao de cada IP fornecido pela Xilinx. A documentao
de cada IP fornece a descrio completa dos sinais de entrada e sada e o
funcionamento do mesmo.
Para o clculo do ganho foi preciso calcular a raiz quadrada de
um nmero fracionrio. A Xilinx fornece um bloco muito otimizado em
frequncia e ciclos porque faz uso de pipeline em processos todos
registrados.
Multiplicaes que passaram do tamanho mximo de bits de um
bloco dsp foram implementadas em recursos de LUT, o que causa um
gasto desnecessrio de LUTs. A Xilinx possui um IP que calcula
quantos dsp so necessrios para uma determinada multiplicao a partir
do nmero de bits dos operandos e fornece a opo de instanci-los em
pipeline para no prejudicar a frequncia global.
Foram testados vrios algoritmos de FFT para o algoritmo,
nenhum chegou prximo da FFT disponibilizada pela Xinlinx, tanto na
questo de ciclos quanto na questo de rea. A opo de implementar
um bloco para FFT iria consumir um bom tempo e foi descartada visto o
fornecimento de um bloco otimizado. A opo de implementao foi a
de radix 2, porque possui uma quantidade de ciclos satisfatria para o
uso em questo e no utiliza uma quantidade elevada de dsp como o
radix 4.
3.5.3 Otimizao
Para ser compatvel com o sistema adotado, o algoritmo precisa
concluir seu processo em pelo menos16 mil ciclos, atingir a frequncia
mnima de 110 MHz e ter em mdia de 4500 a 4900 LUTs. Em um
primeira implementao, o nmero de ciclos era de 28 mil, a frequncia
190 MHz e mais de 5500 LUTs.
A frequncia cumpria os requisitos enquanto que o nmero de
LUTs e ciclos no. Inicialmente foi usado um IP para diviso de 58 bits,
mas este gerava mais de 400 LUTs e precisava de 30 ciclos. Ento foi

61

implementado um bloco de diviso que gera 100 luts por bloco de 58


bits e precisa de 58 ciclos. Com a paralelizao de 6 blocos o nmero de
LUTs aumentou mas os ciclos foram consideravelmente reduzidos em
relao ao bloco anterior. A frequncia deste novo bloco de diviso
limitou em 145 MHz a frequncia do bloco ANS, mas ainda estava
dentro dos requisitos.
O clculo de logaritmo de 1 + x a partir de busca em rvore foi a
opo mais interessante para esta aplicao, mas mesmo assim consome
muitos ciclos. Na primeira verso, dentro do loop principal, este clculo
era realizado sequencialmente. Mas foi observado que o argumento da
funo logaritmo era o valor de a priori. Este fornecido no incio do
loop, ento o clculo do logaritmo foi paralelizado com os clculos
subsequentes. Houve uma reduo de 4 mil ciclos. Pelo fato de incluir
mais operaes por estado, o nmero de LUTs aumentou um pouco.
O nmero de ciclos ainda precisava ser reduzido, a frequncia
estava dentro do limite e nmeros de LUTs estava alto. O procedimento
a partir dessa etapa foi o de otimizar cada macro estado apresentado na
figura 16. Como exemplo ser analisado o bloco de janelamento. O
janelamento foi inicialmente implementado em 7 estados, pois era
preciso pegar dados da memria, aguardar os dados, registr-los, envilos para o bloco de janelamento, aguardar o processamento de dois
janelamentos e s ento escrever na memria o resultado. Esse processo
foi implementado em sequncia e no utiliza a paralelizao
disponibilizada em desenvolvimentos com FPGA. Com a introduo da
paralelizao o mesmo macro estado precisou de 4 estados. E a cada
dois ciclos dados eram entregues para o bloco.
Esse tipo de paralelizao o que tem de especial em lgicas
programveis. No incio algumas das funes de cada estado desse
macro estado executam lixo, mas depois de um loop completo, ou seja,
o perodo de latncia, o bloco fica completamente funcional. Esta opo
de otimizao reduziu mais da metade dos ciclos antes necessrios.
O mesmo procedimento foi realizado em vrios macro estados at
que o nmero de ciclos fosse atingido. Em alguns casos, como nos
clculos de energia, em que os dados de sada so de 50 bits, esta opo
de otimizao reduziu em um quarto o nmero de ciclos.
Quando se inclui muitas funes em um estado o nmero de
LUTs aumenta. Para reduzir este nmero o procedimento adotado foi o
de analisar os sinais que reduziam a frequncia e registrar o caminho
completo deles para facilitar a ferramenta e economizar LUTs. Quando
este procedimento foi realizado na paralelizao dos 6 blocos de diviso,
houve uma queda significativa no nmero de LUTs.

62

Para completar a reduo no nmero de LUTs, alguns macro


blocos que compartilhavam o mesmo bloco matemtico foram separados
com seus prprios DSPs, como foi o caso do janelamento, VAD e
multiplicaes internas ao loop principal. Quando cada macro estado
possui seus prprios multiplicadores, o nmero de DSPs aumenta, mas o
nmero de LUTs diminui. No final ainda foram detectados alguns
estados dentro do loop principal que poderiam ser concatenados. E a
reduo de um ciclo dentro do loop principal representa a reduo de
129 ciclos dentro do processo todo.
O resultado final do bloco de reduo de rudo, isolado, atingiu
15844 ciclos, frequncia de 125 MHz e est na tabela 2:
Tabela 2: Recursos utilizados pelo redutor de rudo

Utilizao de Lgica

Usado

Disponvel

Utilizao

Registers

8388

106400

7%

LUT

4612

53200

8%

Slice

2324

13300

17%

21

220

9%

DSP48E1

Logo, todos os critrios iniciais foram atingidos.


3.5.4 Resultados
O algoritmo foi extensivamente testado nas seguintes opes:

Testbench: um arquivo de simulao, em VHDL, o qual gera


sinais de clock e l um arquivo de entrada. Com esse modelo
possvel testar o cdigo escrito em VHDL. Rudos de trem,
shopping e rudo branco foram utilizados, bem como a variao
rpida do rudo e a diferena nos valores da relao sinal rudo;
Testes quantitativos: Baseado na implementao feita para o matlab,
o arquivo de sada do testbench comparado com o arquivo do
matlab;
Load-Dump: Um arquivo de entrada salvo na memria do
dispositivo Zynq (Load), processado no prprio FPGA, e
salvo(Dump) em um arquivo de sada.

63

Testes de carga: Um microfone aberto para injetar um sinal na


placa que contem o dispositivo Zynq e possvel escutar a sada. O
algoritmo fica processando por horas.

A seguir, alguns resultados para diferentes nveis de relao sinal


rudo e diferentes tipos de rudo. As figuras derivam do teste de LoadDump.
Figura 17: Sinal com rudo de trem, SNR = 15dB

Fonte: Reny Perucchi

Figura 18: Sinal filtrado

Fonte: Reny Perucchi

64

Figura 19: Sinal com rudo Babble, SNR = 10 dB

Fonte: Reny Perucchi

Figura 20: Sinal filtrado

Fonte: Reny Perucchi

65

Figura 21: Sinal com rudo branco, SNR = 5dB

Fonte: Reny Perucchi

Figura 22: Sinal filtrado

Fonte: Reny Perucchi

66

67

4 NEON
Na parte do sistema de processamento do Zynq, PS, foi realizado
um estudo do NEON, pela necessidade de aprimorar o desempenho de
algoritmos. Como pode ser visto na figura 4 da seo 2, cada ncleo
possui NEON. Este pode ser definido como um coprocessador que faz
parte do processador ARM Cortex-A9, que est em conformidade com a
arquitetura ARM ARMv7 [18].
4.1 CONCEITOS BSICOS
O objetivo bsico do NEON paralelizar operaes, por
exemplo: so necessrias quatro instrues de soma para somar 4 dados
de 32 bits com 4 dados de 32 bits, alm da instruo de saturao. O
NEON, entretanto, necessita de apenas uma instruo para todo esse
processo.
Para conseguir esse tipo de desempenho, o NEON possui
registradores de 128 bits. Assim, aps carregar os dados nos
registradores do NEON, possvel empregar instrues em todos os
dados desse registrador de 128 bits. Por uma questo de desempenho,
tais registradores tem uma visual dual, ou seja, podem ser encarados
como um registrador de 128 bits, denominados registradores Q, ou dois
registradores de 64 bits, registradores D.
Um exemplo simples surge quando necessrio somar quatro
elementos de 32 bits. Para realizar essa tarefa no ARM, as seguintes
instrues so necessrias:
add
add
add
add

r0,
r1,
r2,
r3,

r5
r6
r7
r8

/*
/*
/*
/*

r0
r1
r2
r3

recebe
recebe
recebe
recebe

r0
r1
r2
r3

+
+
+
+

r5
r6
r7
r8

*/
*/
*/
*/

Cada instruo precisa de um ciclo do processador ARM para ser


efetuada. No entanto, a mesma operao realiza no NEON:
vadd.I32 Q0, Q1, Q2 /* Q0 recebe Q1 + Q2 */

Cada registrador, Q1 e Q2, possui 4 elementos de 32 bits, e com


apenas uma instruo o clculo foi realizado. Logo, o NEON precisou
de apenas um ciclo, enquanto que o ARM utilizou quatro ciclos.

68

evidente que nem todos os tipos de funes conseguem ter um


ganho considervel com o NEON, j que ele projetado para clculos
vetoriais. Funes sequenciais so melhores construdas a partir do
conjunto de instrues ARM. A figura 20 mostra o exemplo anterior.
Figura 23: Soma em paralelo com o NEON
Q1

Q2

Q0

Fonte: Neon Programmers guide v1.0


Apesar de ter sido utilizada apenas uma instruo, cada soma
realizada separadamente. A vantagem que cada soma realizada uma
aps a outra, sem intervalos. O resultado que as 4 somas so realizadas
de forma sequencial em apenas um ciclo, o que pode ser considerado
uma soma paralela pelo ponto de vista de ciclos do processador.
4.2 FUNCIONAMENTO
O NEON possui 32 registradores D ou 16 registradores Q. Cada
elemento do registrador, Q ou D, denominado lane. Este pode assumir
valores que variam de 8 bits a 64 bits. No caso de operaes de 8 bits,
possvel ento executar 16 somas em apenas um ciclo. O tamanho de
cada lane definido na prpria instruo.
As instrues do NEON seguem o padro a seguir (dados entre
chaves so opcionais dependendo da instruo):
V{<mod>}<op>{<shape>}{<cond>}{.<dt>}(<dest>}, src1, src2:

mod: modificador, pode assumir 4 tipos. Q para saturar o


resultado, H (half) divide o resultado por 2 e trunca, D duplica o
resultado e satura e por fim R para arredondar.

69

op: operadores, por exemplo, add, mul, sub.


shape: serve para indicar que o resultado ir ser modificado na
quantidade de bits. L (Long) o resultado dobra. N (Narrow) o
nmero de bits da sada a metade da entrada.
cond: indica condio, este um elemento muito importante na
estrutura do cdigo do NEON, pois permite executar instrues sob
condies, o que evita criar mais instrues para controle.
dt: o tipo de dado, I (inteiro), S (signed), U (unsigned).
dest, src1, src2: registrador de destino, operando 1 e operando 2
respectivamente.

Um dos fatores mais importantes, na hora de otimizar ou escrever


um cdigo com o coprocessador NEON, notar que cada instruo
possui uma latncia para deixar o resultado disponvel para uso. Um
exemplo pode ser na instruo VMULL.I32 Q0, Q1, Q2. Essa instruo
executa a multiplicao, de 32 bits em cada lane dos registradores Q1 e
Q2, em 2 ciclos, mas s deixa o registrador Q0 disponvel em cinco
ciclos. Dessa forma, o cdigo ficara otimizado se instrues em outros
registradores forem realizadas antes de novamente utilizar o registrador
Q0. O problema do NEON est exatamente nessa questo, o
gerenciamento dos registradores do coprocessador. Caso se faa uso
incorreto do controle de ciclos das instrues, o NEON pode piorar,
principalmente em cdigos que so executados dentro de loops extensos,
muito o cdigo, ficando o processador preso espera dos resultados.
Para controlar o problema do gerenciamento dos registradores,
porque exige que o programador tenha conhecimento avanado do
NEON, existem as funes intrinsics referencia [19]. Estas usam
instrues aproximadas do NEON, mas deixam o controle dos
registradores a cargo do compilador. Entretanto, testes mostram que o
desempenho do cdigo, em relao programao em linguagem C,
pouco satisfatria. Isso porque o compilador cria instrues
intermedirias. Para um desempenho que de fato relevante,
necessrio estudar o conjunto de instrues e o funcionamento do
coprocessador NEON.
O uso do coprocessador NEON em funes inteiras, ou em
partes, pode fornecer um ganho de at 20 vezes no tempo de execuo.
Isso extremamente importante quando se trata de projetos onde o
tempo de execuo critico, como no caso da telefonia Voip.

70

H ainda bibliotecas que possuem funes bsicas na rea de


processamento digital de sinais. Algumas so de uso livre, ver referncia
[20].
4.3 ANLISE DE CICLOS DO PRODUTO INTERNO
Como foi esclarecido na introduo, por questes de segurana,
nenhum cdigo desenvolvido pode ser exposto. Ento foi desenvolvida
uma funo comum em processamento de sinais, produto interno. Esta
foi realizada em duas verses, a primeira em linguagem C, e a segunda
em assembly para NEON. Para linguagem C, ver referncia [21], para o
conjunto de instrues do coprocessador NEON, ver [19]. As duas
verses do cdigo de produto interno esto no apndice.
A funo foi desenvolvida em dois vetores de 128 amostras com
16 bits cada. A anlise de tempo revelou que o produto interno leva em
mdia 900 ciclos para a programao em C. Enquanto que a mesma
funo, mas realizada com o NEON, utilizou apenas 110 ciclos.
Na programao em C foram executados 128 vezes o loop
principal. J no NEON apenas 8 loops foram executados, pois possvel
utilizar vrios registradores ao mesmo tempo para as operaes de
multiplicao e acumulao do produto interno. Dessa forma, houve um
ganho de aproximadamente 12% em relao ao programa em linguagem
C. Para algoritmos mais complexos esse ganho pode chegar a mais de
60%.

71

5 CONCLUSO
Para o entendimento do funcionamento do dispositivo Zynq, foi
necessrio um estudo da tecnologia SoC, fonercecida pela Xilinx. As
caractersticas foram exploradas a fim de se obter o mximo de
desempenho deste dispositivo. Para esse fim, a documentao e
exemplos fornecidos pela Xilinx e ARM foram de grande valia.
O algoritmo de reduo de rudo, baseado no filtro Wiener-AS,
foi implementado a partir da teoria desenvolvida por [12] e otimizada
por [13]. Uma primeira implementao ficou fora dos requisitos de
projeto, mas aps estudos sobre o funcionamento especfico do FPGA, e
do prprio dispositivo especfico, o algoritmo atingiu todos os critrios.
O algoritmo foi implementado e validado por todos os testes,
qualitativos e quantitativos.
Na parte do sistema de processamento do Zynq, houve a
necessidade de otimizao dos cdigos ali implementados, j que o
tempo limite de projeto no estava sendo cumprido. Uma alternativa
para esse problema foi o estudo com o coprocessador NEON. Este
possibilitou uma otimizao de cdigos, que estivessem em forma
vetorial, de at 60% em alguns casos.
Sugesto para trabalhos futuros:

A sada da FFT so nmeros de 25 bits, e h uma multiplicao


desses valores, gerando sinais de 50 bits. Aps isso, h uma diviso,
para a relao sinal rudo, de 50 bits. Essa diviso consome muitos
recursos lgicos e ciclos, alm de restringir a frequncia. Uma
possibilidade de melhora seria aplicar uma forma de reduo de
preciso nessa diviso para melhorar o desempenho do algoritmo.
Testar equacionamentos distintos para relao sinal rudo e outras
abordagens para estimativa do detector de atividade de voz no
tempo e estatstico.
Realizar uma implementao baseada no ganho do algoritmo,
porque se o ganho muito prximo de 1, no h necessidade de
filtragem e o redutor de rudo pode ganhar desempenho com esse
esquema, j que precisa filtrar vrios canais.

72

73

REFERNCIAS

[1] B. Hartpence, Packet Guide to Voice over IP: A system administrator's


guide to VoIP technologies, Newton: O'Reilly Media, 2013.
[2] http://www.intelbras.com.br/, [Online]. [Acesso em Novembro 2014].
[3] http://www.xilinx.com/, [Online]. [Acesso em Novembro 2014].
[4] http://infocenter.arm.com/help/index.jsp, [Online]. [Acesso em Agosto
2014].
[5] http://www.xilinx.com/tools/planahead.htm, [Online]. [Acesso em
Setembro 2014].
[6] ARM, Corter-A9 MPCore: Technical Reference Manual, 2012.
[7] Xilinx, http://www.xilinx.com/products/silicon-devices/soc/zynq7000.html, [Online]. [Acesso em Novembro 2014].
[8] Xilinx, http://www.xilinx.com/tools/microblaze.htm, [Online]. [Acesso
em Outubro 2014].
[9] M. GORMAN, Virtual Memory Manager, Upper Saddle River, 2004.
[10] C. Louise H., The Zynq Book, 2014.
[11] Xilinx, http://www.xilinx.com/products/silicon-devices/soc/zynq7000/silicon-devices.html, novembro 2014. [Online]. [Acesso em
Setembro 2014].
[12] P. Loizou, Speech Enhancement: Theory and Practice, Westminster: CRC
Press, 2011.
[13] C. P. Costa Neves, Relatrio Tcnico LPDS-Intelbras: Mdulo de reduo
de rudo, 2009.
[14] V. Pedroni, Circuit Design and Simulation with VHDL, Cambridge: The
MIT Press, 2010.
[15] A. Oppenheim e R. Schafer, Discrete-Time Signal Processing, Upper
Saddle River: Prentice Hall, 2009.
[16] Y. Ephraim e D. Malah, Speech enhancement using a minimum meansquare error, IEEE Trans. Acoustics, Speech and Signal, vol. ASSP32, pp.
1109-1121, 1984.
[17] A. Kondoz, Digital Speech: Coding for Low Bit Rate Communication
System, John Wiley & Sons, 2004.
[18] ARM, ARM Architecture Reference Manual: ARMv7-A and ARMv7-R
edition, 2012.
[19] ARM, NEON Programmer's guide v1.0, 2013.
[20] https://www.khronos.org/openmax/, [Online]. [Acesso em novembro
2014].

74

[21] S. Prata, C Primer Plus, Indianapolis: Addison-Wesley Professional, 2013.


[22] GCC Assembly Inline, [Online]. Available:
http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html.

75

APNDICE A Cdigos usados no captulo 4


Funo escrita em linguagem C:
int produto_interno(short *vet1, short *vet2, int
vet_len)
{
int final = 0;
int Var1, Var2;
while(len != 0)
{
vet_len --;
Var1 = vet1[len];
Var2 = vet2[len];
retval += Var1 * Var2;
}
return final;
}

A mesma funo escrita com o conjunto de instrues assemby NEON,


o padro para utilizar o assembly foi o assembly inline GCC, ver [22].
static inline int dot_product_intr_3(short *pSrc1, short
*pSrc2, int *ptrout )
{
asm volatile (
"mov r4, #8\n"//cada loop executa 16 amostras
"vmov.i32 q8, #0\n"
"vmov.i32 q9, #0\n"
"vmov.i32 q10, #0\n"
"vmov.i32 q11, #0\n"
"loop:\n"
//carregar vetores
"vld1.16 {d0,d1,d2,d3}, [%0]!\n"//q0,q1
"vld1.16 {d4,d5,d6,d7}, [%1]!\n"//q2,q3
//multiplicar
"vmull.s16 q4,
"vmull.s16 q5,
"vmull.s16 q6,
"vmull.s16 q7,

4x4
d0,
d1,
d2,
d3,

d4\n"//q4
d5\n"//q5
d6\n"//q6
d7\n"//q7

76

//subtrai e seta flag Z


"subs r4, r4, #1\n"
//acumular em registradores
"vqadd.s32 q8, q8, q4\n"//q8
"vqadd.s32 q9, q9, q5\n"//q9
"vqadd.s32 q10, q10, q6\n"//q10
"vqadd.s32 q11, q11, q7\n"//q11
//configuraoes de loop
"bne loop\n"// b= branch, ne = not equal to 0
//finalizar dot product
"vqadd.s32 q8, q8, q9\n"//q8
"vqadd.s32 q8, q8, q10\n"//q8
"vqadd.s32 q8, q8, q11\n"//q8
//somar em um registrador d
"vqadd.s32 d0, d16, d17\n"//d0
//inverter d0 em d1
"vext.8
d1, d0, d0, #4\n"//d1
//somar d0 e d1
"vqadd.s32 d0, d0, d1\n"//d0
//salvar na memoria
"vst1.s32 d0[0], [%2]\n"//d0
//---:"+r" (pSrc1), "+r"(pSrc2) /* output */
:"r"(ptrout) /* input */
:"q0","q1", "q2", "q3", "q4", "q5", "q6", "q7",
"q8","q9","q10","q11","r4", "memory" /* clobbered
register */
);
return 0;
}