appwyp 2023-03-01 12:22 采纳率: 43.8%
浏览 109
已结题

matlab gui 读入文本数据并显示波形和频谱

要开发一个基于 matlab gui 从文本文件读入信号数据 并显示信号和频谱

  1. 点击一个按钮来 选择一个文本文件读入两个信号 如下
    851531 1337831
    851505 1337801
    851539 1337838

  2. 用两个Axes 动态的显示这个两个信号 , 数据采样频率是 120 Hz, 长度是 3分钟 共计 21600 条数据

  3. 用两个Axes 动态显示这个信号频谱 就是 fft 变换

  4. 还需两个按钮 start 和 stop 来开始或者停止显示信号 和频谱

  5. 最好用到定时器

感兴趣朋友可以来索取 文本数据文件 我的邮箱 如下 或者留下您的联系方式,谢谢。

mbdbk@qq.com 

  • 写回答

6条回答 默认 最新

  • 「已注销」 2023-03-01 12:44
    关注

    参考GPT和自己的思路,下面是一个简单的 Matlab GUI 程序实现你的需求。该程序包括一个主窗口,其中有两个按钮 "Select File" 和 "Stop",以及四个 axes 组件分别用于显示两个信号的时域波形和频谱。

    程序实现步骤如下:

    1 创建 GUI 窗口并定义需要用到的变量

    function myGUI
    % 创建 GUI 窗口并定义需要用到的变量
    
    % 创建主窗口
    f = figure('Visible','off','Position',[360,500,600,400]);
    
    % 定义需要用到的变量
    fs = 120;         % 采样频率
    T = 3*60;         % 信号长度(秒)
    N = fs*T;         % 信号长度(采样点数)
    t = (0:N-1)/fs;   % 时间向量
    data = [];        % 存储读入的信号数据
    timer_interval = 0.05;   % 定时器触发间隔
    timer1 = timer('ExecutionMode', 'fixedRate', 'Period', timer_interval, 'TimerFcn', @updatePlot);  % 定义定时器1
    timer2 = timer('ExecutionMode', 'fixedRate', 'Period', timer_interval, 'TimerFcn', @updateFFT);   % 定义定时器2
    isRunning = false;   % 用于判断程序是否在运行
    stopFlag = false;    % 用于停止定时器
    
    % 定义 UI 控件
    btn_select_file = uicontrol('Style', 'pushbutton', 'String', 'Select File', 'Position', [10 350 80 30], 'Callback', @selectFile);
    btn_stop = uicontrol('Style', 'pushbutton', 'String', 'Stop', 'Position', [100 350 80 30], 'Callback', @stopTimer);
    ax1 = axes('Units','pixels','Position',[60,60,250,250]);
    ax2 = axes('Units','pixels','Position',[350,60,250,250]);
    
    % 显示 GUI 窗口
    f.Visible = 'on';
    end
    

    2 创建回调函数

    % 回调函数1:读入文件并显示时域波形
    function selectFile(~,~)
    % 选择文本文件
    [filename, path] = uigetfile('*.txt', 'Select a text file');
    if isequal(filename,0)
       return;
    end
    
    % 读入文件
    fid = fopen(fullfile(path,filename),'r');
    data = fscanf(fid,'%f %f\n',[2 inf]);
    fclose(fid);
    
    % 在 axes1 中显示信号1
    axes(ax1);
    plot(t, data(1,:), 'r');
    xlim([0 max(t)]);
    xlabel('Time (s)');
    ylabel('Amplitude');
    title('Signal 1');
    
    % 在 axes2 中显示信号2
    axes(ax2);
    plot(t, data(2,:), 'b');
    xlim([0 max(t)]);
    xlabel('Time (s)');
    ylabel('Amplitude');
    title('Signal 2');
    
    % 启动定时器
    if ~isRunning
        startTimer();
    end
    end
    
    % 回调函数2:定时器1触发,更新时域波形
    function updatePlot(~,~)
    if stopFlag
    stopTimer();
    return;
    end
    
    % 更新时域波形
    axes(ax1);
    xlim([max(0, t(end)-T), t(end)]);
    plot(t, data(1,:), 'r');
    xlabel('Time (s)');
    ylabel('Amplitude');
    title('Signal 1');
    
    axes(ax2);
    xlim([max(0, t(end)-T), t(end)]);
    plot(t, data(2,:), 'b');
    xlabel('Time (s)');
    ylabel('Amplitude');
    title('Signal 2');
    end
    
    % 回调函数3:定时器2触发,更新频谱
    function updateFFT(,)
    if stopFlag
    stopTimer();
    return;
    end
    
    % 计算频谱
    S1 = fft(data(1,:));
    S2 = fft(data(2,:));
    f = (0:N-1)*(fs/N);
    
    % 更新频谱
    axes(ax1);
    plot(f, abs(S1), 'r');
    xlim([0 fs/2]);
    xlabel('Frequency (Hz)');
    ylabel('Magnitude');
    title('Spectrum of Signal 1');
    
    axes(ax2);
    plot(f, abs(S2), 'b');
    xlim([0 fs/2]);
    xlabel('Frequency (Hz)');
    ylabel('Magnitude');
    title('Spectrum of Signal 2');
    end
    
    % 回调函数4:启动定时器
    function startTimer(,)
    if isempty(data)
    return;
    end
    isRunning = true;
    start(timer1);
    start(timer2);
    end
    
    % 回调函数5:停止定时器
    function stopTimer(,)
    stopFlag = true;
    stop(timer1);
    stop(timer2);
    isRunning = false;
    end
    

    3 运行程序

    将上面的代码保存为一个 Matlab 脚本文件,运行该文件即可启动 GUI 程序。在 GUI 窗口中点击 "Select File" 按钮,选择文本文件并加载数据。然后点击 "Stop" 按钮即可停止程序运行。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(5条)

报告相同问题?

问题事件

  • 系统已结题 3月10日
  • 已采纳回答 3月2日
  • 赞助了问题酬金100元 3月1日
  • 创建了问题 3月1日

悬赏问题

  • ¥15 远程桌面文档内容复制粘贴,格式会变化
  • ¥15 关于#java#的问题:找一份能快速看完mooc视频的代码
  • ¥15 这种微信登录授权 谁可以做啊
  • ¥15 请问我该如何添加自己的数据去运行蚁群算法代码
  • ¥20 用HslCommunication 连接欧姆龙 plc有时会连接失败。报异常为“未知错误”
  • ¥15 网络设备配置与管理这个该怎么弄
  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题