Friday 25 August 2017

Moving Average Scilab


Receptor GPS caseiro Foto acima é o front-end, o primeiro mixer e o amplificador IF de um receptor de GPS experimental. O SMA mais à esquerda está conectado a uma antena comercial com filtro integral LNA e SAW. Um primeiro oscilador local sintetizado conduz o SMA inferior. Os cabeçalhos do pino à direita são entrada de energia e saída IF. O último está conectado a um FPGA Xilinx que não só executa DSP, mas também hospeda um sintetizador de frequência de fração N. Mais sobre isso mais tarde. Fui motivado para projetar este receptor depois de ler o trabalho 1 do Matjax017E Vidmar, S53MV, que desenvolveu um receptor de GPS a partir do zero, usando principalmente componentes discretos, há mais de 20 anos. Seu uso de DSP seguindo um ADC de IF e 1 bit de difícil limitação me interessou. O receptor descrito aqui funciona com o mesmo princípio. Seu ADC de 1 bit é o IC de 6 pinos perto dos cabeçalhos dos pinos, um comparador de saída LVDS. Oculto sob o ruído, mas não obliterado no mush silenciado bi-level que emerge são sinais de todos os satélites em vista. Todos os satélites GPS transmitem na mesma frequência, 1575,42 MHz, utilizando o espectro de propagação de sequência direta (DSSS). O transportador L1 é distribuído em uma largura de banda de 2 MHz e sua força na superfície da Terra é de -130 dBm. O poder de ruído térmico na mesma largura de banda é de -111 dBm, de modo que um sinal de GPS na antena de recepção é de 20 dB abaixo do piso de ruído. Que qualquer um dos sinais presentes, sobrepostos um ao outro e enterrado em ruído, são recuperáveis ​​após a quantia bi-nível parece contra-intuitivo, escrevi uma simulação para me convencer. O GPS baseia-se nas propriedades de correlação das seqüências pseudo-aleatórias chamadas Gold Codes para separar os sinais do ruído e entre si. Todo satélite transmite uma seqüência única. Todos os sinais não correlacionados são o ruído, incluindo os de outros satélites e erros de quantificação de limitadores duros. A mistura com o mesmo código na fase correta difunde o sinal desejado e difunde tudo o resto. A filtragem de banda estreita, em seguida, remove o ruído de banda larga sem afetar o sinal desejado (mais uma vez). Hard-limiting (1-bit ADC) degrada SNR em menos de 3 dB, um preço que vale a pena pagar para evitar hardware AGC. Atualização de maio de 2013 Este é agora um receptor GPS portátil de 12 canais, portátil e com bateria, com software chave na mão, que adquire e rastreia satélites e recalcula continuamente sua posição, sem intervenção do usuário. O sistema completo (abaixo, à esquerda) compreende: display LCD 16x2, computador Raspberry Pi Model A, duas placas de circuito impresso personalizadas, antena de patch comercial e bateria Li-Ion. O consumo total de corrente do sistema é de 0.4A para uma duração de bateria de 5 horas. O Raspberry Pi é alimentado através do cabo de fita que liga seu cabeçalho GPIO à placa Frac7 FPGA e não requer outras conexões. Atualmente, o Pi está executando o Raspbian Linux. Uma distro menor diminuirá o tempo até a primeira correção. Após a inicialização a partir do cartão SD, o software do aplicativo GPS é iniciado automaticamente. À saída, fornece um meio para desligar adequadamente o Pi antes de desligar. O desenvolvimento de software do Pi foi feito sem head-less via SSH e FTP através de um dongle USB Wi-Fi. O código fonte ea documentação podem ser encontradas na parte inferior desta página. Ambos os PCB personalizados são placas de PTH de 2 camadas simples com planos de solo contínuos na parte inferior. Indo no sentido horário em torno do Xilinx Spartan 3 na placa Frac7 FPGA: das 12 horas às 3 horas, o filtro de loop, o VCO, o divisor de potência e o pré-gravador do sintetizador de freqüência de microondas em baixo, são o joystick e o conector JTAG e, às 6 horas, um Cabeçote para o cabo de fita Raspberry Pi. O lado esquerdo é o conector LCD. Perto a esquerda é um oscilador de cristal com controle de tensão compensado por temperatura (TCVCXO) que fornece uma freqüência de referência estável, vital para a recepção de GPS. O TCVCXO é bom, mas não é suficiente para o padrão GPS ao operar sem encaixes em locais ventosos. Soprar sobre ele desloca o oscilador de cristal de 10,000000 MHz em cerca de 1 parte em 10 milhões ou 1 Hz, o que é ampliado 150 vezes pela PLL do sintetizador. Isso é suficiente para desbloquear momentaneamente os loops de rastreamento por satélite, se feito de repente. O dispositivo também é ligeiramente sensível a infravermelhos, e. De lâmpadas halógenas e telecomandos de TV Quando publicado pela primeira vez em 2011, este foi um receptor de quatro canais, o que significa que só pode rastrear quatro satélites simultaneamente. Pelo menos quatro são necessários para resolver a posição do usuário e o viés do relógio do receptor, mas é possível uma maior precisão com mais. Naquela versão original, quatro instâncias idênticas do módulo rastreador preenchiam o FPGA. Mas a maioria dos flops foram registrados apenas uma vez por milissegundo. Agora, uma CPU de núcleo suave personalizada dentro do FPGA serializa o processamento e apenas 50 do tecido FPGA são necessários para um receptor de 8 canais ou 67 para 12 canais. O número de canais é um parâmetro na fonte e pode ir mais alto. A precisão de posicionamento é melhor quando a antena pode ver 360 ° de céu e receber sinais de todas as direções. Geralmente, quanto mais satélites estiverem em vista, melhor. Dois ou mais satélites no mesmo rolamento podem levar ao que é chamado de geometria ruim. A melhor solução até agora foi mais de 1 metro em uma localização muito aberta usando 12 satélites, mas a precisão é tipicamente maismn5 metros em locais mais pobres com menos satélites. Atualização de setembro de 2014 O código-fonte deste projeto foi re-lançado sob a GNU General Public License (GPL). Processamento de arquitetura é dividido entre FPGA e Pi por complexidade e urgência. O Pi lida com levantamentos pesados ​​intensivos em matemática em seu próprio ritmo. O FPGA sintetiza o primeiro oscilador local, presta serviços de eventos de alta prioridade em tempo real e rastreia os satélites de forma autônoma. O Pi controla o FPGA através de uma interface SPI. Convenientemente, o mesmo SPI é usado para carregar o bitstream de configuração FPGA e o código executável binário para a CPU incorporada. O FPGA também pode ser controlado através de um cabo USB JTAG Xilinx Platform a partir de um PC com Windows e detecta automaticamente qual interface está em uso. As freqüências L1 são convertidas em uma primeira IF de 22,6 MHz, misturando com um oscilador local de 1552,82 MHz na placa frontal GPS3. Todo o processamento subseqüente de sinal IF e baseband é feito digitalmente no FPGA. Dois controladores de proporcionalidade integral (PI) por satélite, operador de faixa e fase de código. Os dados NAV transmitidos pelos satélites são coletados na memória FPGA. Isso é carregado para o Pi, que verifica a paridade e extrai as efemérides do fluxo de bits. Quando todos os parâmetros orbitais necessários são coletados, um instantâneo é tirado de certos contadores FPGA internos, a partir do qual o tempo de transmissão é calculado para a precisão de 15ns. Grande parte do sintetizador de 1552,82 MHz é implementado no FPGA. Pode-se esperar problemas de jitter, co-hospedar um detector de fase com outra lógica, mas funciona. A pureza espectral de saída do sintetizador é excelente, mesmo que o núcleo FPGA esteja se afastando furiosamente e nem todos em freqüências harmonicamente relacionadas. Essa abordagem foi tomada porque um quadro semelhante ao Frac7 já existia de um projeto de sintetizador anterior. Adicionar um front-end foi o caminho mais curto para um protótipo de receptor. Mas essa primeira versão não era portátil: tinha requisitos de energia inconvenientes e nenhum padrão de frequência a bordo. Processamento de sinal até e incluindo o limitador rígido: O comparador LMH7220 possui uma tensão de entrada máxima de 9.5mV. O ruído térmico amplificado deve confortavelmente exceder isso para mantê-lo alternando. Os sinais de GPS fracos apenas influenciam o comparador perto de cruzamentos de zero. Eles são amostrados pelo ruído. Para estimar o nível de ruído na entrada do comparador, tabulamos ganhos, perdas de inserção e números de ruído: o ruído na banda na saída do mixer é -1740.828-1.5-3.920- 610log10 (2.5e6) -73 dBm ou 52microV RMS. O misturador é resistivamente encerrado em 50 ohms e os estágios subseqüentemente funcionam com impedância mais alta. A faixa discreta IF possui um ganho de tensão global de 1000, de modo que o nível de entrada do comparador é de 52MV RMS. O LMH7220 adiciona 59 dB de ganho, totalizando 119 dB para todo o IF. A implantação de tanto ganho em uma freqüência foi um risco. Para minimizá-lo, foram utilizados circuitos equilibrados sobre um plano de solo sólido e o par torcido selecionado leva a saída para o FPGA. A motivação foi a simplicidade, evitando uma segunda conversão. Na prática, o circuito é estável, de modo que o jogo foi liquidado. O desacoplador ativo Q1 fornece 5V para o LNA remoto. O amplificador MMIC U2 oferece um ganho de 20 dB (não em IF) e garante uma figura baixa do ruído do sistema, mesmo que sejam utilizados longos cabos de antena. L1 e L2 são bobinados de microondas com freqüência muito auto-ressonante, montados perpendiculares uns aos outros e desobstruídos do plano de terra. Vento 14 voltas, ar-cored, 1mm de diâmetro interno de 7cm de comprimento de 32swg fio de cobre esmaltado. Verificado com o gerador de rastreamento em um Marconi 2383 SA, estes foram bons para 4 GHz. O Mini-Circuits MBA-15L DBM foi escolhido por sua baixa perda de conversão de 6 dB a 1,5 GHz e baixo requisito de unidade de 4 dBm LO. R9 termina a porta IF. Três estágios do amplificador IF totalmente diferenciais seguem o misturador. Os circuitos sintonizados paralelos Low-Q enfiados entre colecionadores definem a largura de banda de -3 dB em torno de 2,5 MHz e evitam a acumulação de deslocamentos DC. L4, L5 e L6 são bobinas Toko 7mm blindadas. O BFS17 foi escolhido por seu alto (mas não muito alto) 1 GHz f T. I e é 2mA para menor ruído e razoável betar e. A primeira IF de 22,6 MHz é convertida digitalmente para 2,6 MHz por sub-amostragem a 10 MHz no FPGA. 2,6 MHz fica perto do centro da banda de Nyquist de 5 MHz. É melhor evitar o centro exato, por razões que serão explicadas mais tarde. Várias outras primeiras freqüências IF são possíveis: 27,5 MHz, que produz inversão de espectro na 2ª IF, também foi testado com sucesso. Há um trade-off entre os problemas de imagem no menor e o BFS17 disponível em maior freqüência. A detecção de sinal implica a resolução de três incógnitas: o que os satélites estão à vista, suas mudanças de Doppler e fases de código. Uma busca seqüencial deste espaço tridimensional a partir do chamado arranque a frio pode levar muitos minutos. Um início quente usando dados de almanaque para prever posições e velocidades ainda requer uma pesquisa de código. Todas as fases de código 1023 devem ser testadas para encontrar o pico de correlação máximo. O cálculo de integrais de correlação 1023 no domínio do tempo é muito caro e redundante. Este receptor GPS usa um algoritmo baseado em FFT que testa todas as fases do código em paralelo. Do frio, leva 2,5 segundos em um Pentium de 1,7 GHz para medir a força do sinal, a mudança de Doppler e a fase do código de todos os satélites visíveis. O Raspberry Pi é um pouco mais lento. Com a over-bar denotando a conjugação, a função de correlação cruzada y (Tau) do sinal complexo s (t) e o código c (t) deslocado pelo offset Tau é: O teorema de correlação afirma que a transformada de Fourier de uma integral de correlação é igual a O produto do conjugado complexo da transformada de Fourier da primeira função e a transformada de Fourier da segunda função: FFT (y) CONJUGATE (FFT (s)) FFT (c) A correlação é realizada na banda base. O código de CA de 1.023 Mbps é 1023 chips ou 1ms de comprimento. O comprimento FFT avançado deve ser um múltiplo disso. A amostragem a 10 MHz por 4 ms resulta em um tamanho de bandeja FFT de 250 Hz. 41 turnos Doppler devem ser testados girando os dados do domínio de freqüência, um compartimento por vez, até plusmn20 caixas maismn5 KHz. A rotação pode ser aplicada a qualquer das funções. O IF IF de 22,6 MHz do ADC de 1 bit é subestimado por um relógio de 10 MHz no FPGA, convertendo-o digitalmente para um 2º IF de 2,6 MHz. No software, o II IF é convertido para baixo em banda base (IQ) complexa usando osciladores locais em quadratura. Para sinais de dois níveis, os misturadores são simples portas XOR. Embora não seja mostrado acima, as amostras são temporariamente armazenadas em memória FPGA. O Pi não pode aceitá-los em 10 Mbps. 1,023 Mbps e 2,6 MHz são gerados por acumuladores de fase de oscilador com controle numérico (NCO). Essas freqüências são bastante amplas em comparação com a taxa de amostragem e não são sub-harmônicas exatas disso. Conseqüentemente, os NCOs têm esporas fracionárias. O número de amostras por chip de código entre 9 e 10. Felizmente, os receptores DSSS são tolerantes a interferências de banda estreita, externas ou auto-geradas. A banda de base complexa é transformada no domínio da freqüência por uma FFT dianteira que só precisa ser computada uma vez. Uma FFT de cada código de CA de satélites é pré-computada. O tempo de processamento é dominado pelo loop interno mais que executa deslocamento, conjugação, multiplicação complexa e uma inversa-FFT por teste satélite-Doppler. O GPU de framboesa Pis Videocore poderia ser alavancado para acelerar as coisas. À taxa de amostragem de 10 MHz, a fase do código é resolvida para os 100ns mais próximos. A saída CCF típica é ilustrada abaixo: o cálculo do pico para o poder médio sobre esses dados fornece uma boa estimativa de SNR e é usado para encontrar os sinais mais fortes. O seguinte foi recebido às 20:14 GMT em 4 de março de 2011, em Cambridge, Reino Unido, com a antena em uma borda externa da janela de norte: de latitudes do norte, mais satélites de GPS geralmente serão encontrados no céu do sul, ou seja, para o equador. Tomar amostras mais longas aumenta SNR, revelando sinais mais fracos, mas o cancelamento ocorre quando a captura abrange as transições de dados NAV. O comprimento FFT avançado é um número inteiro de milissegundos no entanto, a FFT inversa pode ser encurtada, simplesmente jogando dados em compartimentos de freqüência mais alta. O SNR é preservado, mas a fase do código não está tão resolvida. No entanto, uma boa estimativa da posição do pico é obtida pela média ponderada das duas caixas adjacentes mais fortes e os testes fora do ar sugerem que isso poderia funcionar até mesmo para comprimentos FFT inversos bastante curtos. Tendo detectado um sinal, o próximo passo é travar, rastreá-lo e desmodular os dados NAV de 50 pb. Isso requer dois laços de fase bloqueados inter-dependentes (PLLs) para rastrear código e fase de suporte. Esses PLLs devem operar em tempo real e são implementados como funções DSP no FPGA. O software Pi tem um papel de supervisão: decidir quais satélites rastrear, monitorar o status de bloqueio e processar os dados de NAV recebidos. Os laços de rastreamento são bons em manter o bloqueio, porque eles possuem uma largura de banda muito estreita, no entanto, essa mesma característica os torna fracos na aquisição de bloqueio sem ajuda. Eles não podem ver além da largura de banda do loop para capturar qualquer coisa mais longe. As fases e frequências iniciais devem ser predefinidas para a fase do código medido e a mudança Doppler do satélite alvo. Isso é orquestrado sob controle Pi. Os laços devem estar bloqueados desde o início e permanecerem assim. A fase do código é medida em relação à amostra FFT. O código NCO no FPGA é reiniciado no início da amostragem e acumula a fase em um 1.023 MHz fixo. É mais tarde alinhado com o código recebido parando brevemente o acumulador de fase. O deslocamento do Doppler no transportador 1575,42 MHz é maismn5 KHz ou plusmn3 ppm. Também afeta a taxa de código de 1,023 Mbps por másmn3 chips por segundo. O comprimento da pausa é ajustado para o creep do código no tempo desde que a amostra foi retirada. Felizmente, o Doppler de código é proporcional ao Doppler de suporte para o qual temos uma boa estimativa. Software de hardware dividido No diagrama abaixo, codificação de cores mostra como a implementação do DSP de rastreamento agora está dividida entre hardware e software. Anteriormente, tudo isso foi feito em hardware, com instâncias paralelas idênticas repetidas para cada canal, tornando o uso ineficiente de recursos FPGA. Agora, o processamento mais lento de 1 KHz é feito por software e duas vezes mais canais podem ser acomodados na metade do imóvel FPGA. Os seis acumuladores integrados e de despejo (Sigma) são bloqueados em um registro de deslocamento na época do código. Um sinalizador de solicitação de serviço sinaliza a CPU, que lê o bit de dados em série. Com 8 canais ativos, 8 de tempo de CPU são gastos executando a instrução oprdBit. Mas há muito tempo e o serial IO usa tecido FPGA economicamente. Luxos como o registro RSSI e IQ (por exemplo, para gráficos de dispersão) agora podem ser oferecidos. As funções de transferência de filtro de loop F (z) engolir 2 da largura de banda da CPU por canal ativo. Estes são controladores padrão de proporcionalidade integral (PI): a precisão de 64 bits é usada e os coeficientes de ganho KI e KP, embora restritos a potências de 2, são ajustáveis ​​dinamicamente. Cada canal que precisa esperar a sua vez, as atualizações de taxa de NCO podem ser atrasadas por dezenas ou centenas de microssegundos após uma época de código, mas isso introduz um desvio de fase insignificante em freqüências onde a margem de fase é determinada. Traços finos são de 1 bit, representando teoricamente maismn1. O transportador de 2,6 MHz é primeiro desdobrado por mistura com códigos precoce, tardio e pontual. Os produtos de base-base do complexo I e Q do segundo grau de misturadores de portas XOR são somados em mais de 10000 amostras ou 1 ms. Esta filtragem de passagem baixa reduz drasticamente a largura de banda de ruído e, assim, aumenta o SNR. O downsampling para 1 KHz requer caminhos de dados avançados mais amplos no domínio do software. A fase de código é rastreada usando um loop de bloqueio de atraso convencional ou um portão atrasado. O poder nos canais precoce e tardio é calculado usando P I 2 Q 2 que é insensível à fase. Os códigos precoce e tardio são um chip separado, ou seja, frag12 chip de frente e atrás de pontual. Este diagrama ajuda a obter o erro senso correto: A Costas Loop é usado para rastreamento de operadoras e recuperação de dados NAV no canal pontual. Os dados de NAV, m, são retirados do bit de sinal do I-braço com incerteza de fase de 180 °. K é amplitude de sinal recebida e theta é a diferença de fase entre o portador recebido (sem modulação) e o NCO local. K varia de cerca de 400 para os sinais recuperáveis ​​mais fracos até mais de 2000 para os mais fortes. Observe como o termo de erro alimentado de volta ao controlador de fábrica F (z) no Costas Loop é proporcional à potência de sinal recebida ksup2. A inclinação de rastreamento e, portanto, o ganho de loop, também variam com a potência do sinal no loop de código. Abaixo está um gráfico Bode do ganho de loop aberto para o Loop Costas em k500: a largura de banda Costas Loop é de cerca de 20 Hz, o que é ótimo para o rastreamento do operador. A largura de banda do loop de código é de 1 Hz. O poder de ruído em tais largura de banda é pequeno e os loops podem rastrear sinais muito fracos. O kI e o kP acima funcionam para a maioria dos sinais, mas precisam deixar cair um entalhe para o mais forte. Scilab prevê, e as parcelas de dispersão confirmam, o início da instabilidade no kge1500. Os erros de paridade não ocorrem, a menos que as amostras se desviem para a metade oposta do plano IQ. (I) Instabilidade no kge1500 Os anteriores são 2 quadros consecutivos de 5 subtramas cada. As subestruturas são de 300 bits e leva 6 segundos para transmitir. A coluna 1 é o preâmbulo 10001011. Isso aparece no início de cada subtrama, mas pode ocorrer em qualquer lugar nos dados. O contador de 17 bits na coluna 5 é o horário da semana (TOW) e é reiniciado para zero à meia-noite de domingo. O contador de 3 bits na coluna 7 é o subtrama ID 1 a 5. Subframes 4 e 5 são subconfigurados em 25 páginas cada e uma mensagem de dados completa compreendendo 25 quadros completos leva 12,5 minutos para transmitir. Estou usando apenas dados nas subtramas 1, 2 e 3 no presente. Resolvendo para a posição do usuário Todo satélite GPS transmite sua posição e o tempo. Subtrair o tempo enviado do tempo recebido e multiplicar pela velocidade da luz é como um receptor mede distância entre si e os satélites. Ao fazê-lo, três satélites renderiam três equações simultâneas em três incógnitas (posição do usuário: x, y, z) se o tempo exato estava disponível. Na prática, os relógios do receptor não são precisos o suficiente, o tempo exato é um quarto desconhecido, são necessários quatro satélites e quatro equações simultâneas devem ser resolvidas: um método iterativo é usado porque as equações são não-lineares. Usando o centro da terra (0, 0, 0) e o tempo aproximado como ponto de partida, o algoritmo converge em apenas cinco ou seis iterações. A solução é encontrada mesmo se o erro do relógio do usuário for grande. Os satélites carregam relógios atômicos, mas esses também têm erros e os coeficientes de correção no subtrama 1 devem ser aplicados ao tempo de transmissão. Ajustes típicos podem ser centenas de microssegundos. O tempo de transmissão não corrigido é formado por dimensionamento e adição de vários contadores. Tempo de semana (TOW) em segundos desde a meia-noite de domingo é enviado cada subtrama. Bordas de dados marcam intervalos de 20ms dentro de subtramas de 300 bits. O código se repete 20 vezes por bit de dados. O comprimento do código é 1023 chips e a taxa de chip é 1.023 Mbps. Finalmente, os 6 bits mais significativos da fase de NCO do código são anexados, o tempo de transmissão da transmissão para mais de 15ns. As posições dos satélites no tempo de transmissão corrigido são calculadas usando efemérides nas subtramas 2 e 3. A posição orbital em um ponto de referência (tempo de efemérides) é fornecida juntamente com parâmetros que permitem que (x, y, z) sejam calculados até alguns Horas antes ou depois. Ephemerides são atualizados regularmente e os satélites apenas transmitem os seus próprios. As órbitas de longo prazo de toda a constelação podem ser preditas de forma menos precisa usando os dados do Almanac nas subtramas 4 e 5 no entanto, isso não é essencial se uma busca rápida baseada em FFT for usada. As soluções são calculadas em coordenadas centradas na terra, terrestre (ECEF). A localização do usuário é convertida em latitude, longitude e altitude com uma correção para a excentricidade da Terra, que se projeta no equador. Os diagramas de dispersão abaixo ilustram a repetibilidade, o benefício da média e o efeito de escolhas de satélite pobres. Os quadrados da grade são 0.001deg em cada lado. Os pontos azuis marcam 1000 reparos. Os triângulos amarelos marcam os centros de gravidade: (i) saliência de janela virada para o norte (ii) antena no telhado (iii) borda da janela virada para o leste. O agrupamento apertado (ii) foi obtido usando satélites em quatro quartos diferentes do céu. Somente a antena do telhado tinha uma visão clara em todas as direções. Mas as correções boas foram obtidas pela média, mesmo quando a metade do céu estava obscurecida. As correções do telhado também exibem propagação como (i) e (iii) se os satélites errados forem escolhidos. As soluções acima foram geradas sem compensar os atrasos de propagação ionosférica utilizando parâmetros na página 18 do subtrama 4, que deve ser aplicado porque este é um receptor de freqüência única. A refração ionosférica aumenta o comprimento do caminho entre usuários e satélites. Em abril de 2012, reparei um erro que causou erros significativos em soluções de posição de usuário. Originalmente, ao não transformar as posições dos satélites das coordenadas terrestres-centradas (ECEF) para a terra inercial (ECI), ignorei a rotação da Terra durante os 60 a 80 ms que os sinais estavam em vôo. Agora estou vendo as precisões da solução posicional de plusmn 5 metros após a média, mesmo com visibilidade limitada do satélite. Criei um apêndice que mostra como a solução iterativa é desenvolvida, a partir de uma equação de alcance geométrico, que é linearizada usando uma expansão da série Taylor e resolvida por métodos de matriz, para o caso especial de quatro satélites ou o caso geral de mais, com a Opção de usar mínimos quadrados ponderados para controlar a influência de determinados satélites. Você encontrará este e o código-fonte da solução C nos links na parte inferior da página. Agradeço a Dan Doberstein por me enviar um rascunho inicial de seu livro de GPS 2 que me ajudou a entender o algoritmo da solução. A especificação oficial da interface GPS do governo dos EUA 3 é uma referência essencial. Monitor de sinal O arranjo de circuito acima, principalmente implementado em FPGA, se desdobra usando o IF do 1 bit e o código pontual, deixando a modulação de dados de 50 pb. Um pequeno entalhe devido à supressão do operador BPSK só pode ser visto: esses espectros mostram a mesma transmissão de espalhamento em diferentes extensões e largura de banda de resolução (RBW). A mudança de Doppler foi de -1,2 KHz. O piso de ruído é o ruído térmico da antena amplificado e filtrado pela tira IF. A largura de banda de -3 dB exibe cerca de 3 MHz, ligeiramente maior do que o planejado. O transportador espalhado é 5 dB acima do ruído a 30 KHz RBW e 25 dB acima em 300 Hz RBW. A intensidade do sinal recebido na antena pode ser estimada como -174110log10 (30e3) 5 -123 dBm. Ainda me surpreende o quão bem a informação do domínio da frequência é preservada através de um limitante. O transmissor LVDS tem uma corrente de saída constante de 1mW em 100 ohms. O poder máximo observado na SA não pode exceder 0 dBm. Aqui, vemos esta potência disponível espalhada por uma variedade de freqüências. A densidade espectral de potência integrada de banda larga deve ser o primeiro oscilador local. Eu tenho construído sintetizadores experimentais de fração-N usando lógica programável de propósito geral por vários anos: Xilinx Spartan 3 FPGA Frac7 foi construído para este propósito, mas eu não tinha idéia Frac5 seria usado em um GPS Receptor quando eu originalmente o criei. A foto abaixo mostra como a saída VCO ROS-1455 em Frac5 foi dividida de forma resistiva entre a SMA de saída e um pré-escalador Hittite HMC363 divide-por-8. A saída do divisor de 200 MHz é encaminhada (diferencialmente) para o FPGA que a fase o bloqueia para uma referência mestre usando os métodos documentados em meus projetos anteriores. O circuito de microondas no Frac7 é semelhante, mas usa um divisor 3DB Mini-Circuits. Alta estabilidade e baixo ruído de fase são alcançados, como pode ser visto nos espectros de saída de VCO mostrados abaixo. Quando o Frac5 foi originalmente desenvolvido, como um sintetizador de freqüência dedicado, o controle simultâneo de frequências não harmonicamente relacionadas foi evitado para minimizar os estímulos de intermodulação. O FPGA era estático quando os pulsos de relógio que a saída do detector de fase alternada cruzavam o tecido. Nenhum desses luxo é prático quando o FPGA está hospedando um receptor de GPS no entanto, felizmente, a saída do oscilador local é suficientemente boa: os analisadores de espectro Marconi 2383 50 MHz STD OUTPUT foram utilizados como fonte de referência mestre para Frac5 e todos os relógios internos do receptor GPS. Os receptores de GPS precisam de precisão melhor do que 1 ppm (partes por milhão) para medir movimentos doppler Plusmn5 KHz no transportador L1 de 1575,42 MHz. Qualquer incerteza de frequência exigiria um alcance de pesquisa mais amplo. CPU incorporada O meu receptor GPS original só pode rastrear 4 satélites. O tecido disponível não foi usado de forma eficiente e o FPGA estava cheio. A lógica idêntica foi replicada para cada canal e apenas habilitada para clock na época do código de 1 KHz. As taxas de atualização do GPS são bastante inviáveis ​​e a maior parte do processamento paralelo pode ser feito de forma seqüencial. A incorporação de uma CPU para esta tarefa aumentou o número de canais e o espaço livre no FPGA. Esta CPU executa diretamente as primitivas FORTH como instruções nativas. Visitantes da minha marca 1 FORTH A página de computador já estará ciente do meu interesse no idioma. FORTH não é mainstream e seu uso aqui pode ser uma barreira esotérica no entanto, não pude resistir a fazer outra CPU FORTH, desta vez no FPGA, depois de ver o excelente projeto J1, que foi uma inspiração. FORTH é uma linguagem baseada em pilha, o que basicamente significa que a CPU possui pilhas em vez de registros de propósito geral. A Wikipedia tem uma boa visão geral. Recursos de FPGA: 360 fatias 2 BRAMs Execução de instrução de ciclo único Arquitetura de pilha dupla semelhante a FORTH Pilhas de 32 bits e caminhos de dados ALU Operações de dupla precisão de 64 bits Aumento de hardware 2k byte (expansível para 4k bytes) Código e RAM RAM de dados Macro Desenvolvimento do código da montadora Memória e IO Dois BRAMs são usados: um para memória principal, o outro para pilhas. O RAM do bloco Xilinx é dual portado, permitindo que uma instância hospede dados e pilhas de retorno. Cada ponteiro de pilha varia em mais da metade da matriz. A porta dupla da memória principal permite o acesso a dados simultaneamente com a busca de instruções. Uma porta de memória é endereçada pelo contador do programa, o outro por T, o topo da pilha. Os escritos na porta dirigida pelo PC também são usados ​​para download de código, o contador de programas fornece endereços de incremento. Código e dados compartilham a memória principal, que é organizada como 1024 (expandível para 2048) palavras de 16 bits. Os acessos de memória podem ser de 16, 32 ou 64 bits, alinhados com palavras. Todas as instruções são de 16 bits. O código total mais o tamanho de dados do aplicativo GPS é inferior a 750 palavras, apesar de todos os loops serem desenrolados. O IO não é mapeado de memória, ocupando seu próprio espaço de seleção de 36 bits (12 em 12 de 12 eventos). A codificação rápida é usada para simplificar a decodificação selecionada. As operações de IO são várias vezes de série, 16 ou 32 bits paralelas. Dados em série mudam 1 bit por ciclo de relógio. Os eventos são usados ​​principalmente como estroboscópios de hardware e diferem das escritas por não aparecerem a pilha. Formato de instrução 24 instruções de um possível 32 estão atualmente alocadas no espaço do opcode h80XX-h9FXX. Estas são operações de ALU de pilotagem de zero-operandos. A opção ret, que executa o retorno da sub-rotina, é executada em paralelo, no mesmo ciclo. Add-immediate é a única instrução de um-operando. Uma opção de entrega se estende (pilha, implícita) precisão de adição. HF0000 - hFFFF é de reposição. Os caminhos de dados de pilha e ALU são de 32 bits no entanto, são suportadas operações de 16, 32 e 64 bits. Os valores de 64 bits ocupam dois lugares na pilha, com bits menos significativos no topo. O topo da pilha, T e o próximo na pilha, N, são registrados fora do BRAM para eficiência. Além do deslocamento esquerdo de 64 bits (opshl64), que é hard-wired para a execução de um único ciclo, todas as outras funções de dupla precisão são sub-rotinas de software. Idioma de montagem O binário incorporado GPS foi criado usando o MASM do Macro Assembler Microsofts. Isso só suporta mnemônicos x86, mas os códigos opcionais são declarados usando equ e o código é montado usando diretivas dw. MASM não só fornece resolução de rótulo, expansão de macro e avaliação de expressão, mas mesmo estruturas de dados O operador MASM dup () é usado extensivamente para desenrolar loops, e. Dw N dup (opcall dest) chama uma sub-rotina N vezes. Este fragmento dá algum sabor de estilo fonte. O efeito de pilha é comentado em cada linha: opfetch16 e opstore16 são primitivas. Opstore32 e opstore64 são sub-rotinas ou instruções compostas utilizáveis ​​como se fossem primitivas. T é na verdade 15: 0,31: 16 após opswap16. Mas não nos interessamos os 16 bits superiores aqui. Opstore16 deixa a profundidade da pilha de endereços só pode mudar plusmn1 por ciclo. Podem preferir os puristas: dw N addi Interfaces de série do host O FPGA pode ser controlado via SPI pelo Raspberry Pi ou por um PC Windows usando um cabo JTAG USB da plataforma Xilinx. Existem dois níveis de prioridade de solicitação: envie um novo comando e uma pesquisa para a resposta ao anterior. As novas imagens de código são copiadas para a memória principal por meio de um terceiro BRAM que engata a CPU e os domínios do relógio serial. Assim, baixados, as imagens binárias são executadas automaticamente. Os comandos do host são capturados na ponte BRAM e a CPU é sinalizada para a ação deles. Suas respostas são coletadas pelo host da ponte na próxima varredura. As pesquisas de loop principal de nível superior para pedidos de serviço de host. A primeira palavra de qualquer mensagem do host é um código de comando. Os pedidos são despachados através da tabela de salto Comandos: o optor move o vetor para a pilha de retorno. Alguns pedidos do host (por exemplo, CmdGetSamples) provocam respostas longas. As portas de dados no lado da CPU da ponte são de 16 bits. A CPU pode ler e escrever estes através da pilha de dados no entanto, existem caminhos mais diretos para carregar amostras de memória principal e GPS IF. A instrução opwrEvt GETMEMORY transfere uma palavra de memória diretamente para a ponte, usando T como ponteiro de incremento automático. GETMEMORY é o único evento que tem efeito de pilha. A instrução opwrEvt GETSAMPLES transfere 16 bits do amostrador IF: desenrolando loops no tempo de montagem com dup () tropa o tamanho do código para o desempenho, evitando um hit de decremento-teste-branch e todo o binário do aplicativo ainda é pequeno no entanto, loops longos devem ser aninhados , as illustrated above. CHANNEL data structure An array of structures holds state variables and buffered NAV data for the channels. MASM has excellent support for data structures. Field offsets are automatically defined as constants and the sizeof operator is useful. The epoch service routine (labelled Method: ) is called with a pointer to a CHANNEL structure on the stack. Affecting OO-airs, stack-effect comments refer to it as this throughout the routine. A copy is conveniently kept on the return stack for accessing structure members like so: The Chans array is regularly uploaded to the host. Raspberry Pi application software The Raspberry Pi software is multi-tasked using what are variously known as coroutines, continuations, user-mode or light-weight threads. These co-operatively yield control, in round-robin fashion, using the C library setjmplongjmp non-local goto, avoiding the cost of a kernel context-switch: Up to 16 threads can be active:Linear Programming - (as an optimization problem) Matlab is well suited to handle the so called linear programming problems. These are problems in which you have a quantity, depending linearly on several variables, that you want to maximize or minimize subject to several constraints that are expressed as linear inequalities with the same variables. Sometimes the number of variables and the number of constraints are high, or the constraints in the linear inequalities or the expression for the quantity to be optimized may be numerically complicated. We will illustrate the method of linear programming by means of a simple example giving a numerical solution. Matlab has some special functions such as simlp or linprog to tackle down this type of problems, but these built-in functions are not always available since they belong to special toolboxes ( Simulink or Optimization toolboxes). Therefore, we are going to formulate the problem as an optimization issue, and well use the instruction fminsearch , which is an always available instruction. Lets suppose that a merry farmer has 75 roods (4 roods 1 acre) on which to plant two crops: wheat and corn. To produce these crops, it costs the farmer (for seed, water, fertilizer, etc. ) 120 per rood for the wheat, and 210 per rood for the corn. The farmer has 15,000 available for expenses, but after the harvest the farmer must store the crops while awaiting favorable or good market conditions. The farmer has storage space for 4,000 bushels. Each rood yields an average of 110 bushels of wheat or 30 bushels of corn. If the net profit per bushel of wheat (after all the expenses) is 1.30 and for corn is 2.00, how should the merry farmer plant the 75 roods to maximize profit We begin by formulating the linear programming problem mathematically. We express the objective (profit) and the constraints. Let x denote the number of roods allotted to wheat and y the number of roods allotted to corn. Then the expression to be maximized is clearly P (110)(1.3) x (30)(2) y 143 x 60 y There are some constraint inequalities, specified by the limits on expenses, storage and roodage. They are: As we mentioned before, we are going to formulate this as an optimization problem using the fminsearch built-in function. In Matlab, the instruction works as follows: X FMINSEARCH(FUN, X0,OPTIONS) minimizes with the default optimization parameters replaced by values in the structure OPTIONS, created with the OPTIMSET function. FMINSEARCH uses these options: Display, TolX, TolFun, MaxFunEvals, MaxIter, FunValCheck, and OutputFcn. This is one possible approach for our objective function, which is saved as an m-file (in this case OFP. m): function OFValue OFP(x) Here we embed the constraints or inequalities. If the constraints are not met, we penalize the optimization by giving an arbitrary high value to the objective function. if 120 x(1) 210 x(2) gt 15000 . 110 x(1) 30 x(2) gt 4000 . x(1) x(2) gt 75 . x(1) lt 0 . x(2) lt 0 OFValue 10 return end fminsearch tries to minimize the function, so we invert its sign P 143 x(1) 60 x(2) OFValue - P Then, we can call it from another script, which includes the fminsearch function calling the objective function file (in OFP): clear clc format bank We have to start with a seed for the search x 1 10 We can perform the optimization with different number of iterations or tolerances options optimset(MaxFunEvals, 2000, TolX, 1e-2) xopt, FunVal, EF, output fminsearch(OFP, x, options) Finally, we display the profit using the found solution P 143 xopt(1) 60 xopt(2) And the Matlab response is: xopt 21.87 53.12 FunVal -6315.62 EF 1.00 output iterations: 121.00 funcCount: 243.00 algorithm: Nelder-Mead simplex direct search message: 1x196 char This means that the farmer should consider 21.87 roods for wheat, 53.12 roods for corn, and his profit would be 6,315.62. It is important to notice that this is a numerical approximation. which means that if we start with another seed or use other parameters in the options set, we can get to another result. The number found is a possible solution, but theres no guarantee that it is the best one, according to tolerances or to number of iterations or evaluations desired. For example, we can use the seed x 10 10 instead (without moving any other instruction), and the Matlab answer now is: xopt 32.31 14.88 FunVal -5512.50 EF 1.00 output iterations: 75.00 funcCount: 151.00 algorithm: Nelder-Mead simplex direct search message: 1x196 char Now, the best profit found is only 5,512.50. So, it is a good idea to try with several seeds and different parameters in the options set to compare with and select the best solution. Most of the times the solutions will be very close (at least for linear programming problems).

No comments:

Post a Comment