讲解代码
from queue import Queue
import numpy as np
magic_word = b'\xAF\xBE\xAD\xDE'
buffer_queue = Queue()
def hex_dump(data, bytes_per_line=16):
hex_chars = ' '.join(['{:02X}'.format(byte) for byte in data])
lines = []
for i in range(0, len(hex_chars), bytes_per_line * 3):
hex_line = hex_chars[i:i + bytes_per_line * 3]
lines.append(hex_line)
return '\n'.join(lines)
def print_data(data):
print(hex_dump(data))
def trans_data_320m(data):
#print(np.arange(3, 7)) # 输出: [3 4 5 6]
#read_host_header
# =============================================================================
# decimation_factor=2;
# punc_mode = 0
# punc_bitmap = 255
# preamble_type=5
# upload_pkt_bw=4
# =============================================================================
interv_tones=251
num_streams=1
num_chains=2
num_tones=251*4
# =============================================================================
# if preamble_type==5:
# if upload_pkt_bw==4:
# if punc_bitmap!=255 and punc_bitmap!=0:
# print("*********************************,punc_mode = 1")
# punc_mode = 1
# if decimation_factor==2:
# if punc_mode == 0:
# num_tones = 251*4; # -125:125, for all four 80 MHz segments
# =============================================================================
data_points = data.view(dtype=np.int16)
real_part = data_points[::2]
image_part = data_points[1::2]
tones_complex = real_part + image_part * 1j
result=[]
for streamIdx in range(num_streams):
for chainIdx in range(num_chains):
idx= num_tones * (streamIdx*num_chains + chainIdx)
tones = tones_complex[(0+idx):(num_tones+idx)]
for i in range(4):
result = np.append(result, tones[(0 + i *interv_tones): (125 + i *interv_tones)])
result = np.append(result, tones[124 + i *interv_tones]*0.5 + tones[126 + i *interv_tones]*0.5)
result = np.append(result, tones[(126 + i *interv_tones):(251 + i *interv_tones)])
array = np.array(result).reshape(2, 251*4)
return array
#在目前的算法中,仅使用了timestamp信息,其余未使用,进行注释
def released_cypress_read_cfr_host_metadata(data):
meta_data_string = data[:160]
meta_data = {}
# =============================================================================
# # Header
# meta_data['start_magic_num_deadbeaf'] = int.from_bytes(meta_data_string[:4],byteorder='little')#[7 8 5 6 3 4 1 2]
# meta_data['vendor_id'] = int.from_bytes(meta_data_string[4:8],byteorder='little')
# meta_data['cfr_metadata_version'] = int.from_bytes(meta_data_string[8:9],byteorder='little') & 0xFF#位操作,用于确保结果是一个8位(即1字节)的整数。
# meta_data['cfr_data_version'] = int.from_bytes(meta_data_string[9:10],byteorder='little') & 0xFF
# meta_data['chip_type'] = int.from_bytes(meta_data_string[10:11],byteorder='little') & 0xFF
# meta_data['platform_type'] = int.from_bytes(meta_data_string[11:12],byteorder='little') & 0xFF #23:24
# meta_data['meta_data_length_no_header'] = int.from_bytes(meta_data_string[12:16],byteorder='little') & 0xFF
# meta_data['meta_data_length_with_header'] = meta_data['meta_data_length_no_header'] + 24
#
# # meta data
# meta_data['capture_status'] = int.from_bytes(meta_data_string[24:25],byteorder='little') & 0xFF
# meta_data['tx_bw'] = int.from_bytes(meta_data_string[24:26],byteorder='little') & 0xFFFF
# meta_data['upload_bw'] = int.from_bytes(meta_data_string[26:27],byteorder='little') & 0xFF
# meta_data['phy_mode'] = int.from_bytes(meta_data_string[27:28],byteorder='little') & 0xFF
# meta_data['pri20_chan'] = int.from_bytes(meta_data_string[28:30],byteorder='little') & 0xFFFF
# meta_data['center_freq1'] = int.from_bytes(meta_data_string[30:32],byteorder='little') & 0xFFFF
# meta_data['center_freq2'] = int.from_bytes(meta_data_string[32:34],byteorder='little') & 0xFFFF
# meta_data['capture_mode'] = int.from_bytes(meta_data_string[34:35],byteorder='little') & 0xFF
# meta_data['capture_type'] = int.from_bytes(meta_data_string[25:36],byteorder='little') & 0xFF
# =============================================================================
#meta_data['sts_count'] = int.from_bytes(meta_data_string[36:37],byteorder='little') & 0xFF
#meta_data['rx_chain_mask'] = int.from_bytes(meta_data_string[37:38],byteorder='little') & 0xFF
meta_data['timestamp'] = int.from_bytes(meta_data_string[38:46],byteorder='little') & 0xFFFFFFFFFFFFFFFF
#meta_data['cfr_dump_length'] = int.from_bytes(meta_data_string[46:50],byteorder='little') & 0xFFFFFFFF
# =============================================================================
# # MU meta data
# meta_data['is_mu_ppdu'] = int.from_bytes(meta_data_string[50:51],byteorder='little') & 0xFF
# meta_data['num_mu_users'] = int.from_bytes(meta_data_string[51:52],byteorder='little') & 0xFF
# =============================================================================
meta_data['peer_mac1'] = ''.join([f'{x:02x}'.upper() for x in meta_data_string[52:58]])
# =============================================================================
# meta_data['peer_mac2'] = ''.join([f'{x:02x}'.upper() for x in meta_data_string[58:64]])
# meta_data['peer_mac3'] = ''.join([f'{x:02x}'.upper() for x in meta_data_string[64:70]])
# meta_data['peer_mac4'] = ''.join([f'{x:02x}'.upper() for x in meta_data_string[70:76]])
# =============================================================================
# =============================================================================
# meta_data['chain0_raw_rssi'] = int.from_bytes(meta_data_string[76:80],byteorder='little')
# meta_data['chain1_raw_rssi'] = int.from_bytes(meta_data_string[80:84],byteorder='little')
# meta_data['chain2_raw_rssi'] = int.from_bytes(meta_data_string[84:88],byteorder='little')
# meta_data['chain3_raw_rssi'] = int.from_bytes(meta_data_string[88:92],byteorder='little')
# meta_data['chain4_raw_rssi'] = int.from_bytes(meta_data_string[92:96],byteorder='little')
# meta_data['chain5_raw_rssi'] = int.from_bytes(meta_data_string[96:100],byteorder='little')
# meta_data['chain6_raw_rssi'] = int.from_bytes(meta_data_string[100:104],byteorder='little')
# meta_data['chain7_raw_rssi'] = int.from_bytes(meta_data_string[104:108],byteorder='little')
# =============================================================================
# =============================================================================
# meta_data['rssi_pri20_all_chains1'] = int.from_bytes(meta_data_string[76:77],byteorder='little') & 0xFF
# meta_data['rssi_pri20_all_chains2'] = int.from_bytes(meta_data_string[80:81],byteorder='little') & 0xFF
# if meta_data['rssi_pri20_all_chains1'] > 127:
# meta_data['rssi_pri20_all_chains1'] = meta_data['rssi_pri20_all_chains1'] - 256
# if meta_data['rssi_pri20_all_chains2'] > 127:
# meta_data['rssi_pri20_all_chains2'] = meta_data['rssi_pri20_all_chains2'] - 256
# meta_data['rssi_pri20_all_chains3'] = int.from_bytes(meta_data_string[84:85],byteorder='little') & 0xFF
# meta_data['rssi_pri20_all_chains4'] = int.from_bytes(meta_data_string[88:89],byteorder='little') & 0xFF
# meta_data['rssi_pri20_all_chains5'] = int.from_bytes(meta_data_string[92:93],byteorder='little') & 0xFF
# meta_data['rssi_pri20_all_chains6'] = int.from_bytes(meta_data_string[96:97],byteorder='little') & 0xFF
# meta_data['rssi_pri20_all_chains7'] = int.from_bytes(meta_data_string[100:101],byteorder='little') & 0xFF
# meta_data['rssi_pri20_all_chains8'] = int.from_bytes(meta_data_string[104:105],byteorder='little') & 0xFF
# =============================================================================
# =============================================================================
# meta_data['phase_all_chains_degree1'] = (int.from_bytes(meta_data_string[108:110],byteorder='little') & 0xFFFF)*360/(2**10)
# meta_data['phase_all_chains_degree2'] = (int.from_bytes(meta_data_string[110:112],byteorder='little') & 0xFFFF)*360/(2**10)
# if meta_data['phase_all_chains_degree1'] > 350:
# meta_data['phase_all_chains_degree1'] = 0
# if meta_data['phase_all_chains_degree2'] > 350:
# meta_data['phase_all_chains_degree2'] = 0
# meta_data['phase_all_chains_degree3'] = (int.from_bytes(meta_data_string[112:114],byteorder='little') & 0xFFFF)*360/(2**10)
# meta_data['phase_all_chains_degree4'] = (int.from_bytes(meta_data_string[114:116],byteorder='little') & 0xFFFF)*360/(2**10)
# meta_data['phase_all_chains_degree5'] = (int.from_bytes(meta_data_string[116:118],byteorder='little') & 0xFFFF)*360/(2**10)
# meta_data['phase_all_chains_degree6'] = (int.from_bytes(meta_data_string[118:120],byteorder='little') & 0xFFFF)*360/(2**10)
# meta_data['phase_all_chains_degree7'] = (int.from_bytes(meta_data_string[120:122],byteorder='little') & 0xFFFF)*360/(2**10)
# meta_data['phase_all_chains_degree8'] = (int.from_bytes(meta_data_string[122:124],byteorder='little') & 0xFFFF)*360/(2**10)
#
# cfo_unsigned = int.from_bytes(meta_data_string[124:128], byteorder='little')
# if cfo_unsigned > (2**31-1):
# cfo_signed = cfo_unsigned - 2**32
# elif cfo_unsigned > (2**13-1):
# cfo_signed = cfo_unsigned - 2**14
#
# meta_data['cfo'] = cfo_signed
#
#
# meta_data['gain_index_all_chains1'] = int.from_bytes(meta_data_string[128:129], byteorder='little') & 0xFF
# meta_data['gain_index_all_chains2'] = int.from_bytes(meta_data_string[129:130], byteorder='little') & 0xFF
# =============================================================================
# =============================================================================
# meta_data['gain_index_all_chains3'] = int.from_bytes(meta_data_string[130:131], byteorder='little') & 0xFF
# meta_data['gain_index_all_chains4'] = int.from_bytes(meta_data_string[131:132], byteorder='little') & 0xFF
# meta_data['gain_index_all_chains5'] = int.from_bytes(meta_data_string[132:133], byteorder='little') & 0xFF
# meta_data['gain_index_all_chains6'] = int.from_bytes(meta_data_string[133:134], byteorder='little') & 0xFF
# meta_data['gain_index_all_chains7'] = int.from_bytes(meta_data_string[134:135], byteorder='little') & 0xFF
# meta_data['gain_index_all_chains8'] = int.from_bytes(meta_data_string[135:136], byteorder='little') & 0xFF
# =============================================================================
# =============================================================================
# meta_data['agc_gain_tbl_index1'] = int.from_bytes(meta_data_string[152:153], byteorder='little') & 0xFF
# meta_data['agc_gain_tbl_index2'] = int.from_bytes(meta_data_string[153:154], byteorder='little') & 0xFF
# meta_data['agc_gain_tbl_index3'] = int.from_bytes(meta_data_string[154:155], byteorder='little') & 0xFF
# meta_data['agc_gain_tbl_index4'] = int.from_bytes(meta_data_string[155:156], byteorder='little') & 0xFF
# meta_data['agc_gain_tbl_index5'] = int.from_bytes(meta_data_string[156:157], byteorder='little') & 0xFF
# meta_data['agc_gain_tbl_index6'] = int.from_bytes(meta_data_string[157:158], byteorder='little') & 0xFF
# meta_data['agc_gain_tbl_index7'] = int.from_bytes(meta_data_string[158:159], byteorder='little') & 0xFF
# meta_data['agc_gain_tbl_index8'] = int.from_bytes(meta_data_string[159:160], byteorder='little') & 0xFF
# =============================================================================
return meta_data
def released_cypress_read_cfr_ucode_header(data):
meta_data_string = data[160:216]
#parse_header_hex_info(meta_data_string)
meta_data = {}
# first 64 bits
packet_info1 = int.from_bytes(meta_data_string[:2],byteorder='little') & 0xFFFF #& 0xFF#取两个字节, byteorder='little'
binary_str1 = bin(packet_info1)[2:].zfill(16) #[2:]:去除0x
meta_data['tag'] = hex(int(binary_str1[8:16], 2))
meta_data['length'] = int(binary_str1[2:8], 2)
meta_data['reserved'] = int(binary_str1[0:2], 2)
packet_info2 = int.from_bytes(meta_data_string[2:4],byteorder='little') & 0xFFFF
binary_str2 = bin(packet_info2)[2:].zfill(16)
meta_data['upload_done'] = int(binary_str2[15:16], 2)
meta_data['capture_type'] = int(binary_str2[12:15], 2)
meta_data['preamble_type'] = int(binary_str2[10:12], 2)
meta_data['nss'] = int(binary_str2[7:10], 2)
meta_data['num_chains'] = int(binary_str2[4:7], 2)
meta_data['upload_pkt_bw'] = int(binary_str2[1:4], 2)
meta_data['sw_peer_id_valid'] = int(binary_str2[:1], 2)
meta_data['sw_peer_id'] = int.from_bytes(meta_data_string[4:6], byteorder='little') & 0xFFFF
meta_data['phy_ppdu_id'] = int.from_bytes(meta_data_string[6:8], byteorder='little') & 0xFFFF
# second 64 bits
meta_data['total_bytes'] = int.from_bytes(meta_data_string[8:10], byteorder='little') & 0xFFFF
packet_info = int.from_bytes(meta_data_string[12:14],byteorder='little') & 0xFFFF
binary_str = bin(packet_info)[2:].zfill(16)
meta_data['decimation_factor'] = int(binary_str[4:8], 2)
meta_data['original_heltf_type'] = int(binary_str[0:4], 2)
packet_info = int.from_bytes(meta_data_string[14:16],byteorder='little') & 0xFFFF
binary_str = bin(packet_info)[2:].zfill(16)
meta_data['reserved_5']=-1
meta_data['cbw']=-1
meta_data['punc_bitmap']=-1
meta_data['ext_preamble_type'] = int(binary_str[15:16], 2)
if meta_data['ext_preamble_type'] ==1:
meta_data['preamble_type'] = meta_data['ext_preamble_type'] + 4
if meta_data['preamble_type'] == 0:
meta_data['cbw'] = int(binary_str[3:7], 2)
meta_data['reserved_5'] = int(binary_str[1:3], 2)
elif meta_data['preamble_type'] == 5:
meta_data['punc_bitmap'] = int(binary_str[7:15], 2)
meta_data['reserved_5'] = int(binary_str[0:7], 2)
return meta_data