初始化项目

This commit is contained in:
zeaslity
2025-03-27 16:09:20 +08:00
parent e09a32d1e8
commit fc2d585489
709 changed files with 516391 additions and 0 deletions

View File

@@ -0,0 +1,142 @@
import numpy as np
from scipy import signal
class AoAConverter:
def __init__(self):
self.p = [1e8, 1e8, 1e8]
def to_cartesian(self, theta_rad, phi_rad):
# theta_rad = np.radians(theta)
# phi_rad = np.radians(phi)
# 注意!程序输入的是弧度单位
"""将球坐标转换为直角坐标"""
x = np.sin(theta_rad) * np.cos(phi_rad)
y = np.sin(theta_rad) * np.sin(phi_rad)
z = np.cos(theta_rad)
pc =np.array([x,y,z])
return pc
def calc_error(self, pc, mc):
# 计算预测坐标与实际观测坐标之间的差的平方
mc = np.expand_dims(mc, axis=1)
diff_squared = (pc - mc) ** 2
# 对差值的平方求和,得到误差的平方
error_squared = np.sum(diff_squared, axis=0)
# 开平方根得到误差
return np.sqrt(error_squared)
import numpy as np
def find_best_r(self, theta, phi, mc, r_range):
"""在给定范围内搜索最优的 r 值"""
# 将 r_range 转换为 NumPy 数组,以便进行矢量化操作
r_values = np.array(r_range)
# 计算所有可能的直角坐标
pc = self.to_cartesian(theta, phi)
# 进行维度扩充以进行矩阵乘法
r_values = np.expand_dims(r_values, axis=0)
pc = np.expand_dims(pc, axis=1)
# 计算所有 r 值对应的误差
# print([pc.shape,r_values.shape])
D = np.dot(pc, r_values)
errors = self.calc_error(D, mc)
r_values = np.squeeze(r_values)
# 找到最小误差及其对应的 r 值
min_error = np.min(errors)
best_r = r_values[np.argmin(errors)] #因为多加了一维所以这里要反求0
return [best_r,min_error]
def projected_measure(self,theta, phi, r,p0):
pc = self.to_cartesian(theta, phi)
neo_p = r*pc + p0
return np.array(neo_p)
converter = AoAConverter()
def calculate_euclidean_distances(A, BX):
# 计算A和B之间的欧式距离
B = BX['data_matrix']
N = B.shape[0]
r_range = np.linspace(-5, 5, 100)
if BX.get('AOA_pos'):
# 若是来自AOA的数据则进行替换
sensor_pos = BX.get('AOA_pos')
ob_pos = A - sensor_pos
r0 = np.linalg.norm(ob_pos)
B_new = []
for i in range(N):
theta = B[i,0]
phi = B[i,1]
[best_r,min_error] = converter.find_best_r(theta, phi,ob_pos, r0+r_range)
print(min_error)
B_new.append(converter.projected_measure(theta, phi,best_r,sensor_pos))
B_new = np.array(B_new)
else:
B_new = B
distances = np.linalg.norm(A - B_new, axis=1)
# 找到最小距离及其索引
min_distance_index = np.argmin(distances)
min_distance = distances[min_distance_index]
return [min_distance, min_distance_index, B_new]
def are_lists_equal(listA, listB):
# 对两个列表中的子列表进行排序
if len(listA) == 0:
return False
sorted_listA = sorted(listA, key=lambda x: (x[0], x[1]))
sorted_listB = sorted(listB, key=lambda x: (x[0], x[1]))
# 比较排序后的列表是否相等
return sorted_listA == sorted_listB
def sigmoid(x, a=10, b=0.1):
# 调整Sigmoid函数使其在x=4时值为0.5
# a和b是调整参数用于控制函数的形状
return 1 / (1 + np.exp(-a * (x - 1))) + b
def calculate_correlation(A, B):
"""
计算两个数组矩阵所有列的相关系数的最大值。
参数:
A -- 第一个NumPy数组
B -- 第二个NumPy数组
"""
A = np.exp(-1j*A/50)
B = np.exp(1j*B/50)
corr_res = []
for col in range(3):
a = A[:, col]
b = B[:, col]
convolution = signal.convolve(a, b[::-1])
corr_res.append(convolution)
max_corr = np.sum(np.abs(np.array(corr_res)),0)
max_corr = np.max(max_corr)/3
return max_corr
def calculate_history_distances(target, b):
# 使用前后向的形式进行计算
A = target.m_history
v = target.v
# 计算每一行与向量b的差的L2范数欧氏距离
if A.shape[0] < 10:
return np.inf
local_time = np.linspace(0, 10, 20)
local_time = np.expand_dims(local_time, axis=1)
v = np.expand_dims(v, axis=1)
A_pre = A[-10:,0:3]
A_post = np.dot(local_time,v.T)
A_all = np.vstack((A_pre, A_post))
distances = np.linalg.norm(A_all - b, axis=1)
# 找到最小距离
min_distance = np.min(distances)
return min_distance