我正在尝试将Matlab代码转换为Python。我的代码将Complex数字解码为位,当我传递一个复数数组时它工作正常但是当我通过编码算法生成复数时它会给我一个错误。请告诉我可能的原因。
错误:
theta_1[k-1]=angle(Cp[k]*conj(Cp[k-1]))
TypeError: 'int' object is not callable
Python代码:
T=20e-3
sampling_rate=8
convfac=7.13
N_bits=1e2
SNR=40
angle=40
tau=38
a=N_bits/4+1
Fc=sampling_rate/T
dt=1/sampling_rate/Fc
a1=array([0,0,1])
N_bits=1e5
a2=arange(0,2,1)
## Transmitter ##
bits1=ceil(len(a2)*rand(N_bits))
bits=a1[array(bits1,dtype=int)]
print(bits)
zer=[0,0,0,0,0,0,0,0]
bits=np.concatenate(([0,0,0,0,0,0,0,0],bits))
N_bits=len(bits)
delta1=zeros(((N_bits/4)+1) , dtype=np.complex)
delta2=zeros(((N_bits/4)+1) , dtype=np.complex)
k=1
C=zeros(((N_bits/4)+1) , dtype=np.complex)
D=zeros(((N_bits/4)+1) , dtype=np.complex)
C[0]=2+2j
D[0]=1+1j
for l in arange(0,N_bits,4):
if (bits[l]==0 & bits[l+1]==0):
delta1[k]=0
elif(bits[l]==0 & bits[l+1]==1):
delta1[k]=np.pi/2
elif (bits[l]==1)&(bits[l+1]==1):
delta1[k]=np.pi
else:
delta1[k]=3*(np.pi/2)
if (bits[l+2]==0)&(bits[l+3]==0):
delta2[k]=0
elif(bits[l+2]==0)&(bits[l+3]==1):
delta2[k]=np.pi/2
elif (bits[l+2]==1)& (bits[l+3]==1):
delta2[k]=np.pi;
else:
delta2[k]=3* np.pi/2
C[k]=C[k-1]*(np.cos(delta1[k])+1j*np.sin(delta1[k]))
D[k]=D[k-1]*(np.cos(delta2[k])+1j*np.sin(delta2[k]))
k=k+1
S=C+D
S_real=S.real
S_imag=S.imag
a=len(S)
N_bits=(len(S)-1)*4
retrieved_bits=zeros(N_bits)
Cp=zeros(a+1,dtype=np.complex)
Dp=zeros(a+1,dtype=np.complex)
theta_1=zeros((N_bits/4)+1,dtype=np.complex)
theta_2=zeros((N_bits/4)+1,dtype=np.complex)
Cp[0]=2+2j
Dp[0]=1+1j
for k in arange(1,a):
Cp[k]= 2*complex(sign(S_real[k]), sign(S_imag[k]) )
Dp[k]=complex(sign(real(S[k]-Cp[k])),sign(imag(S[k]-Cp[k])))
theta_1[k-1]=angle(Cp[k]*conj(Cp[k-1]))
theta_2[k-1]=angle(Dp[k]*conj(Dp[k-1]))
test=angle(S[0])-angle(3+3j)
theta1=theta_1[0]
theta2=theta_2[0]
############################################
if (test==90*(pi/180)):
if (theta_1[0]==-test):
theta_1[0]=test+abs(theta_1[0])
else:
theta_1[0]=theta_1[0]-test
##############################################
if(theta_2[0]==-test):
theta_2[0]=test+abs(theta_2[0])
else:
theta_2[0]=theta_2[0]-test
###############################################
if (abs(test)==180*(pi/180)):
theta_1[0]=theta_1[0]-abs(test)
theta_2[0]=abs(theta_2[0])-abs(test)
j=0
for k in arange(0,a-1):
if (theta_1[k]==0):
retrieved_bits[j]=0
retrieved_bits[j+1]=0
elif(theta_1[k]==pi/2):
retrieved_bits[j]=0
retrieved_bits[j+1]=1
elif(theta_1[k]==pi):
retrieved_bits[j]=1
retrieved_bits[j+1]=1
else:
retrieved_bits[j]=1
retrieved_bits[j+1]=0
if(theta_2[k]==0):
retrieved_bits[j+2]=0
retrieved_bits[j+3]=0
elif(theta_2[k]==pi/2):
retrieved_bits[j+2]=0
retrieved_bits[j+3]=1
elif(theta_2[k]==pi):
retrieved_bits[j+2]=1
retrieved_bits[j+3]=1
else:
retrieved_bits[j+2]=1
retrieved_bits[j+3]=0
j=j+4
scatter(S.real,S.imag)
grid(True)
show()
当S=array([ 3.+3.j , 1.-3.j, -3.+1.j,3.+3.j , 1.-3.j, -3.+1.j,3.+3.j , -3.+1.j, 1.-3.j])
完全正常时。
答案 0 :(得分:4)
您为angle
分配了一个整数:
angle=40
然后尝试将其用作函数:
angle(Cp[k]*conj(Cp[k-1]))
也许你想重命名那个变量;大概你想在那里使用numpy.angle()
function。