Int объект, не вызываемый в преобразованном коде matlab

Я пытаюсь преобразовать код Matlab в Python. Мой код декодирует комплексное число в биты, он отлично работает, когда я передаю массив комплексного числа, но когда я генерирую комплексные числа алгоритмом кодирования, он дает мне ошибку. Скажите, пожалуйста, какая возможная причина.

Ошибка:

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]) работает совершенно нормально.

1 ответ

Вы назначили целое число для angle:

angle=40

но затем попытайтесь использовать его как функцию:

angle(Cp[k]*conj(Cp[k-1]))

Возможно, вы хотите переименовать эту переменную; предположительно вы хотели использовать numpy.angle().

licensed under cc by-sa 3.0 with attribution.