• Nenhum resultado encontrado

5.5 Algoritmo de Detecção de Cicloestacionaridade: sr_search

5.5.3 Estimador de Magnitude ao Quadrado/Normal: mag_est/abs_calc

No algoritmo empregado utiliza-se a magnitude de cada um dos bins da FFT para avaliar a energia presente neles, tal valor é obtido através da operação √︁(𝑎2+ 𝑏2) ou 𝑎2+ 𝑏2, sendo “a” e “b” as partes real e imaginária de cada bin da FFT, respectivamente.

Conforme observado anteriormente o uso da expressão 𝑎2 + 𝑏2, ao invés da √︁(𝑎2+ 𝑏2),

possui a vantagem de apresentar picos mais protuberantes em relação à sua redondeza. Por outro lado gera a necessidade de um caminho mais largo nos circuitos à frente, ou a

necessidade de realização de um corte no range de bits obtido para o caso 𝑎2+ 𝑏2.

Note que o resultado de uma das operações é exatamente o quadrado da outra, o que significa que o dobro de bits será utilizado na representação inteira de tal valor, em relação à sua raiz. Tal incremento na largura do sinal além de aumentar a área dos circuitos posicionados à frente deste ainda tende a reduzir a frequência máxima de operação destes circuitos, portanto, uma opção empregada foi a de manter a mesma largura de bits para ambas as situações fixando-as na mesma largura dos bits de entrada, ou seja, a largura necessária para a representação dos valores possíveis de √︁(𝑎2+ 𝑏2). Os sinais abaixo

descrevem a interface utilizada em ambos os blocos desenvolvidos: ∙ Sinais Padrão

∙ clk (1 bit entrada): responsável por prover o clock para o circuito;

∙ enable (1 bit entrada): quando habilitado (nível alto) indica que o circuito deve executar sua operação;

∙ reset_n (1 bit entrada): quando habilitado (nível baixo) leva todo o circuito para um estado conhecido e inicial. O circuito só é capaz de voltar a operar quando este sinal é desabilitado (nível alto);

∙ clear (1 bit entrada): quando habilitado (nível alto) leva o circuito a seu estado inicial. Diferentemente do reset_n tal comportamento é obtido através de lógicas específicas e não diretamente nos registradores;

∙ Entrada de dados no protocolo Ready-Valid

∙ in_data_ready (1 bit saída): quando ativado (nível alto) indica que o circuito está pronto para receber dados de entrada;

∙ in_data_valid (1 bit entrada): quando ativado (nível alto) indica que os sinais

real_in e imag_in possuem dados válidos;

∙ in_data_sof (1 bit entrada): quando ativado (nível alto) indica o início de uma recepção de frame, ou seja, o dado presente no primeiro bin da FFT;

∙ in_data_eof (1 bit entrada): quando ativado (nível alto) indica o final de uma recepção de frame, ou seja, o dado presente no último bin da FFT;

∙ in_data_real (largura configurável entrada): representando um valor in- teiro, ou não, com sinal, indica o valor da parte real do dado de entrada. O circuito é indiferente à posição do ponto neste sinal;

∙ in_data_imag (largura configurável entrada): representando um valor in- teiro, ou não, com sinal, indica o valor da parte imaginária do dado de entrada. O circuito é indiferente à posição do ponto neste sinal;

∙ out_data_ready (1 bit entrada): quando ativado (nível alto) indica que o circuito seguinte está pronto para receber os dados oriundos deste circuito; ∙ out_data_valid (1 bit saída): quando ativado (nível alto) indica que o sinal

out_data possui um valor válido;

∙ in_data_sof (1 bit saída): quando ativado (nível alto) indica o início de uma transmissão de frame, ou seja, o valor de magnitude do primeiro bin da FFT; ∙ in_data_eof (1 bit saída): quando ativado (nível alto) indica o final de uma

transmissão de frame, ou seja, o valor de magnitude do último bin da FFT; ∙ out_data (largura configurável saída): representando um valor inteiro sem

sinal indica o resultado da operação de avaliação de magnitude do sinal de entrada. Além de tais sinais ambos os blocos implementados também possuem o parâmetro “G_DATA_WIDTH” que determina a largura dos bits de entrada e saída de dados. No bloco abs_calc um único parâmetro a mais foi adicionado, “G_DIV_RESULT”, que determina quantos bits menos significativos do dado de saída serão desprezados tomando- se, portanto, os “G_DATA_WIDTH” bits à frente dos bits desprezados.

Em termos de implementação o bloco abs_calc emprega dois passos de cálculo (pipelines), sendo o primeiro responsável pela multiplicação de cada um dos termos por eles próprios e o segundo passo responsável pela soma destes termos e corte do range de bits de interesse. Novamente, assim como no bloco conj_mult, o reaproveitamento de componentes utilizados poderia reduzir o tamanho do circuito implementado, entretanto com prejuízo no desempenho do mesmo.

Os sinais de início e fim de frame são tratados de forma alinhada aos seus res- pectivos dados, de forma a refletir na saída exatamente os mesmos sinais estimulados na entrada. Desta forma, pode-se dizer que o bloco abs_calc difere do conj_mult apenas pela presença destes sinais de início e fim de frame em sua interface.

Por outro lado, o bloco mag_est emprega o algoritmo 𝛼𝑀 𝑎𝑥 + 𝛽𝑀 𝑖𝑛 (FRER- KING, 2013) (LYONS, 2004) para cálculo simplificado de magnitude de um número com- plexo. Neste algoritmo, o maior valor absoluto entre a parte real e a imaginária de um número é multiplicada por uma constante 𝛼 e o menor valor multiplicado por uma cons- tante 𝛽. Tais constantes podem ser obtidas de diversas formas, neste trabalho utilizou-se

𝛼 = 2 · cos(𝜋/8)/(1 + cos(𝜋/8)) e 𝛽 = 2 · sin(𝜋/8)/(1 + cos(𝜋/8)), com precisão máxima

dada por uma constante interna do HDL “C_VAR_MULT” e ajustável em até 32 bits. Embora a resposta obtida em tal algoritmo não tenha correspondência perfeita com o valor de magnitude obtido pelo cálculo com precisão completa (LYONS, 2004), os valores obtidos mostraram-se adequados para as necessidades do detector de cicloestacionaridade implementado.

Na implementação do algoritmo 𝛼𝑀 𝑎𝑥 + 𝛽𝑀 𝑖𝑛, duas etapas de cálculo também foram criadas. Na primeira, o cálculo de valor absoluto de cada um dos termos do valor complexo é calculado. Entretanto, na segunda etapa, as multiplicações pelas constantes e somas são realizadas em paralelo e a equação que corresponde ao valor de saída é aprovei- tada. Novamente, a forma como o circuito foi implementado garante uma operação com grande desempenho de vazão de dados. As multiplicações por constantes são tipicamente otimizadas e tendem a ocupar menos área do que um multiplicador em hardware tradicio- nal, alternativamente (LYONS, 2004) apresenta formas ainda menos custosas, em termos de hardware, de se obter um valor aproximado de magnitude, porém com maior prejuízo na precisão dos resultados.

A verificação destes blocos foi realizada contrastando-se os resultados obtidos do processamento de um conjunto de dados com o mesmo resultado obtido em Octave. Em ambas as situações, o mesmo resultado que o obtido em Octave não era esperado, porém os resultados obtidos em circuito deveriam ser aproximadamente os mesmos obtidos em Octave, o que efetivamente se confirmou.

5.5.4

Memória de Armazenamento de Média: mem_pass

Conforme apresentado na Seção 3.3, a fim de minimizar o impacto do ruído na detecção de cicloestacionaridade, pode-se realizar uma média das magnitude dos bins de saída da FFT através do processamento de vários trechos do sinal de interesse. Entretanto, não é necessário que tal média seja realizada com todos os bins. Conforme observado na Seção 3, que trata do algoritmo, este não é capaz de detectar adequadamente sinais com banda superior à metade da frequência de amostragem utilizada, tornando, portanto, apenas a metade dos bins relevante para a pesquisa de picos. Os sinais a seguir pertencem à interface do bloco implementado:

∙ Sinais Padrão

∙ clk (1 bit entrada): responsável por prover o clock para o circuito;

∙ reset_n (1 bit entrada): quando habilitado (nível baixo) leva todo o circuito para um estado conhecido e inicial. O circuito só é capaz de voltar a operar quando este sinal é desabilitado (nível alto);

∙ clear (1 bit entrada): quando habilitado (nível alto) leva o circuito a seu estado inicial. Diferentemente do reset_n tal comportamento é obtido através de lógicas específicas e não diretamente nos registradores;

∙ Sinais de controle

∙ average_num_in (4 bit entrada): pode assumir os valores 1, 2, 4 ou 8 e representa a quantidade de amostras que deve ser utilizada para se extrair a

média dos resultados do Algoritmo de Detecção de Cicloestacionaridade antes da pesquisa pelo pico. Atualmente, tal variável encontra-se limitada aos valores 1 ou 2;

∙ Entrada de dados no protocolo Ready-Valid

∙ in_data_ready (1 bit saída): quando ativado (nível alto) indica que o circuito está pronto para receber dados de entrada;

∙ in_data_valid (1 bit entrada): quando ativado (nível alto) indica que o sinal

in_data possui dados válidos;

∙ in_data_sof (1 bit entrada): quando ativado (nível alto) indica o início de uma recepção de frame, ou seja, o dado presente no primeiro bin da FFT;

∙ in_data_eof (1 bit entrada): quando ativado (nível alto) indica o final de uma recepção de frame, ou seja, o dado presente no último bin da FFT;

∙ in_data (largura configurável entrada): representando um valor inteiro, ou não, sem sinal, indica o valor de magnitude de cada um dos bins da FFT. O circuito é indiferente à posição do ponto;

∙ Saída de dados no protocolo Ready-Valid

∙ out_data_ready (1 bit entrada): quando ativado (nível alto) indica que o circuito seguinte está pronto para receber os dados oriundos deste circuito; ∙ out_data_valid (1 bit saída): quando ativado (nível alto) indica que o sinal

out_data possui um valor válido;

∙ in_data_sof (1 bit saída): quando ativado (nível alto) indica o início de uma transmissão de frame, ou seja, o valor de magnitude do primeiro bin da FFT; ∙ in_data_eof (1 bit saída): quando ativado (nível alto) indica o final de uma

transmissão de frame, ou seja, o valor de magnitude do último bin da FFT; ∙ out_data (largura configurável saída): representando um valor inteiro, ou

não, sem sinal, resultante da média de average_num_in vezes o processamento de sinais de entrada.

A largura, em bits, dos sinais de entrada e saída são ajustadas através do parâmetro “G_DATA_WIDTH”.

A memória interna utilizada no circuito é do tipo simple dual port RAM, portanto o mesmo modelo comportamental apresentado na Seção 5.4 foi utilizado. Os endereços de escrita e leitura, assim como um marcador da quantidade de médias já realizadas são iniciados a cada ativação do reset_n ou clear.

deve ser realizada, o circuito simplesmente repetirá a entrada de dados na saída. Caso contrário, o circuito armazenará os dados recebidos na memória, sendo a posição zero referente ao dado que acompanha o sinal de início de frame (in_data_sof ) e os próximos em ordem crescente até o bin de número 4095. Nas recepções seguintes, o circuito somará os dados presentes na memória com os bins correspondentes recebidos até que a última recepção de dados se inicie. Durante a última recepção de dados o circuito somará os bins recebidos com seus correspondentes armazenados e realizará a divisão de mesmo valor de

average_num_in. Note que, uma vez que os valores possíveis para average_num_in são

múltiplos de 2, tal divisão pode ser implementada apenas como um deslocamento de bits. A fim de garantir que não ocorra overflow nas somas realizadas antes da divi- são, a memória utilizada possui largura de bits configurável por meio da constante interna “C_DATA_WIDTH”, atualmente dada por 𝐶_𝐷𝐴𝑇 𝐴_𝑊 𝐼𝐷𝑇 𝐻 = 𝐺_𝐷𝐴𝑇 𝐴_𝑊 𝐼𝐷𝑇

𝐻 + 1, valor requerido para médias de até 2 amostragens, mesmo valor estabelecido pela

limitação imposta no circuito de topo full_scanner. Uma vez que este circuito, basica- mente, depende do controle interno criado e pouca lógica está presente no mesmo, sua verificação foi realizada com o circuito já posicionado no contexto do sr_search e obser- vando o alinhamento e valores de médias dos dados de entrada e saída deste bloco.

Documentos relacionados