Simulink搭模型做数据采样并做数据分析(MatLab)

1 篇文章 0 订阅
1 篇文章 0 订阅


前言

本算法是在一组数据中取当前时间前相同间隔(T_iner)的一组数(length),然后算出这组数的平均数,方差,超过A1,A2的比率。做完处理后继续更新数组,将新采的数取代旧数。每更替一次做一次数据分析。

一、Simulink模型

示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。
模型还是比较简单的,开关的上面接入是需要处理的源数据,中间接入的是state,state为1是,源数据有效,state为0时,源数据无效记0.所以中间添加了一个开关模块。中间有一个模块是matlab function模块,是为了处理源数据。输出端接了一个示波器,验证处理效果。

二、Matlab function具体代码讲解

function [Mean,Var,Over1,Over2 ]= fcn(data)

function中[]个数代表输出个数和数据,fcn中()是输入个数和数据,本例中就是单输入,多输出。

length=30;           %数组长度
sample_time = 0.005; %采样时间
T_iner = 0.25;       %多少秒进行一次数据处理
                     %Mean 平均数
Sum = single(0);     % Sum 总和
Var0 = single(0);    %Var 数据的方差
A1=0.08;             %Over1 超过A1的比率
A2=0.1;              %Over2 超过A2的比率
Counter1=0;          % 超过a1的个数
Counter2=0;          % 超过a2的个数

数据处理的一些基本设置,本算法是在一组数据中取当前时间前相同间隔(T_iner)的一组数(length),然后算出这组数的平均数,方差,超过A1,A2的比率。做完处理后继续更新数组,将新采的数取代旧数。每更替一次做一次数据分析。

persistent Array_buff;
if isempty(Array_buff)     %初始化方法
    Array_buff = single(zeros(length,1));  %定义0数组,多行一列的数组类型
end
persistent counter;
if isempty(counter)        %初始化方法
    counter = single(0);
end
counter =counter +1;      %循环次数,每加一做一次处理

persistent: 相当于C++中的Static,定义静态变量;
persistent只被定义persistent的函数所知晓/访问,其他函数无法访问或改变它的值。当m文件被从内存中清除或m文件改变时,persistent变量才会被清除。如果要让m文件在matlab退出前一直在内存中保留,则使用mlock。如果persistent变量中第一次使用时未进行初始化赋值,则初始化为空矩阵。
如果workspace中已经有同名变量,则声明persistent变量会出错。
注意,不可使用继承来引用persistent变量。

%% main fun

if counter ==T_iner/sample_time 
    for i = 1:1:(length-1)                     %假设length=10,该for循环就是将数组的后9个数往前平移一次,然后
        Array_buff(i,1) = Array_buff(i+1,1);   %把新采的数放在第10位,这样就达成了更新数组的目的。
        Array_buff(length,1)= data;
    end
    counter = single(0);                       %每更新一次数组,counter清零。
end
% length*T_iner 秒后才能将第一轮数组数据填满
for i=1:1:length
    Sum=Sum+Array_buff(i,1);
end
Mean=Sum/length;

for i=1:1:length
    Var0=Var0+(Array_buff(i,1)-Mean)*(Array_buff(i,1)-Mean);
end
Var=Var0/length;

for i=1:1:length
    if Array_buff(i,1)>A1
        Counter1=Counter1+1;
    end
end

for i=1:1:length
    if Array_buff(i,1)>A2
        Counter2=Counter2+1;
    end
end
Over1=Counter1/length;
Over2=Counter2/length;

以上就是一些求数组平均数的简单算法。

源代码

function [Mean,Var,Over1,Over2 ]= fcn(data)

length=30;                 %数组长度
sample_time = 0.005;       %采样时间
T_iner = 0.25;     %多少秒进行一次数据处理
                   %Mean 平均数
Sum = single(0);   % Sum 总和
Var0 = single(0);  %Var 数据的方差
A1=0.08;           %Over1 超过A1的比率
A2=0.1;            %Over2 超过A2的比率
Counter1=0;      % 超过a1的个数
Counter2=0;      % 超过a2的个数
%%

persistent Array_buff;
if isempty(Array_buff)     %初始化方法
    Array_buff = single(zeros(length,1)); %定义0数组,多行一列的数组类型
end

persistent counter;
if isempty(counter)     %初始化方法
    counter = single(0);
end

counter =counter +1;

%% main fun   

if counter ==T_iner/sample_time
    for i = 1:1:(length-1)
        Array_buff(i,1) = Array_buff(i+1,1);   %假设length=10,该for循环就是将数组的后9个数往前平移一次,然后
        Array_buff(length,1)= data;            %把新采的数放在第10位,这样就达成了更新数组的目的。
    end
    counter = single(0);                       %每更新一次数组,counter清零。
end
% length*T_iner 秒后才能将第一轮数组数据填满

%% 处理模块

for i=1:1:length
    Sum=Sum+Array_buff(i,1);
end
Mean=Sum/length;

for i=1:1:length
    Var0=Var0+(Array_buff(i,1)-Mean)*(Array_buff(i,1)-Mean);
end
Var=Var0/length;

for i=1:1:length
    if Array_buff(i,1)>A1
        Counter1=Counter1+1;
    end
end

for i=1:1:length
    if Array_buff(i,1)>A2
        Counter2=Counter2+1;
    end
end
Over1=Counter1/length;
Over2=Counter2/length;
end

  • 3
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值