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的分享