2013-08-15 3 views
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])이 절대적으로 잘 작동합니다.

답변

4

당신은 angle의 정수를 할당 :

angle=40 

하지만 함수로 사용하려고 :

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

이 아마도 당신이 변수 이름을 바꾸려면; 아마도 거기에 numpy.angle() function을 사용하고 싶었을 것입니다.

+0

죄송합니다. 죄송합니다. –

+0

멋지 네요 rockkkkk 나는 각도 변수라는 것을 사용하고 있다는 사실을 잊어 버렸습니다. –

관련 문제