程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

在 Python 中使用卷积编码进行 BER 测试时如何解决 TypeError?

发布于2023-05-29 23:42     阅读(527)     评论(0)     点赞(23)     收藏(5)


TypeError: Cannot interpret '1027' as a data type

我正在通过使用 python 的卷积编码来测试 BER 但是有 TypeError 如何解决这个问题请帮忙!

import numpy as np

def Encoder(data):
    data = np.append(data,[0,0,0]) # 데이터가 들어오면 뒤에 000을 붙인다.
    dataSize = np.shape(data)[0]
    shiftReg = [0,0,0] # k = 3 인 쉬프트 레지스터
    encoded_bit = np.zeros(2,dataSize) # R=1/2 1비트 들어오면 2비트 출력 2행 dataSize 열 만큼 만든다.

    for i in range(dataSize):
        shiftReg[2] = shiftReg[1]
        shiftReg[1] = shiftReg[0]
        shiftReg[0] = data[i] # 데이터를 레지스터에 넣으면 한칸씩 쉬프트
        encoded_bit[0,i] = np.logical_xor(np.logical_xor(shiftReg[0],shiftReg[1]),shiftReg[2])
        encoded_bit[1,i] = np.logical_xor(shiftReg[0],shiftReg[2])

    return encoded_bit

def ViterbiDecoder(encoded_bit):
    ref_out = np.zeros((2,8)) #각 a,b,c,d 마다 2개씩 총 8개의 참조 출력값
    ref_out[0, :] = [0,1,1,0,1,0,0,1]
    ref_out[1, :] = [0,1,0,1,1,0,1,0]
    # 00/01/10/11로 들어오는 화살표의 출력들
    # 00으로 들어오는 것의 과거 state 00과 01
    # 11으로 들어오는 것의 과거 state 10과 11
    dataSize = np.shape(encoded_bit)[1] # 2 by 원래 데이터길이 +3[0,0,0]
    cumDist = [0,100,100,100] #거리계산 초기값 설정. 00/01/10/11에 대응
    prevState = []

    for i in range(dataSize):
        tmpData = np.tile(encoded_bit[:,i].reshape(2,1),(1,8))
        # 0 0 0 0 0 0 0 0
        # 0 0 0 0 0 0 0 0
        dist = np.sum(np.abs(tmpData - ref_out), axis=0)
        #dist 계산결과 0 2 1 1 2 0 1 1
        tmpDist = np.tile(cumDist,(1,2)) + dist
        # [0 100 100 100 0 100 100 100]+ dist값
        tmpPrevState = []
        for a in range(4): #state 수가 4 다.
            if tmpDist[0,2 * a + 0] <= tmpDist[0,2 * a + 1]:
                cumDist[a] = tmpDist[0, 2 * a + 0]
                tmpPrevState.append((a % 2) * 2 + 0)
            else:
                cumDist[a] = tmpDist[0, 2 * a + 1]
                tmpPrevState.append((a % 2) * 2 + 1)
        prevState.append(tmpPrevState)

        state_index = np.argmin(cumDist)#컴디스트가 제일 작은 숫자 출력

        decoded_bit = []
        for b in range(dataSize - 1, -1, -1): #디코딩 과정은 역순
            decoded_bit.append(int(state_index / 2))
            state_index = prevState[b][state_index]
        data_size = np.shape(decoded_bit)[0] # 거꾸로 된 데이터를 다시 뒤집는 과정
        decoded_bit = np.flip(decoded_bit)[0:data_size - 3] # 000을 지워준다.
    return decoded_bit

此代码是卷积编解码器

我将测试使用和不使用卷积的结果差异

import matplotlib.pyplot as plt
import numpy as np
import ConvCodec as cc

data_size = 1024
max_snr = 11
ber = []

for snr_db in range(0,max_snr):
    data = np.random.randint(0,2,data_size)
    encoded_bit = cc.Encoder(data)

    real_signal = np.random.randint(0, 2, data_size) * 2 - 1
    imag_signal = np.random.randint(0, 2, data_size) * 2 - 1

    qpsk_sym = (real_signal + 1j + imag_signal)/np.sqrt(2)
    ofdm_sym = np.fft.ifft(qpsk_sym) * np.sqrt(data_size) #평균파어 1

    noise_std = 10 ** (-snr_db/20)
    noise = np.random.randn(data_size)*noise_std/np.sqrt(2)+1j+np.random.randn(data_size)*noise_std/np.sqrt(2)
    rcv_signal = np.fft.fft(ofdm_sym) / np.sqrt(data_size) + noise

    real_detected_signal = np.array(((rcv_signal.real > 0) + 0)).reshape(1,data_size+3)
    imag_detected_signal = np.array(((rcv_signal.imag > 0) + 0)).reshape(1,data_size+3)

    #(2,1024
    dec_input = np.vstack([real_detected_signal,imag_detected_signal])
    #np.shape(dec_input), np.shape(real_detected_signal)

    decoded_bit = cc.ViterbiDecoder(dec_input)
    print(np.sum(np.abs(dec_input - encoded_bit))) # 오류 정정 전 결과
    print(np.sum(np.abs(data-decoded_bit))) # 오류 정정 후 결과

这段代码是一个模拟器。第一次打印是在使用卷积编解码器之前。第二次打印是在使用卷积编解码器之后。


解决方案


暂无回答



所属网站分类: 技术文章 > 问答

作者:黑洞官方问答小能手

链接:https://www.pythonheidong.com/blog/article/1983583/5c06c221a99ecc03f3d1/

来源:python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

23 0
收藏该文
已收藏

评论内容:(最多支持255个字符)