本算法是在一组数据中取当前时间前相同间隔(T_iner)的一组数(length),然后算出这组数的平均数,方差,超过A1,A2的比率。做完处理后继续更新数组,将新采的数取代旧数。每更替一次做一次数据分析。
模型还是比较简单的,开关的上面接入是需要处理的源数据,中间接入的是state,state为1是,源数据有效,state为0时,源数据无效记0.所以中间添加了一个开关模块。中间有一个模块是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
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删