地味〜に信号解析を実施中。『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 件のコメント:
コメントを投稿