Simular o sistema de transmissão de dados binários em python
Como uma experiência simples, este estudo de caso gera três sinais BPSK em forma SRC embaladas apertadamente. O sinal de interesse está centrado na f
Conteúdo
Verifique o desempenho com espectro de potência, olho, e gráficos de dispersão
Para caracterizar o sinal recebido, ver o espectro de energia na entrada do receptor, a trama olho da parte real da potência do filtro equilibrado, e um gráfico de dispersão do complexo envelope cheio na potência do filtro equilibrado. Tenha em mente que o filtro casado tem resposta ao impulso idêntica à função forma de pulso transmissor.
A trama olho opera a nível da forma de onda, tipicamente observando a saída do filtro combinado através da sobreposição de múltiplos inteiros do intervalo de sinalização (período de bit). O período nesta simulação é Ns = 10 amostras.
Para o lote olho, uma janela 20 com a amostra é utilizado. O sinal suavemente transições entre +/- 1 níveis de acordo com o padrão de bits transmitidos. Quando fatias de onda contíguos são sobrepostas, há um ponto de uma vez por símbolo, onde a forma de onda não está em transição. Este é o lugar onde as decisões símbolo são feitas. Foi um +1 ou -1 enviados? O vazio região de transições aparece como um olho aberto.
O gráfico de dispersão recolhe as saídas complexos do filtro casado uma vez por período de bit (símbolo). Os locais ideais ponto de amostragem constituem o que é conhecido como o constelação de sinais. Os pontos são plotados como pontos, para que possa ver a qualidade dos pontos de amostragem que entram no receptor Símbolo bloco de decisão.
Para BPSK, você pode esperar para ver dois conjuntos de pontos: Um conjunto corresponde às decisões -1 bits e o outro cluster corresponde às decisões +1 bits. Essa é a natureza da constelação de sinal BPSK: Conjuntos nestes graus
Se um erro de fase não é corrigido mais a montante no processamento de sinal do receptor, a constelação vai ser rodado em relação ao eixo real.
espectro de potência, olho, e de dispersão parcelas são mostrados como uma coleção de seis subtramas Pylab.
Aqui está a abreviado comandos IPython:
Dentro [733]: R, b, DATA0 = ssd.BPSK_tx (100000,10,1.5,0, `src`) # 100000 símbolos, ns = 10, df = 1,5 * Rb, 0dB od [734]: R = ssd.cpx_AWGN (r, 100,10) # EsN0 = 100 dB, Ns = 10Em [735]: Pr, F = ssd.psd (r, 2 ** 10, Fs = 10) [737]: Trama (F, 10 * log10 (Pr)) Em [743]: Z = signal.lfilter (b, 1, r) # b é o SRC filterIn [748]: Ssd.eye_plot (real (z [2000: 6000]), 20) # 20 SAMP windIn [750]: Ssd.scatter_plot (z [2000: 6000], 10,0) Em [775]: R, b, DATA0 = ssd.BPSK_tx (100000,10,1.5,0, `src`) Em [776]: R = ssd.cpx_AWGN (r, 20,10) # EsN0 = 20dB, Ns = 10Em [777]: Pr, F = ssd.psd (r, 2 ** 10, Fs = 10) [778]: Trama (F, 10 * log10 (Pr)) Em [784]: Z = signal.lfilter (b, 1, r) Em [785]: Ssd.eye_plot (real (z [2000: 6000]), 20) # 20 SAMP windIn [787]: Ssd.scatter_plot (z [2000: 6000] * exp (1j * pi / 5), 10,0)
Mesmo com sinais adjacentes no +/- 1,5 Rb, há pouco impacto perceptível na trama olho e gráfico de dispersão. Note-se que a taxa de bits é definida para 1,0 por conveniência. Sim, os clusters deve ser pontinhos se os filtros SRC são perfeitos e sem ISI ocorre. Ainda assim, o desempenho é bom para o dado de embalagem espectro.
Como a energia por símbolo ao ruído densidade espectral (Eb / N0) É reduzido para 100 dB (essencialmente sem ruído) para apenas 20 dB, o ruído é perceptível na coluna da direita de parcelas. Não há erros de bit estão presentes porque o enredo olho ainda está aberta. O erro de fase adicionadas ao gráfico de dispersão ainda não altera o processo de decisão.
Para BPSK, o limite de decisão é a y-eixo. Os dois grupos encontram-se em lados opostos.
Procure por erros de bits
Você pode implementar o processo de bit (símbolo) decisão na linha de comando IPython e comparar os bits resultantes com os bits transmitidos retornados por ssd.BPSK_tx () para DATA0. A potência do filtro equilibrado é vetor z. Para mover para além do atraso forma de pulso devido ao processamento de transmissor e receptor requer um atraso de bit 2 x 6 = 12, ou 10 x 12 = 120 amostras.
Você recolher amostras de saída do filtro combinado com um caminhar (Múltiplo) de 10 começando no máximo de abertura do olho. O passo de 10 é utilizado porque este é o número de amostras por bit, Ns, usado na simulação. Ao alinhar no máximo de abertura olho você está realizando o manual sincronização de bits.
decisões bit são feitas usando a parte real e, em seguida, usando o placa() função de declarar uma para valores maiores do que zero e -1 para valores inferiores a zero. Finalmente, você muda os valores decisão difícil de volta para 0/1 valores.
Dentro [850]: DATA0 [00:20] Out [850]: Matriz ([1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1,1, 0, 0, 0, 1, 0]) Em [851]: Int64 ((sinal (real (z [120: 320: 10])) + 1) / 2) Fora [851]: Matriz ([1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1,1, 0, 0, 0, 1, 0])
Para os 20 bits em comparação, está tudo bem! Por XORing (usando o operador Python ^) Aparado versões dos dois vetores, você pode contar erros de bit e estimar a probabilidade de erro de bit, Pe, dividindo-se pelo número total de bits na comparação. Verificando as primeiras 10.000 pedaços produz o seguinte código:
Dentro [862]: Soma (DATA0 [0: 10000] ^ int64 ((sinal (real (z [120: (120 + 10,000 * 10): 10])) + 1) / 2)) / flutuador (len (DATA0 [0: 10000])) out [862]: 0.0 # Pe_est
Sem erros contadas, então a estimativa de probabilidade de erro de bit é zero. Você está surpreso? Para um estudo mais aprofundado, diminuir (Eb / N0)dB até erros de bits começam a aparecer.