如何在Matlab中从图形中提取数据?

5
我已经将不同的Matlab图表保存在一个唯一的.fig文件中。该图表如下所示: picture 现在,我想在这些图表中引入一个滤波器以减少噪声,但不幸的是我丢失了生成这些信号的代码。
有没有办法提取此图表中每个信号的数据? 我尝试了以下方法:
open('ttc_delay1000.fig'); 
h = gcf; %current figure handle
axesObjs = get(h, 'Children');  %axes handles
dataObjs = get(axesObjs, 'Children'); %handles to low-level graphics objects in axes

objTypes = get(dataObjs, 'Type');  %type of low-level graphics object

xdata = get(dataObjs, 'XData');  %data from low-level grahics objects
ydata = get(dataObjs, 'YData');

但我很困惑,不知道这是否是正确的行为方式。谢谢!


1
是的,这段代码应该可以完成任务;但请记住,您已经失去了函数,并且只有有限数量的数据样本,因此您需要聪明地过滤/减少噪声。 - GameOfThrows
我猜我发布的答案不是你想要的... 你能更具体地说明期望的输出是什么吗?顺便更新一下问题? - user2271770
2
一种过滤高频噪声的残酷方式(我称之为查克·诺里斯)是:1/ 对信号进行fft - 2/ 将所有对应于高频的系数设置为0 - 3/ 对结果运行ifft以获得过滤后的信号。数学家或非查克·诺里斯的粉丝强烈建议在fft步骤之后使用高斯低通滤波器。 - BillBokeey
1
@Betelgeuse 我已经添加了代码来平滑线系列。 - user2271770
1
你关于从图表中获取数据的问题已经得到了回答;询问过滤的问题是完全不同的问题。请另外开一个问题来询问。 - EelkeSpaak
显示剩余5条评论
1个回答

7
一个适用于你问题的一句话解决方案:
data = get(findobj(open('ttc_delay1000.fig'), 'Type','line'), {'XData','YData'});

这里有一些步骤(从内部调用到外部调用):
  • 打开文件;
  • 查找该行系列;
  • 返回数据。
data{n,1} 将包含第 nLineSeriesXData,而 data{n,2} 将包含该 LineSeriesYData
如果您想直接在图中平滑线条,那么思路是相同的:
    %//Prepare moving average filter of size N
    N = 5;
    f = @(x) filter(ones(1,N)/N, 1, x);

    %//Smooth out the Y data of the LineSeries
    hf = open('ttc_delay1000.fig');
    for hl = transpose(findobj(hf,'Type','line'))
            set(hl, 'YData', f(get(hl,'YData')));
    end;
    saveas(hf, 'ttc_delay1000_smooth.fig');

等等,findobj 还可以用于孙子节点?这些年我都在干什么啊! - BillBokeey
@BillBokeey 当第一个参数是图形句柄(或其数组)时,搜索确实仅限于这些句柄及其子级。 - user2271770

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接