【问题标题】:Plotting Eye Diagram from ADS Data in MATLAB在 MATLAB 中根据 ADS 数据绘制眼图
【发布时间】:2018-08-17 14:20:34
【问题描述】:

我有一个 data file (Sample_Eye_1.txt),它是从 ADS Keysight 的仿真图中获得的。它有 3 个字段 - "Index", "Time" and "Voltage"。现在眼图将是voltage vs time。只有不同的指标,可以同时有不同的电压。所以索引可以看作是一个数据过滤字段或类似的字段。 ADS仿真中的情节如下

可以看到线图的绘制就像叠加在不同的线上一样。

现在,当我在 MATLAB voltage vs time 中绘制数据时,它不会以某种方式叠加。这是我的 matlab 代码的绘图生成图,它只是简单的 xy 图。

我的 MATLAB 代码:

% open data file
fid = fopen('Sample_Eye_1.txt');

% Read data in from csv file
readData = textscan(fid,'%f %f %f','Headerlines',1,'Delimiter',',');

% Extract data from readData
index_Data = readData{1,1}(:,1);
xData = readData{1,2}(:,1);
yData = readData{1,3}(:,1);

% Plot Data
f1 = figure(1);
cla; hold on; grid on;
%set(gca, 'XTick',[0 5 10 15 20 25 30]);
%set(gca,'XTick',0:0.1e-8:1e-8)
%set(gca,'XTickLabel',0:1:10)
plot(xData,yData,'r-');

title('Eye Diagram')
xlabel('Time(ns)')
ylabel('Density(V)')

谁能帮我生成类似于 ADS 模拟图的图?

注意:数据很大(大约 2.7 Mb)。如果我截断数据,问题就无法完全理解。

【问题讨论】:

    标签: matlab plot graph curve


    【解决方案1】:

    您的代码很好,问题在于您绘制数据的方式。

    plot(xData,yData,'r-');
    

    用一条线段连接所有点,这意味着当线穿过它们时,眼图的“孔”是“闭合的”。

    你可以得到预期的情节,只需用“点”改变“线”

    plot(xData,yData,'r.')
    

    如果您想要一个与参考更“相似”的图,您可以识别具有相同索引的输入点并在循环中绘制它们(同样,使用“点”),在每次迭代中,您可以改变点的颜色。

    在下面,您可以找到代码的更新版本,其中循环用于绘制数据。

    编辑以回复评论

    通常,您可以通过指定颜色的“名称”或其 RGB 三元组 (ref. to the "plot" function documentation for the details) 来设置 color 属性来指定标记的颜色。

    在您的情况下,“唯一”索引是 16,而颜色的可用“名称”只有 8,因此您必须通过明确定义 RGB 三元组来定义 16 种颜色(这可能很无聊)。

    请注意,您的大部分数据对应于前三个索引,因此,您可以定义三种颜色并让另一种是随机的。

    在代码的更新版本中我使用了这种方法,定义矩阵dot_color如下

    dot_color=[0 0 .5
               .5 .9 .9
               0.9 .5 0
               rand(length(uni_idx-3),3)]
    

    这意味着,我选择了前三种颜色并为其他颜色使用随机数。

    当然,您也可以“手动定义其他颜色(矩阵中每个条目的值应介于 0 和 1 之间)。

    fid = fopen('Sample_Eye_1.txt');
    % Read data in from csv file
    readData = textscan(fid,'%f %f %f','Headerlines',1,'Delimiter',',');
    fclose(fid)
    
    % Extract data from readData
    index_Data = readData{1,1}(:,1);
    % Identify the unique indices
    uni_idx=unique(index_Data);
    
    xData = readData{1,2}(:,1);
    yData = readData{1,3}(:,1);
    
    
    % Plot Data
    f1 = figure(1);
    cla; hold on; grid on;
    %set(gca, 'XTick',[0 5 10 15 20 25 30]);
    %set(gca,'XTick',0:0.1e-8:1e-8)
    %set(gca,'XTickLabel',0:1:10)
    % plot(xData,yData,'r-');
    % Loop over the indices to plot the corresponding data
    
    % Define the color of the dots
    dot_color=[0 0 .5
               .5 .9 .9
               0.9 .5 0
               rand(length(uni_idx-3),3)]
    for i=1:length(uni_idx)
       idx=find(index_Data == uni_idx(i));
    %    plot(readData{1,2}(idx,1),readData{1,3}(idx,1),'.')
       plot(readData{1,2}(idx,1),readData{1,3}(idx,1),'.','color',dot_color(i,:))
    end
    
    
    title('Eye Diagram')
    xlabel('Time(ns)')
    ylabel('Density(V)')
    

    【讨论】:

    • 非常感谢您的努力。我喜欢带有循环的解决方案。我有一个循环的想法,但无法弄清楚如何制作唯一索引向量。也感谢您编辑问题。我实际上试图将图片放在帖子中,但后来认为这会使问题变得太长。我有另一个问题。在循环内部,我可以根据需要制作绘图颜色吗?就像每个唯一索引一样,颜色将由我定义,而不是程序插入的默认颜色。你能帮我解决这个问题吗?这是我需要的最后帮助。再次感谢!
    • 请注意,正如我在答案中所写,您的原始代码的问题不是“缺少”循环,而是使用了 line insetead 的 dot in plot 函数。不过,我已经更新了代码,现在它允许使用“用户定义”颜色。
    猜你喜欢
    • 2013-05-20
    • 1970-01-01
    • 1970-01-01
    • 2014-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-22
    相关资源
    最近更新 更多