You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

在App Designer的UIAxes上绘制滤波后时间序列数据遇阻

我帮你搞定MATLAB 2017b App Designer里的UIAxes绘图问题——核心症结就是必须明确指定绘图的目标UIAxes句柄,毕竟App的UI组件是封装在App对象里的,和普通脚本依赖当前轴的机制完全不一样。结合你的数据处理流程(加载数据→查看Welch谱→去趋势+陷波滤波),给你一步步的可落地方案:

解决方案:MATLAB 2017b App Designer 时间序列绘图与处理

1. 先理清App组件的句柄引用

首先在App Designer的设计视图里,给你的UIAxes和UITable设置清晰的Name属性(比如:时间序列显示轴叫TimeSeriesAxes,功率谱显示轴叫WelchSpectraAxes,陷波频率输入表格叫NotchFreqTable),这样在代码里就能通过App.xxx直接精准引用这些组件。

2. 加载数据并存储到App属性

在“加载数据”按钮的ButtonPushed回调里,把原始数据和时间向量存到App的属性中,方便后续所有处理步骤调用:

function LoadDataButtonPushed(app, event)
    [file, path] = uigetfile({'*.mat';'*.txt'}, '选择数据文件');
    if isequal(file,0) || isequal(path,0)
        return; % 用户取消选择时退出
    end
    fullPath = fullfile(path, file);
    % 假设你的数据文件包含Time(时间向量)和Data(原始时间序列)变量
    load(fullPath, 'Time', 'Data');
    % 存储到App属性,全局可用
    app.RawTime = Time;
    app.RawData = Data;
end

3. 绘制Welch功率谱到指定UIAxes

在查看功率谱的回调里,先计算功率谱的频率和功率值,然后强制指定UIAxes句柄绘图,绝对不要用gca这类依赖当前轴的函数:

function ShowWelchButtonPushed(app, event)
    % 从App属性读取原始数据
    rawData = app.RawData;
    % 计算Welch功率谱(根据你的采样率调整参数,这里假设采样率1000Hz)
    [powerSpec, freqVec] = pwelch(rawData, [], [], [], 1000);
    % 清空目标轴并绘图
    cla(app.WelchSpectraAxes);
    plot(app.WelchSpectraAxes, freqVec, 10*log10(powerSpec)); % 第一个参数必须是UIAxes对象
    % 给轴添加标签(同样要指定目标轴)
    xlabel(app.WelchSpectraAxes, '频率 (Hz)');
    ylabel(app.WelchSpectraAxes, '功率谱密度 (dB/Hz)');
    title(app.WelchSpectraAxes, 'Welch功率谱');
end

4. 去趋势+陷波滤波后绘制时间序列

从UITable读取用户输入的陷波频率,处理数据后同样指定目标UIAxes完成绘图:

function ProcessDataButtonPushed(app, event)
    % 1. 读取UITable中的陷波频率(假设表格仅一列存储频率值)
    notchFreqs = cell2mat(app.NotchFreqTable.Data);
    if isempty(notchFreqs)
        warndlg('请先输入陷波频率');
        return;
    end
    % 2. 去趋势处理
    detrendData = detrend(app.RawData);
    % 3. 陷波滤波(用IIR陷波,采样率假设1000Hz,品质因数Q可调整)
    fs = 1000;
    Q = 30;
    filteredData = detrendData;
    for freq = notchFreqs
        [b,a] = iirnotch(freq/(fs/2), Q);
        filteredData = filtfilt(b,a, filteredData); % 零相位滤波
    end
    % 4. 绘制处理后的时间序列到指定UIAxes
    cla(app.TimeSeriesAxes);
    plot(app.TimeSeriesAxes, app.RawTime, filteredData);
    xlabel(app.TimeSeriesAxes, '时间 (s)');
    ylabel(app.TimeSeriesAxes, '幅值');
    title(app.TimeSeriesAxes, '去趋势+陷波滤波后时间序列');
end

2017b版本特有注意事项

  • 所有和轴相关的操作(plotxlabelclahold等)必须把UIAxes对象作为第一个参数传入,2017b还不支持后续版本更简洁的语法。
  • 绝对不要使用gcagcf这类获取当前轴/图的函数,App的UIFigure默认不是当前图形窗口,会导致绘图跑到外部窗口。
  • UITable的Data属性是cell数组,必须用cell2mat转成数值数组才能用于滤波计算。
  • 如果绘图后看不到内容,可以手动设置轴范围:xlim(app.TimeSeriesAxes, [min(app.RawTime) max(app.RawTime)])

内容的提问来源于stack exchange,提问作者B K

火山引擎 最新活动