NASA电池数据集(B0005、B0006、B0007、B0018、)数据结构如下:
B0005数据结构
为获取ICA曲线并得到各循环容量,需从charge中提取电压电流,discharge中提取容量
ICA曲线提取
clear,clc;
load('B0005.mat');
%%
%提取充电数据
B0005_pick=struct;
cycle_num=0;
for i=1:length(B0005.cycle)
cycle_type = B0005.cycle(i).type;
data_type = 'charge';
*****此处添加****
if value
cycle_num=cycle_num+1;
B0005_pick(cycle_num).Voltage_measured = B0005.cycle(i).data.Voltage_measured;
B0005_pick(cycle_num).Current_measured = B0005.cycle(i).data.Current_measured;
B0005_pick(cycle_num).Charge_Time = B0005.cycle(i).data.Time;
end
end
%%
%以10mV为间隔,提取序列
for m=1:cycle_num
%设定ΔV
deltaV=0.01;%以10mV为ΔV
%以ΔV为间隔,提取序列
B0005_pick(m).Voltage_sequence(1)= B0005_pick(m).Voltage_measured(1);
B0005_pick(m).Current_sequence(1) = B0005_pick(m).Current_measured(1);
B0005_pick(m).Charge_Time_sequence(1) = B0005_pick(m).Charge_Time(1);
Sequence_num=2;
sum_V=0;
for k=2:length(B0005_pick(m).Voltage_measured)
sum_V=sum_V+(B0005_pick(m).Voltage_measured(k)-B0005_pick(m).Voltage_measured(k-1));
if sum_V>=deltaV
sum_V=0;
B0005_pick(m).Voltage_sequence(Sequence_num)=B0005_pick(m).Voltage_measured(k);
B0005_pick(m).Current_sequence(Sequence_num)=B0005_pick(m).Current_measured(k);
B0005_pick(m).Charge_Time_sequence(Sequence_num)=B0005_pick(m).Charge_Time(k);
Sequence_num=Sequence_num+1;
end
end
end
%%
%计算容量增量曲线
for n=1:cycle_num
B0005_pick(n). ICA(1)=0;
for k=2:length(B0005_pick(n).Voltage_sequence)
B0005_pick(n).ICA(k)=B0005_pick(n).Current_sequence(k-1)*(B0005_pick(n).Charge_Time_sequence(k)-B0005_pick(n).Charge_Time_sequence(k-1))/(B0005_pick(n).Voltage_sequence(k)-B0005_pick(n).Voltage_sequence(k-1));
end
end
%%
%ICA曲线滤波
%1.移动平均滤波
windowSize = 3;
b = (1/windowSize)*ones(1,windowSize);
a = 1;
for n=1:cycle_num
B0005_pick(n).ICA_MAF=filter(b,a,B0005_pick(n).ICA);
end
% %2、中值滤波
% for n=1:cycle_num
% B0005_pick(n).ICA_MEDF=medfilt1(B0005_pick(n).ICA,4);
% end
%
% %3、loess滤波
% for n=1:cycle_num
% B0005_pick(n).ICA_LOESS=smooth(B0005_pick(n).ICA,9,'loess');
% end
%%
%绘图
subplot(2,2,1);
for num=1:cycle_num
if num~=33&&num~=170&&mod(num,10)==0
plot(B0005_pick(num).Voltage_sequence,B0005_pick(num).ICA);
hold on;
end
end
axis([3.8,4.15,0,2e4]);
title("原始曲线");
subplot(2,2,2);
for num=1:cycle_num
if num~=33&&num~=170&&mod(num,10)==0
plot(B0005_pick(num).Voltage_sequence,B0005_pick(num).ICA_MAF);
hold on;
end
end
axis([3.8,4.15,0,2e4]);
title("移动均值滤波");
% subplot(2,2,3);
% for num=1:cycle_num
% if num~=33&&num~=170&&mod(num,10)==0
% plot(B0005_pick(num).Voltage_sequence,B0005_pick(num).ICA_MEDF);
% hold on;
% end
% end
% axis([3.8,4.15,0,2e4]);
% title("中值滤波");
%
% subplot(2,2,4);
% for num=1:cycle_num
% if num~=33&&num~=170&&mod(num,10)==0
% plot(B0005_pick(num).Voltage_sequence,B0005_pick(num).ICA_LOESS);
% hold on;
% end
% end
% axis([3.8,4.15,0,2e4]);
% title("Loess滤波");
由于博客bug,星号处为以下代码:value = s删除trcmp(cycle_type,data_type);
ICA曲线对比后建议使用移动平均滤波
容量提取
% 加载数据集
load('B0005.mat');
% 初始化容量数组
capacity = [];
% 遍历数据集中的所有循环
for i = 1:length(B0005.cycle)
% 检查当前循环是否为充电循环
if strcmp(B0005.cycle(i).type, 'discharge')
% 提取当前充电循环的容量并将其添加到容量数组中
capacity = [capacity, B0005.cycle(i).data.Capacity(end)];
end
end
% 显示提取的容量数据
disp('放电循环对应的容量:');
disp(capacity);