Matlab眼图代码无法正常绘制问题排查求助
PAM4眼图绘制问题排查与修复
代码中的核心错误
你的Matlab代码存在几个关键逻辑错误,导致绘制出直线而非眼图:
变量定义完全错误
samplesPerBit = size(data, 1);错误地将数据集总采样数当成了单个比特的采样数,实际UI=10才是每个PAM4符号的采样数。numBits = size(data, 1);同样错误,总采样数不等于比特数,PAM4每个符号对应2比特,总符号数应为floor(totalSamples / UI)。
波形切片逻辑混乱
原代码的双重循环会把整个电压序列重复切割numBits次,导致所有cutWaveform行的内容完全一致,叠加后自然是一条直线。眼图的核心是将每个符号周期的波形对齐到同一时间轴叠加,而非重复切割整个序列。
修正后的代码
data = readmatrix('PAM4.csv', 'NumHeaderLines', 1); voltage = data(:, 2); UI = 10; % 每个PAM4符号周期的采样数 totalSamples = size(data, 1); numSymbols = floor(totalSamples / UI); % 计算总符号数 % 提取每个符号周期的波形片段 symbolWaveforms = zeros(numSymbols, UI); for k = 1:numSymbols startIdx = (k-1)*UI + 1; endIdx = startIdx + UI - 1; symbolWaveforms(k, :) = voltage(startIdx:endIdx); end % 绘制眼图:所有符号波形对齐到同一时间轴叠加 figure; hold on; timeAxis = 0:UI-1; % 符号内的采样点时间索引 for k = 1:numSymbols plot(timeAxis, symbolWaveforms(k, :), 'b', 'LineWidth', 0.5); end title('PAM4眼图'); xlabel('符号内采样点索引'); ylabel('电压幅值'); grid on; hold off;
额外排查点
- 数据集规模:如果
numSymbols小于100,叠加的波形数量太少,眼图会模糊甚至像直线。建议Java生成至少几千个PAM4符号的数据。 - CSV数据有效性:检查CSV文件中电压列是否有重复值或异常值,若所有电压值一致,自然只会画出直线。
- UI匹配性:确认Java生成数据时,每个PAM4符号对应的采样数确实是10,UI不匹配会导致波形切片错位。
内容的提问来源于stack exchange,提问作者richiew726
相关产品推荐
相关产品推荐

