This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

IWR6843ISK: IWR6843ISK+DCA1000EVM收到的IQ数据无法输出RDM图

Part Number: IWR6843ISK
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的分享