1
Matlab 코드를 Python으로 변환하려고합니다. 내 코드는 복소수를 비트로 디코딩하지만 복소수 배열을 전달할 때 제대로 작동하지만 알고리즘을 인코딩하여 복소수를 생성하면 오류가 발생합니다. 가능한 이유가 무엇인지 말해주십시오.변환 된 matlab 코드에서 int 객체를 호출 할 수 없습니다.
오류 :
theta_1[k-1]=angle(Cp[k]*conj(Cp[k-1]))
TypeError: 'int' object is not callable
파이썬 코드 :
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])
이 절대적으로 잘 작동합니다.
죄송합니다. 죄송합니다. –
멋지 네요 rockkkkk 나는 각도 변수라는 것을 사용하고 있다는 사실을 잊어 버렸습니다. –