2021年5月13日木曜日

『Wimax』シグナル解析

地味〜に信号解析を実施中。『Wimax 』シグナルを『Preamble抜き』

で解析する為の信号スタート位置解析の為のコード。大本のコードは

以下のサイトにあるMatlabコードです。これをPython3とNumpyに

書き換えたもの。ここからQPSK復調とかMimo等によるデータ解析を

行う訳だが、、、そろそろ外部のライブラリとかを使った信号解析を

実行したいもの。FrameControlHeaderまで辿り着けば後は物理から

開放される。面倒な変調復調や複素数などの面倒な問題とサヨナラ。

因みに使用ハードは『HackRF one』


引用元コード:

https://github.com/chemeris/wimax-scanner/blob/master/matlab/find_preamble.m

import numpy as np

import util as ut


def find_preamble(signal):


frame_start_pos = []

frame_carrier_offset = []

norm_acf = []


d = int(round(1024/3))

threshold = 0.5


#NN = len(signal) - 1152

detector_delay = d


#

del_left_centre = np.zeros(d, np.complex64)

del_centre_right = np.zeros(d, np.complex64)

del_en_left = np.zeros(d, np.complex64)

en_centre = np.zeros(d, np.complex64)

en_right = np.zeros(d, np.complex64)

del_r = np.zeros(d, np.complex64)

del_en = np.zeros(d, np.complex64)


#R_ref = np.zeros(NN)

R = np.zeros(len(signal), np.complex64)


#sliding window implementation of this

k = 0

r = 0 + 0j

en = 0 + 0j


while k < (len(signal)-4*d ):


left   = signal[k : k+d ].T

centre = signal[k+d : k+2 * d ].T

right =  signal[k+2*d : k+3*d ].T


left_centre  = np.conj(left) * centre

centre_right = np.conj(centre) * right

en_left = left * np.conj(left)

en_centre = centre * np.conj(centre)

en_right  = right * np.conj(right)


tmp_r = 2 * (left_centre + centre_right)

tmp_en = en_left + 2*en_centre + en_right


for i in range(d):

r  =  r  + tmp_r[i]- del_r[i]

en =  en + tmp_en[i] - del_en[i]


R[k] = r / en

k = k + 1


del_r = tmp_r

del_en = tmp_en


R = np.convolve( 1/128 * np.ones(128), R)

#

R = np.delete(R,np.s_[0:405:])


count = -1

maxR = -1


#fsp_len = len(frame_start_pos)

#nor_len = len(norm_acf)


for i,v in enumerate(R):

#problem

tmp = np.abs(R[i])

if ((tmp > threshold) and (tmp>maxR)):

maxR = tmp

count = 0

else:

if count == d-1:

frame_start_pos.append(i-d)

norm_acf.append(maxR)


maxR = -1

count = -1

else :

if count >= 0:

count = count + 1


# if 0

# figure(1) 

# plot(abs(R)) 

# hold on 

# plot(frame_start_pos, abs(R(frame_start_pos)), 'rx') 

# hold off

# end


#frame_start_pos

frame_carrier_offset = np.angle(R[frame_start_pos])/d


return frame_start_pos, frame_carrier_offset, norm_acf


if __name__ == '__main__':

signal = ut.readfile('./wimax.bin')

start,offset,norm=find_preamble(signal)

print(norm)

#np.tofile()


0 件のコメント:

コメントを投稿