Beispiel #1
0
    def get_pulseshaped_data(self, num, mod, os, length=None, alpha=0.35):
        """ generates random, oversampled and root-raised cosine filtered data
            INPUT:
                num:
                mod:
                os: oversampling factor
                length: length of the rc filter
                alpha: roll-off factor
                Ts: symbol period
                Fs: sampling rate
            OUTPUT: (data_raw, data_mod, data_shaped)
                data_raw: integer valued np.array with raw (binary) data
                data_mod: complex valued np.array with modulated data
                data_os: complex valued np.array with oversampled data
                data_shaped: complex valued np.array with pulse-shaped data
                rc: coefficients of the RC filter
        """
        # empirical values
        Ts = 8e-6
        Fs = 2 * 0.625e5 * os
        length = 8 * os if length == None else length

        data_raw, data_mod = self.get_random_data(num, mod)
        rc = rcosfilter(length, alpha, Ts, Fs)[1]
        os_filter = np.zeros(os)
        os_filter[0] = 1
        data_os = np.kron(data_mod, os_filter)
        # center ramp up and ramp down of filter
        data_os = np.concatenate([np.zeros(os / 2), data_os[:-os / 2]])
        data_shaped = np.convolve(rc, data_os)
        # center the filter
        data_shaped = data_shaped[length / 2:-length / 2 + 1]
        return (data_raw, data_mod, data_os, data_shaped, rc)
 def pulso(self, K=10, alfa=0.3, num=4, tipo='square'):
     if (tipo == 'square'):
         lo = np.ceil(K / 2) - 1
         return np.ones(K), lo
     if (tipo == 'sinc'):
         n = np.arange(-K * num, K * num + 1, 1)
         n[n == 0] = -1000
         tmp = np.sin(np.pi * n / K) / (np.pi * n / K)
         lo = np.ceil(len(tmp) / 2) - 1
         n[n == -1000] = 0
         tmp[n == 0] = 1
         return tmp, lo
     if (tipo == 'squareRZ'):
         lo = np.ceil(K / 2) - 1
         n = np.linspace(0, K - 1, K)
         x = np.ones_like(n)
         x[n >= K / 2] = 0
         return x, lo
     if (tipo == 'Manchester'):
         lo = np.ceil(K / 2) - 1
         n = np.linspace(0, K - 1, K)
         x = np.ones_like(n)
         x[n >= K / 2] = -1
         return x, lo
     if (tipo == 'RC'):
         n, v = rcosfilter(num * K, alfa, 1, K)
         lo = np.ceil(len(v) / 2)
         return v, lo
     if (tipo == 'rootRC'):
         n, v = rrcosfilter(num * K, alfa, 1, K)
         lo = np.ceil(len(v) / 2)
         return v, lo
Beispiel #3
0
        def lowpass_filter(i, q, numtaps, cutoff, N, Ts, Fs, alpha=0.35):

            h = firwin(numtaps, cutoff, nyq=float(self.carrier_freq / 2))
            i, q = lfilter(h, 1.0, i), lfilter(h, 1.0, q)

            sPSF = rcosfilter(N, alpha, Ts, Fs)[1]
            i, q = np.convolve(sPSF, i, mode='same'), np.convolve(sPSF,
                                                                  q,
                                                                  mode='same')

            return i, q
def main():

    ## Inicializacion de simbolos a transmitir
    symbolsI = 0x1AA
    symbolsQ = 0x1FE

    ## Filtro Tx y Rx
    #Filtro Root Raised Cosine
    rc = rrcosfilter(int(Nbauds * os), beta, T, 1. / Ts)[1]
    #Normalizacion
    rc = rc[:24]
    #rc=rc/np.linalg.norm(rc) #lialg.norm ----> Raiz de la suma de los cuadrados de los coeficientes
    rc = rc / np.sqrt(float(os))
    rc_fp = VectorCuantizacion(8, 7, rc, 'trunc')

    # ### FIR para Canal
    # #Filtro Root Raised Cosine
    rch = rcosfilter(int(Nbauds_ch * os), beta, T_ch, 1. / Ts_ch)[1]
    # # #Normalizacion fir del canal
    rch = rch[:28]
    # rch=rch/np.linalg.norm(rch)
    #rch=rch/np.linalg.norm(rch) #lialg.norm ----> Raiz de la suma de los cuadrados de los coeficientes
    #rch=rch/np.sqrt(float(os))
    #rch_fp= VectorCuantizacion(8,7,rch,'trunc')
    #canal=np.convolve(rc,rc)  ## filtro equivalente, resultado de la convolucion de filtro Tx y FIR canal
    #canal_fp=VectorCuantizacion(8,7,canal,'trunc')

    ###---------------------------------------------------
    ####Calculos de energia de filtros
    #Tx
    energia_tx = 0
    for p in range(len(rc)):
        energia_tx = energia_tx + (rc[p]**2)
    print "Energia Tx = ", energia_tx

    # ##FIR canal
    # energia_rch=0
    # for q in range(len(rch)):
    #     energia_rch=energia_rch+(rch[q]**2)
    # print "Energia rch = ",energia_rch

    # ##Filtro equivalente de Tx y FIR , canal equivalente
    # energia_fir_equiv=0
    # for w in range(len(canal)):
    #     energia_fir_equiv=energia_fir_equiv+(canal[w]**2)

    # print "Energia canal equivalente: ", energia_fir_equiv

    ###---------------------------------------------------
    #Grafica de respuesta al impulso del filtro
    # graf_respImpulso(rc_fp,"Filtro Transmisor Tx")
    # graf_respImpulso(rch_fp,"Filtro Canal")
    # graf_respImpulso(canal,"Rc Rch")

    plt.figure()
    plt.title("Filtro RRC")
    plt.plot(rc, 'k-', linewidth=2.0)
    plt.plot(rc_fp, 'b-', linewidth=2.0)
    plt.legend()
    plt.grid(True)
    plt.xlim(0, len(rc) - 1)
    plt.xlabel('Muestras')
    plt.ylabel('Magnitud')

    # plt.figure()
    # plt.title("Convolucion TxRx")
    # plt.plot(canal,'k-',linewidth=2.0)
    # plt.plot(canal_fp,'b-', linewidth =2.0)
    # plt.legend()
    # plt.grid(True)
    # plt.xlim(0,len(canal)-1)
    # plt.xlabel('Muestras')
    # plt.ylabel('Magnitud')

    # plt.figure()
    # plt.title("Canal")
    # plt.plot(canal,'k-',linewidth=2.0)
    # plt.plot(canal_fp,'b-', linewidth =2.0)
    # plt.legend()
    # plt.grid(True)
    # plt.xlim(0,len(canal)-1)
    # plt.xlabel('Muestras')
    # plt.ylabel('Magnitud')

    #Respuesta en frecuencia
    [H0, A0, F0] = resp_freq(rc, Ts, Nfreqs)
    [H1, A1, F1] = resp_freq(rc_fp, Ts, Nfreqs)

    #Grafica de respuesta en frecuencia del filtro
    #graf_respFrecuencia(H0,A0,F0,"Filtro Transmisor")

    plt.figure()
    plt.title(
        'Respuesta en frecuencia convolucion filtro transmisor y receptor')
    plt.semilogx(F0,
                 20 * np.log10(H0),
                 'r',
                 linewidth=2.0,
                 label=r'$\beta=0.5$')
    plt.semilogx(F1,
                 20 * np.log10(H1),
                 'b',
                 linewidth=2.0,
                 label=r'$\beta=0.5$')
    #plt.axvline(x=(1./Ts)/2.,color='k',linewidth=2.0)
    #plt.axvline(x=(1./T)/2.,color='k',linewidth=2.0)
    plt.axhline(y=20 * np.log10(0.5), color='k', linewidth=2.0)
    plt.legend(loc=3)
    plt.grid(True)
    #plt.xlim(F0[1],F0[len(F0)-1])
    plt.xlabel('Frequencia [Hz]')
    plt.ylabel('Magnitud [dB]')

    #Grafica de respuesta al impulso del filtro
    # graf_respImpulso(rcoseno,"convolucion filtro transmisor y receptor")

    #Respuesta en frecuencia
    # [H1,A1,F1]=resp_freq(rcoseno, Ts, Nfreqs)

    #Grafica de respuesta en frecuencia del filtro
    # graf_respFrecuencia(H1,A1,F1,"convolucion filtro transmisor y receptor")

    #Shift register del transmisor y receptor
    shift_tx_I = np.zeros(24)
    shift_tx_Q = np.zeros(24)
    shift_rx_I = np.zeros(24)
    shift_rx_Q = np.zeros(24)

    #Bit transmitidos para comparar en la BER
    trans_berI = np.zeros(1024)
    trans_berQ = np.zeros(1024)

    #Bit recibios para comprar en la BER
    recib_berI = np.zeros(511)
    recib_berQ = np.zeros(511)

    #Salida del filtro transmisor
    out_tx_I = 0
    out_tx_Q = 0
    out_tx_I_fp = DeFixedInt(7, 6, 'S', 'trunc')  #Punto Fijo
    out_tx_Q_fp = DeFixedInt(7, 6, 'S', 'trunc')

    #Salida de del canal mas el ruido
    # out_ch_I=0
    # out_ch_Q=0
    # out_ch_I= DeFixedInt(8,7) #Punto Fijo
    # out_ch_Q= DeFixedInt(8,7)

    #Salida del filtro receptor
    rx_I = 0
    rx_Q = 0
    rx_I_fp = DeFixedInt(7, 6, 'S', 'trunc')  #Punto Fijo
    rx_Q_fp = DeFixedInt(7, 6, 'S', 'trunc')

    #Valor obtenido del Slicer (detector)
    ak_I = 0
    ak_Q = 0

    #Salida del FIR del Equalizador
    y_I = 0
    y_Q = 0
    y_I_fp = DeFixedInt(9, 7, 'S', 'trunc')
    y_Q_fp = DeFixedInt(9, 7, 'S', 'trunc')

    #Error realimentacion Equalizador
    error_adap_I = 0
    error_adap_Q = 0
    error_adap_I_fp = DeFixedInt(7, 6, 'S', 'trunc')
    error_adap_Q_fp = DeFixedInt(7, 6, 'S', 'trunc')

    offset = 1

    phase_I = np.zeros(4)
    phase_Q = np.zeros(4)

    #Variables utilizadas en la sincronizacion
    error_actual = 0
    error_minimo = 99999
    pos_trans = 0
    pos_aux = 0
    cont_ber = 0

    #Variables utilizadas post sincronizacion
    error_final = 0
    cant_muestras = 0

    #Habilitacion Prbs, Ber
    value = 0

    delta = 0.0115
    # delta=0.005

    #Cantidad de coeficientes FIR del ecualizador
    Ntap = 31

    #Memoria del filtro FIR Ecualizador
    mem_fir_adap_I = np.zeros(Ntap)
    mem_fir_adap_Q = np.zeros(Ntap)

    #Coeficientes del filtro FIR del ecualizador adaptativo
    coef_fir_adap_I = np.zeros(Ntap)
    coef_fir_adap_Q = np.zeros(Ntap)
    #Pos 15 = 1 inicializacion
    coef_fir_adap_I[(Ntap - 1) / 2] = 1
    coef_fir_adap_Q[(Ntap - 1) / 2] = 1

    coef_fir_adap_I_fp = DeFixedInt(10, 8, 'S', 'sature')
    coef_fir_adap_Q_fp = DeFixedInt(10, 8, 'S', 'sature')

    diezmado = 2

    end_sync = 0  #Bandera indica fin etapa de sincronizacion (1)

    graficar = 0  #Cuando esta en 1 almacena valores para luego graficar

    # #Memoria del canal
    mem_canal_I = np.zeros(len(rch))
    mem_canal_Q = np.zeros(len(rch))

    #Usados para graficar
    senial_transmitir_I = []
    senial_transmitir_Q = []

    senial_recibida_I = []
    senial_recibida_Q = []

    senial_recibida_diezmada_I = []
    senial_recibida_diezmada_Q = []

    coeficientes = []

    error_tiempo = []

    input_equ = []
    var_tx = []
    var_rx = []
    var_ch = []
    #CURVA BER SIMULADA
    snr = [100.]  #,20.]#,100.,16.,14.,12.,10.,8.,6.,4.,2.]
    ber = []
    snr_iteraciones = [
        100000
    ]  #+ 2097153,100000+100000]#,100000,100000,100000,100000,100000,100000,100000]
    for t in range(len(snr_iteraciones)):
        error_final = 0
        # noise_vector_I=noise(snr[t],snr_iteraciones[t],energia_tx/4) #genero senial de ruido
        # noise_vector_Q=noise(snr[t],snr_iteraciones[t],energia_tx/4)
        print "snr_iter: ", snr_iteraciones[t]
        print "t: ", t

        for i in range(0, snr_iteraciones[t]):
            value = i % os
            if (i == 0):
                sym_t_I = 0
                sym_t_Q = 0
            else:
                sym_t_I = out_tx_I_fp.fValue
                sym_t_Q = out_tx_Q_fp.fValue

            shift_tx_I = ShiftReg(shift_tx_I)
            shift_tx_Q = ShiftReg(shift_tx_Q)

            if (value == 0):  #es multiplo de 4?
                symbolsI = PRBS9(symbolsI)  #Generacion de simbolos
                symbolsQ = PRBS9(symbolsQ)
                if ((symbolsI >> 8) & 0x001 == 0):
                    shift_tx_I[0] = 1
                else:
                    shift_tx_I[0] = -1

                if ((symbolsQ >> 8) & 0x001 == 0):
                    shift_tx_Q[0] = 1
                else:
                    shift_tx_Q[0] = -1

                trans_berI = ShiftReg(trans_berI)
                trans_berQ = ShiftReg(trans_berQ)

                trans_berI[0] = shift_tx_I[
                    0]  #Agrego nuevo valor transmitido a arreglo bits transmitidos
                trans_berQ[0] = shift_tx_Q[0]

            else:  #Oversampling
                shift_tx_I[0] = 0
                shift_tx_Q[0] = 0

            ## Convolucion transmisor, senial transmitida
            out_tx_I = np.sum(rc * shift_tx_I)
            out_tx_Q = np.sum(rc * shift_tx_Q)

            # if(i%4):
            #     var_tx.append(out_tx_I)

            out_tx_I_fp.value = out_tx_I  #+noise_vector_I[i]
            out_tx_Q_fp.value = out_tx_Q  #+noise_vector_Q[i]

            # ###
            # Canal
            # ###
            # mem_canal_I = ShiftReg(mem_canal_I) #corrimiento de memoria del canal
            # mem_canal_Q = ShiftReg(mem_canal_Q)

            # mem_canal_I[0]=out_tx_I #agregamos nuevo valor de salida de Tx a la memoria
            # mem_canal_Q[0]=out_tx_Q

            # out_ch_I=np.sum(mem_canal_I*(rch)) #salida Tx pasa por canal
            # out_ch_Q=np.sum(mem_canal_Q*(rch))

            # if(i%4):
            #     var_ch.append(out_ch_I)

            shift_rx_I = ShiftReg(shift_rx_I)
            shift_rx_Q = ShiftReg(shift_rx_Q)

            shift_rx_I[0] = sym_t_I
            shift_rx_Q[0] = sym_t_Q

            ##Convolucion receptor, senial recibida
            rx_I = np.sum(rc * shift_rx_I)
            rx_Q = np.sum(rc * shift_rx_Q)

            rx_I_fp.value = rx_I
            rx_Q_fp.value = rx_Q

            # if(i%4 and t==0):
            #     input_equ.append(abs(rx_I))
            # rx_I = rx_I *vect_pond[t]
            # rx_Q = rx_Q *vect_pond[t]

            # rx_I=rx_I*pond
            # rx_Q=rx_Q*pond

            # if(max_rx[t] < abs(rx_I)):
            #     max_rx[t] = abs(rx_I)

            # print "Salida Rx: ",rx_I

            ####
            ###FIR ECUALIZADOR
            #####
            if ((i % 2 != 0) and (i != 0)):  #nos quedamos con muestras 1 y 3

                mem_fir_adap_I = ShiftReg(mem_fir_adap_I)
                mem_fir_adap_Q = ShiftReg(mem_fir_adap_Q)

                mem_fir_adap_I[0] = rx_I_fp.fValue
                mem_fir_adap_Q[0] = rx_Q_fp.fValue

            if ((value == 0) and i != 0):

                #for r in range(0,Ntap-1):
                y_I = np.sum(coef_fir_adap_I * mem_fir_adap_I)  #FIR
                y_Q = np.sum(coef_fir_adap_Q * mem_fir_adap_Q)  #FIR

                y_I_fp.value = y_I
                y_Q_fp.value = y_Q

                #Slicer
                ak_I = (2 * (y_I_fp.fValue >= 0) - 1)
                ak_Q = (2 * (y_Q_fp.fValue >= 0) - 1)

                #------------------------------------------Algoritmo de adaptacion
                error_adap_I = ak_I - y_I_fp.fValue
                error_adap_Q = ak_Q - y_Q_fp.fValue

                error_adap_I_fp.value = error_adap_I
                error_adap_Q_fp.value = error_adap_Q

                if (i % 4 == 0):
                    coeficientes.append(coef_fir_adap_I.copy())

                for b in range(0, Ntap):
                    coef_fir_adap_I[b] = coef_fir_adap_I[
                        b] + delta * error_adap_I_fp.fValue * mem_fir_adap_I[b]
                    coef_fir_adap_Q[b] = coef_fir_adap_Q[
                        b] + delta * error_adap_Q_fp.fValue * mem_fir_adap_Q[b]

                # print("COEF I SIN FIX")
                # print ("sin fix",coef_fir_adap_I)
                # print("NOSE",coef_fir_adap_I_fp)
                # for b in range(0,Ntap):
                #     coef_fir_adap_I_fp.value=coef_fir_adap_I[b]
                #     coef_fir_adap_I[b]=coef_fir_adap_I_fp.fValue

                # print("FIX",coef_fir_adap_I)

                for b in range(0, Ntap):
                    coef_fir_adap_I_fp.value = coef_fir_adap_I[b]
                    coef_fir_adap_I[b] = coef_fir_adap_I_fp.fValue
                    coef_fir_adap_Q_fp.value = coef_fir_adap_Q[b]
                    coef_fir_adap_Q[b] = coef_fir_adap_Q_fp.fValue
                # # raw_input('Press Enter to Continue')
                # print("COEF I CON FIX")
                # for b in range(0,Ntap):
                #     print (coef_fir_adap_I[b])
            ##Ber
            # if(i>1000):
            #     if((value==0) and i!=0):
            #         recib_berI = ShiftReg(recib_berI)
            #         recib_berQ = ShiftReg(recib_berQ)

            #         recib_berI[0]=ak_I #Bits recibidos
            #         recib_berQ[0]=ak_Q #Bits recibidos

            #         if(end_sync==0): ##Etapa de sincronizacion
            #             if(cont_ber<511):
            #                 cont_ber=cont_ber+1
            #             else: #cont_ber==511
            #                 cont_ber=0
            #                 if(error_actual<error_minimo):
            #                     print "Error minimo actual: ",error_actual
            #                     print "Pos error minimo actual: ",pos_trans
            #                     error_minimo=error_actual
            #                     error_actual=0
            #                     pos_aux=pos_trans
            #                 else:
            #                     error_actual=0

            #                 if(pos_trans!=1023):
            #                     pos_trans=pos_trans+1
            #                 else:   #finalizo etapa de sincronizacion
            #                     pos_trans=pos_aux
            #                     end_sync=1
            #                     # print "end_sync",end_sync
            #                     #graficar=1
            #             if(recib_berI[0]!=trans_berI[pos_trans]):
            #                 error_actual=error_actual+1
            #             if(recib_berQ[0]!=trans_berQ[pos_trans]):
            #                 error_actual=error_actual+1

            #         else: #end_sync==1 pos sincronizacion
            #             cant_muestras=cant_muestras+1
            #             # print "end_sync"
            #             # if(end_sync==1):
            #                 # print "Bit recibido en BER: ", ak_I
            #                 # raw_input('Press Enter to Continue')
            #                 # plt.close()

            #             if(recib_berI[0]!=trans_berI[pos_trans]):
            #                 error_final=error_final+1
            #             if(recib_berQ[0]!=trans_berQ[pos_trans]):
            #                 error_final=error_final+1

            #             if(i==(snr_iteraciones[t]-4)):
            #                 print "snr",snr[t]
            #                 print "error_final", error_final
            #                 ber.append(float(error_final)/(((snr_iteraciones[t]/os)*2)))
            #                 print ber

    # print "VAR_TX", np.var(var_tx)
    # print "VAR_RX", np.var(var_rx)
    # print "VAR_CH", np.var(var_ch)

    # print "SNR = ", snr[t], " Maximo = ", max_rx[t]
    # print "SNR = %d - Maximo = %d" %(snr[t],max_rx[t])
    # suma=0
    # for w in range (len(input_equ)):
    #     suma=suma + input_equ[w]

    # plt.figure()
    # plt.title("Entrada Ecualizador")
    # plt.plot(input_equ,".")
    # print "Cantidad de muestras para la media ", len(input_equ)
    # print "MEDIA:", suma/len(input_equ)
    # print "Vector de Maximos", max_rx
    #print "BER: ", ber

    #print error_minimo
    #print pos_aux

    ##Grafico de simbolos transmitidos
    #graf_simbTransmitidos(shift_tx_I,shift_tx_Q)

    ### Convolucion transmisor, senial transmitida
    #graf_Convolucion(senial_transmitir_I, "transmitida")

    ##Grafico diagrama ojo transmisor
    #eyediagram(senial_transmitir_I[100:len(senial_transmitir_I)-100],os,0,Nbauds)
    #eyediagram(senial_transmitir_Q[100:len(senial_transmitir_Q)-100],os,0,Nbauds)

    ##Convolucion receptor, senial recibida
    #graf_Convolucion(var_rx,"recibida")

    ##Grafica curvas Ber-teorica y simulada
    #graf_BER(snr,ber)

    ##Grafico diagrama ojo receptor
    #eyediagram(senial_recibida_I[100:len(senial_recibida_I)-100],os,0,Nbauds)
    #eyediagram(senial_recibida_Q[100:len(senial_recibida_Q)-100],os,0,Nbauds)

    ##Constelaciones
    # plt.figure()
    # plt.title("Constelaciones")
    # plt.plot(senial_recibida_diezmada_I[(offset):len(senial_recibida_diezmada_I)-((offset)):int(os)],
    #      senial_recibida_diezmada_Q[(offset):len(senial_recibida_diezmada_Q)-((offset)):int(os)],
    #          'r.',linewidth=2.0)
    # plt.axis('equal')
    # plt.grid(True)
    # plt.xlabel('Real')
    # plt.ylabel('Imag')

    # plt.figure()
    # plt.title("Error en la adaptacion")
    # plt.plot(error_tiempo)

    plt.figure()
    plt.title("Coeficientes en el tiempo")
    plt.plot(coeficientes)

    # print len(coeficientes)
    plt.figure()
    plt.title("Ultimos coeficientes del filtro FIR")
    plt.stem(coeficientes[len(coeficientes) - 1])

    #equa=np.convolve(rcoseno,np.transpose(coeficientes[len(coeficientes)-1]))

    # ## Grafica de respuesta al impulso del filtro
    # graf_respImpulso(equa,"a la salida del equalizador")

    # ## Respuesta en frecuencia
    # [H2,A2,F2]=resp_freq(equa, Ts, Nfreqs)
    # ## Grafica de respuesta en frecuencia del filtro
    # graf_respFrecuencia(H2,A2,F2,"a la salida del ecualizador")

    plt.show(block=False)
    raw_input('Press Enter to Continue')
    plt.close()