IWR1843BOOST: IWR1843BOOST和DCA1000EVM检测目标距离误差为5cm

Part Number: IWR1843BOOST
Other Parts Discussed in Thread: DCA1000EVM,

使用IWR1843BOOST和DCA1000EVM对某些目标进行检测:第一个目标是墙,通过移动雷达,从而改变雷达到墙的距离,采集到信号后进行处理,在峰值处显示的距离总比实际距离大5cm;第二个目标是木板,在峰值处的距离总比实际距离大6-7cm.

处理过程中利用TI官方的示例代码解析二进制文件,再将数据重塑为4D矩阵[天线数, 采样点数, 每帧chirp数, 总帧数],然后进行如下代码的处理

请问是什么原因导致的这个问题啊?是代码错误,还是硬件原因啊?

  • 已经收到了您的案例,调查需要些时间,感谢您的耐心等待。

  • 当前使用的配置的距离分辨率是多少?
    无论采用何种chirp configuration,是否都会出现这种现象?

  • BW = numADCSamples / (config_SampleRate_ksps * 1e3) * (config_FrequencySlope_MHz_us * 1e12);

    rangeBin = 3e8 / BW / 2 = 0.0733米;

    根据参数配置,采用以上公式计算出来的距离分辨率是0.0733米。目前仅配置了一种chirp进行检测。

    请问检测精度都和哪些因素有关系啊,怎样尽量提高检测精度啊

  • 在区分不同距离的物体时,距离分辨率是最关键的因素。如果场景中只有一个目标,或许可以尝试稍作调整的场景和材质,此时获得的误差范围是否仍能稳定地接近距离分辨率的数值?

  • 我又配置了另一种chirp,距离分辨率是0.0431米。检测场景中只有一个目标,目标分别为墙壁、书、木板、塑料板,从雷达数据中得到的距离和实际距离基本都是相差5厘米左右。

    采集到数据,用matlab进行bin文件解析、FFT等处理,最终得到以距离为横轴,幅度为纵轴的图像。在这个图像中峰值处的数值就是代表的是雷达到目标的距离值吗?还是说代表的是 [ 数值,数值+距离分辨率 ) 这个范围啊

  • 我不确定您具体如何处理距离数据,但似乎实际检测距离与距离分区值几乎总是存在一个分区的偏差。距离分辨率仅在场景中存在多个物体时才适用。以5厘米距离分辨率为例,两个物体必须相距至少5厘米才能形成两个独立峰值。距离区间0涵盖0-5厘米范围,区间1为5-10厘米,区间2为10-15厘米,依此类推。您似乎始终偏离一个距离区间。若将测量值减去一个距离分辨率的距离值后,所得结果是否准确且符合预期?

  • clear; 
    clc; 
    close all; 
    %% 步骤1:解析原始二进制数据
    fileName = 'adc_data5.bin'; % 待解析的二进制数据文件
    adcResult = readDCA1000(fileName); % 调用自定义解析函数,返回[numRX, 总采样数]的复数矩阵
    % 验证解析结果,输出关键信息便于核对
    fprintf('成功读取文件:%s\n', fileName);
    [numRX, totalSamples] = size(adcResult);
    fprintf('解析后数据维度:%d 个接收天线 × %d 个总采样点\n', numRX, totalSamples);
    save('adc_result.mat', 'adcResult');
    fprintf('解析后的数据已保存为adc_result.mat\n');
    fprintf('=======================================================\n');
    %% 步骤2:配置雷达核心参数
    % fopen:打开JSON配置文件,返回文件标识符jsonFileId和可能的错误信息errMsg;'r':以只读模式打开文件
    [jsonFileId, errMsg] = fopen('C:\Users\ygw\Desktop\data\2026.1.18\2026.1.18.mmwave.json', 'r');
    % fscanf:读取文件中的所有文本内容;'%s':格式字符串,表示读取为字符串
    rawJsonText = fscanf(jsonFileId, '%s');
    % 关闭已打开的JSON文件
    fclose(jsonFileId);
    % 将JSON格式的文本解析为MATLAB结构体
    mmwParams = jsondecode(rawJsonText);
    % 从结构体中提取ADC输出格式
    addFmt = mmwParams.mmWaveDevices.rfConfig.rlAdcOutCfg_t.fmt.b2AdcOutFmt;
    % 提取chirp配置参数
    rfProfileCfg = mmwParams.mmWaveDevices.rfConfig.rlProfiles.rlProfileCfg_t;
    % 提取帧配置参数
    frameCfg = mmwParams.mmWaveDevices.rfConfig.rlFrameCfg_t;
    % 针对性对各参数进行赋值
    config_Frame_Period_ms = frameCfg.framePeriodicity_msec; % 帧周期ms,包含空闲时间
    config_frameChirpNum = frameCfg.numLoops; % 每帧包含的Chirp数量
    config_numADCSamples = rfProfileCfg.numAdcSamples; % 每个Chirp的采样点数量
    config_SampleRate_ksps = rfProfileCfg.digOutSampleRate; % ADC采样率,单位ksps
    config_FrequencySlope_MHz_us = rfProfileCfg.freqSlopeConst_MHz_usec; % 调频斜率
    config_RampEndTime_us = rfProfileCfg.rampEndTime_usec; % 调频结束时间/chirp
    config_IdleTime_us = rfProfileCfg.idleTimeConst_usec; % 空闲时间/chirp
    config_f_pass_Hz = 10; % 低通截止频率(根据目标振动频率调整,通常<100Hz)
    %% 步骤3:雷达数据完整性验证
    numADCSamples = config_numADCSamples; % 每个Chirp的ADC采样点数
    frameChirpNum = config_frameChirpNum; % 每帧包含的Chirp数
    % 确保总Chirp数为frameChirpNum(每帧包含的Chirp数量)的整数倍
    numChirps_original = totalSamples / numADCSamples; % 计算原始总Chirp数
    numFrames = floor(numChirps_original / frameChirpNum); % 计算帧数,向下取整,确保帧数为整数
    % 重新计算实际使用的总Chirp数
    numChirps = numFrames * frameChirpNum; % 整数倍的Chirp数
    % 如果数据不完整,截断多余数据
    if numChirps < numChirps_original
    fprintf('注意:原始数据有%.2f个Chirp,使用前%d个Chirp(共%d帧)\n', numChirps_original, numChirps, numFrames);
    fprintf('丢弃最后%d个Chirp\n', round(numChirps_original - numChirps));
    end
    fprintf('数据总Chirp数:%d,每帧Chirp数:%d,总帧数:%d\n', numChirps, frameChirpNum, numFrames);
    fprintf('=======================================================\n');
    %% 步骤4:数据重塑为4D矩阵(适配雷达信号处理标准格式)
    % 截断数据以确保可正确reshape
    totalSamples_required = numChirps * numADCSamples; % 计算需要保留的总采样点数
    % 如果原始数据有多余,进行截断
    if size(adcResult, 2) > totalSamples_required
    adcResult = adcResult(:, 1:totalSamples_required);
    fprintf('数据已截断:保留前%d个采样点(%d个Chirp)\n', totalSamples_required, numChirps);
    end
    % 将原始数据重塑为4D:[天线数, 采样点数, 每帧chirp数, 总帧数]
    temp_4D = reshape(adcResult, [numRX, numADCSamples, frameChirpNum, numFrames]);
    % 然后调整维度顺序为:[采样点数, 每帧chirp数, 天线数, 总帧数]
    radardata_reshaped = permute(temp_4D, [2, 3, 1, 4]);
    % 输出4D矩阵维度信息
    fprintf('4D矩阵维度:[采样点数, 每帧chirp数, 天线数, 总帧数] = [%d, %d, %d, %d]\n', ...
    size(radardata_reshaped, 1), size(radardata_reshaped, 2), size(radardata_reshaped, 3), size(radardata_reshaped, 4));
    % 验证数据重塑的正确性
    fprintf('数据验证:\n');
    fprintf(' 第一帧第一根天线第一个采样点: %.6f + %.6fi\n', ...
    real(radardata_reshaped(1, 1, 1, 1)), imag(radardata_reshaped(1, 1, 1, 1)));
    fprintf(' 最后一帧最后一根天线最后一个采样点: %.6f + %.6fi\n', ...
    real(radardata_reshaped(end, end, end, end)), imag(radardata_reshaped(end, end, end, end)));
    % 保存为mat文件(保留变量名和数据类型)
    save('radardata_4DReshaped.mat', 'radardata_reshaped', '-v7.3');
    fprintf('雷达重塑数据已保存到 radardata_4DReshaped.mat\n');
    fprintf('=======================================================\n');
    %% 步骤5:距离多普勒图
    % 距离分辨单元宽度
    BW = numADCSamples / (config_SampleRate_ksps * 1e3) * (config_FrequencySlope_MHz_us * 1e12); % 带宽不要使用mmWave Studio软件中计算的Bandwidth,实际BW=采样点数/采样率*调频斜率
    rangeBinWidth = 3e8 / BW / 2; % 距离分辨率单元宽度(未补零)
    % 多普勒分辨单元宽度
    PRT = (config_IdleTime_us + config_RampEndTime_us) * 1e-6;
    % 1.距离多普勒图-未补零
    c = 3e8; % 光速
    fc = 77e9; % 雷达中心频率
    lambda = c / fc; % 波长
    ymax = lambda / 2 / PRT; % 计算最大不模糊速度(根据PRT计算)
    y1 = ((1 : numADCSamples) - 1) * rangeBinWidth; % 创建距离轴:每个采样点对应的距离
    x1 = ((1 : frameChirpNum) - 1) * (ymax / frameChirpNum); % 创建速度轴:每个chirp对应的速度
    [X1, Y1] = meshgrid(x1, y1); % 创建网格用于3D绘图
    % 提取第一帧第一根天线的数据进行分析
    dataRDM = squeeze(radardata_reshaped(:, :, 1, 1)); % 快时间采样点数 × 脉冲数(chirp数)
    % 进行2D FFT:第一个维度FFT(距离维),第二个维度FFT(多普勒维)
    RDdata = squeeze(dataRDM); % 移除矩阵中维度为1的维度
    % 绘制距离-多普勒图
    figure(1);
    mesh(X1, Y1, abs(fft2(RDdata)));
    xlabel('X轴:速度(米/秒)' , 'FontSize' , 10);
    ylabel('Y轴:距离(米)' , 'FontSize' , 10);
    title('距离-多普勒图' , 'FontSize' , 12);
    以上是我处理雷达数据的代码,可不可以帮忙看一下代码,是否是代码原因导致的存在的测量误差