Other Parts Discussed in Thread: DCA1000EVM,
import numpy as np
import matplotlib.pyplot as plt
from scipy.fft import fft, fft2
import warnings
# 忽略字体缺失警告
warnings.filterwarnings("ignore", category=UserWarning, message="Glyph 8722.*")
def read_radar_bin_data(file_path, data_type=np.complex128, num_channels=2,
num_range_bins=256, num_pulses=128):
"""读取雷达原始bin数据文件"""
try:
# 从二进制文件读取数据
raw_bytes = np.fromfile(file_path, dtype=data_type)
# 检查数据长度是否符合预期
expected_length = num_pulses * num_range_bins * num_channels
if len(raw_bytes) != expected_length:
print(f"警告: 数据长度({len(raw_bytes)})与预期({expected_length})不符")
# 截断或填充数据以匹配预期长度
if len(raw_bytes) > expected_length:
raw_bytes = raw_bytes[:expected_length]
else:
raw_bytes = np.pad(raw_bytes, (0, expected_length - len(raw_bytes)))
# 重塑数据为 [num_pulses, num_range_bins, num_channels]
raw_data = raw_bytes.reshape(num_pulses, num_range_bins, num_channels)
# 转换为复数形式 (假设双通道分别为I/Q)
complex_data = raw_data[:, :, 0] + 1j * raw_data[:, :, 1]
return complex_data
except Exception as e:
print(f"读取文件时出错: {e}")
return None
def range_processing(raw_data, window='hanning'):
"""距离维处理(距离FFT)"""
num_pulses, num_range_bins = raw_data.shape
# 应用窗函数减少频谱泄漏
if window == 'hamming':
range_window = np.hamming(num_range_bins)
elif window == 'hanning':
range_window = np.hanning(num_range_bins)
else:
range_window = np.ones(num_range_bins)
# 对每个脉冲的距离维数据应用窗函数并FFT
range_procced_data = np.zeros_like(raw_data, dtype=complex)
for i in range(num_pulses):
range_procced_data[i, :] = fft(raw_data[i, :] * range_window)
return range_procced_data
def doppler_processing(range_data, window='hanning'):
"""多普勒维处理(多普勒FFT)"""
num_pulses, num_range_bins = range_data.shape
# 应用窗函数
if window == 'hamming':
doppler_window = np.hamming(num_pulses)
elif window == 'hanning':
doppler_window = np.hanning(num_pulses)
else:
doppler_window = np.ones(num_pulses)
# 对每个距离门的多普勒维数据应用窗函数并FFT
rdm = np.zeros((num_pulses, num_range_bins), dtype=complex)
for i in range(num_range_bins):
rdm[:, i] = fft(range_data[:, i] * doppler_window)
# 将零频移至中心
rdm = np.fft.fftshift(rdm, axes=0)
return rdm
def amplitude_filtering(rdm, threshold):
"""幅度滤波"""
rdm_abs = np.abs(rdm)
mask = rdm_abs < threshold
rdm[mask] = 0
return rdm
def visualize_rdm(rdm, title="Range-Doppler Map", log_scale=True, save_path=None):
"""可视化RDM特征图"""
# 设置中文字体,这里以SimHei为例,可根据系统更换
plt.rcParams["font.family"] = "SimHei"
# 计算幅度
rdm_abs = np.abs(rdm)
# 应用对数缩放以增强弱目标显示
if log_scale:
rdm_db = 20 * np.log10(rdm_abs + 1e-10) # 防止对数计算零值
vmin = np.percentile(rdm_db, 5)
vmax = np.percentile(rdm_db, 95)
else:
rdm_db = rdm_abs
vmin = 0
vmax = np.percentile(rdm_db, 95)
# 创建图像
plt.figure(figsize=(10, 8))
plt.imshow(rdm_db, aspect='auto', cmap='jet', origin='lower',
extent=[0, rdm.shape[1], -rdm.shape[0] / 2, rdm.shape[0] / 2],
vmin=vmin, vmax=vmax)
plt.colorbar(label='幅度 (dB)' if log_scale else '幅度')
plt.xlabel('距离门')
plt.ylabel('多普勒频移 (归一化单位)')
plt.title(title)
plt.grid(False)
if save_path:
plt.savefig(save_path, dpi=300, bbox_inches='tight')
plt.show()
def main():
# 参数配置 - 根据实际雷达数据调整
file_path = "./raw_data/fall_aside/fall_aside1.bin" # 替换为实际的bin文件路径
data_type = np.complex128 # 数据类型,可能是float32, int16等
num_channels = 2 # 通道数,通常为2 (I/Q)
num_range_bins = 256 # 距离门数量
num_pulses = 128 # 脉冲数
# 读取雷达原始bin数据
print(f"正在读取雷达数据文件: {file_path}")
raw_data = read_radar_bin_data(
file_path,
data_type=data_type,
num_channels=num_channels,
num_range_bins=num_range_bins,
num_pulses=num_pulses
)
if raw_data is None:
print("无法读取数据,程序退出")
return
# 距离处理
print("正在进行距离维处理...")
range_data = range_processing(raw_data, window='hanning')
# 多普勒处理
print("正在进行多普勒维处理...")
rdm = doppler_processing(range_data, window='hanning')
# 可视化RDM
print("正在显示RDM特征图...")
visualize_rdm(rdm, title="Range-Doppler Map (RDM) after amplitude filtering")
# 可选:保存RDM数据
# np.save('rdm_result.npy', rdm)
if __name__ == "__main__":
main()
应用IWR6843ISK与DCA1000EVM采集的IQ原始数据,但无法进行RDM计算,其算出的图形非常失真,好像全是杂音,无法进行滤波消除通过网盘分享的文件:屏幕截图 2025-05-27 004832.jpg等3个文件
链接: pan.baidu.com/.../1Xj2muv6RLBxmO5q035HXcA 提取码: 4n8k
--来自百度网盘超级会员v9的分享