发布于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黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 python黑洞网 All Rights Reserved 版权所有,并保留所有权利。 京ICP备18063182号-1
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!