Main Content

Automatic Data Segmentation and Feature Extraction for Reference Performance Test in Lab-Measured Battery Aging Data

Reference performance tests (RPT) are included in battery aging test design when there is no unified measurement available for obtaining remaining capacity or when additional measurements (slow rate cycles, pulses, EIS, etc.) are needed to characterize the battery's health. This example illustrates the use of a neural network for separating current pulses from regular charge-discharge steps and the extraction of features, that serve as health indicators, from the identified pulses.

Battery RPT data

The data used in this example is from one cell in ISU-ILCC Battery Aging Dataset [1], and is preprocessed to only contain raw measurements from RPTs (i.e., the cycling test data are excluded). The type of cell used in this dataset is NMC/graphite pouch cell with a rated capacity of 0.25Ah (1C = 0.25A). The RPT were performed using a 64-channel Neware BTS4000 series battery tester with cells placed in a temperature-controlled chamber set at 30°C. For this example, the essential measurements are:

  • RPT_Index - An integer identifying the RPT test number (starting from 1).

  • Steps - An integer identifying a step within the RPT profile (starting from 1).

  • Current (A) - The current measured in Amps.

  • Voltage (V) - The terminal voltage measured in Volts.

  • Capacity (Ah) - The cumulative charge/discharge capacity in a step measured in Amp-hour.

  • Relative Time (h:min:s.ms) - The time stamps relative to the start of each step.

  • Real Time (h:min:s.ms) - The time stamps with date and time.

Download the data from the MathWorks support files site and load it into MATLAB.

url = 'https://ssd.mathworks.com/supportfiles/predmaint/batteryagingdata/isuilcc/rpt/RPT_ISU_ILCC.zip';
downloadFolder = fullfile(tempdir,tempname);
loc = websave('BatteryRPTDataset', url);
unzip(loc, pwd)

load("RPT_ISU.mat","data")
head(data)
    RPT_Index    Record number     status      Jump    Cycle    Steps    Current(A)    Voltage(V)    Capacity(Ah)    Energy(Wh)    Relative Time(h:min:s.ms)     Real Time(h:min:s.ms) 
    _________    _____________    _________    ____    _____    _____    __________    __________    ____________    __________    _________________________    _______________________

        1              1          "CC DChg"     1        1        1        -0.05         4.0119                0              0          00:00:00.000           2022-09-16 20:13:49.000
        1              2          "CC DChg"     1        1        1        -0.05         4.0091       6.9437e-05     0.00027847          00:00:05.000           2022-09-16 20:13:54.000
        1              3          "CC DChg"     1        1        1        -0.05         4.0073       0.00013888     0.00055682          00:00:10.000           2022-09-16 20:13:59.000
        1              4          "CC DChg"     1        1        1        -0.05          4.006       0.00020833     0.00083505          00:00:15.000           2022-09-16 20:14:04.000
        1              5          "CC DChg"     1        1        1        -0.05         4.0051       0.00027777      0.0011132          00:00:20.000           2022-09-16 20:14:09.000
        1              6          "CC DChg"     1        1        1        -0.05         4.0042       0.00034721      0.0013913          00:00:25.000           2022-09-16 20:14:14.000
        1              7          "CC DChg"     1        1        1        -0.05         4.0032       0.00041666      0.0016693          00:00:30.000           2022-09-16 20:14:19.000
        1              8          "CC DChg"     1        1        1        -0.05         4.0026        0.0004861      0.0019473          00:00:35.000           2022-09-16 20:14:24.000

Visualize the data from one RPT

To better understand the RPT profile design in this dataset, visualize the current and voltage measurements from one RPT. At the beginning, the cells are discharged to 3V with C/5 current. Then, a sequence of a C/5 full-depth cycle, a C/2 full-depth cycle with pulses during discharge, and a C/2 full-depth cycle is performed. Plot the current, voltage, and time from the second RPT Test.

dataCycle = data(data.RPT_Index==2,:);

currentCycle = dataCycle.("Current(A)");
voltageCycle = dataCycle.("Voltage(V)");
timeCycle = dataCycle.("Real Time(h:min:s.ms)");
relTimeCycle = seconds(timeCycle - timeCycle(1));

figure()
yyaxis left
plot(relTimeCycle,currentCycle,LineWidth=1.5)
ylabel("Current (A)")
yyaxis right
plot(relTimeCycle,voltageCycle,LineWidth=1.5)
ylabel("Voltage (V)")
xlabel("Time (sec)")

Figure contains an axes object. The axes object with xlabel Time (sec), ylabel Voltage (V) contains 2 objects of type line.

Zooming in to the first pulse in the RPT, it can be seen that when a discharge pulse is injected, the terminal voltage of the cell dips in response. Select 5 seconds before and after the pulse and plot the current and voltage for this duration.

dataPulse = dataCycle(ismember(dataCycle.Steps,[9,10,11]),:);
timePulse = dataPulse.("Real Time(h:min:s.ms)");
timePulseDur = timePulse - timePulse(1);

idx = timePulseDur<=duration(0,0,20)&timePulseDur>=duration(0,0,5);
relTimePulse = seconds(timePulseDur(idx))-5; % Offset by 5 seconds
currentPulse = dataPulse(idx,"Current(A)").("Current(A)");
voltagePulse = dataPulse(idx,"Voltage(V)").("Voltage(V)");

figure()
yyaxis left
plot(relTimePulse,currentPulse,LineWidth=1.5)
ylabel("Current (A)")
ylim([-0.3,0])
yyaxis right
plot(relTimePulse,voltagePulse,LineWidth=1.5)
ylabel("Voltage (V)")
xlabel("Time (sec)")
xlim([0,max(relTimePulse)])
ylim([4.12,4.2])

Figure contains an axes object. The axes object with xlabel Time (sec), ylabel Voltage (V) contains 2 objects of type line.

As the cell ages, the magnitude and pattern of this voltage dip could change, which provides useful information regarding the degradation. Thus, it is useful to extract features from these measurements and track changes in these features over cycles. However, as seen above, an RPT can contain both charge-discharge cycles and pulses. It is time consuming to manually extract the segments associated with the pulses. So, in the next section, a neural network is trained to identify pulses in an RPT measurement and the trained network is then used to identify all the pulses for feature extraction.

Train a neural network to perform automatic segmentation

A bi-directional long short-term memory (BiLSTM) model is trained to perform automatic segmentation. Assume that the data is partially labeled, and train the BiLSTM model on the available labeled data. Use the trained model to label the remaining unlabeled data.

Load predefined labels for a portion of the RPT data and append to the data table. Each point is labeled to be a part of a Pulse or Regular charge-discharge cycle. Points that are neither are not labeled and have an "undefined" label.

load("RPT_ISU_label.mat","label")
data.Label = label;
head(data)
    RPT_Index    Record number     status      Jump    Cycle    Steps    Current(A)    Voltage(V)    Capacity(Ah)    Energy(Wh)    Relative Time(h:min:s.ms)     Real Time(h:min:s.ms)        Label   
    _________    _____________    _________    ____    _____    _____    __________    __________    ____________    __________    _________________________    _______________________    ___________

        1              1          "CC DChg"     1        1        1        -0.05         4.0119                0              0          00:00:00.000           2022-09-16 20:13:49.000    <undefined>
        1              2          "CC DChg"     1        1        1        -0.05         4.0091       6.9437e-05     0.00027847          00:00:05.000           2022-09-16 20:13:54.000    <undefined>
        1              3          "CC DChg"     1        1        1        -0.05         4.0073       0.00013888     0.00055682          00:00:10.000           2022-09-16 20:13:59.000    <undefined>
        1              4          "CC DChg"     1        1        1        -0.05          4.006       0.00020833     0.00083505          00:00:15.000           2022-09-16 20:14:04.000    <undefined>
        1              5          "CC DChg"     1        1        1        -0.05         4.0051       0.00027777      0.0011132          00:00:20.000           2022-09-16 20:14:09.000    <undefined>
        1              6          "CC DChg"     1        1        1        -0.05         4.0042       0.00034721      0.0013913          00:00:25.000           2022-09-16 20:14:14.000    <undefined>
        1              7          "CC DChg"     1        1        1        -0.05         4.0032       0.00041666      0.0016693          00:00:30.000           2022-09-16 20:14:19.000    <undefined>
        1              8          "CC DChg"     1        1        1        -0.05         4.0026        0.0004861      0.0019473          00:00:35.000           2022-09-16 20:14:24.000    <undefined>

To prepare the data for training, process the data using the helper function hProcessClassificationData into two cell variables, X and Y. The measured signal is returned as X and it is a cell array with 37 elements and each cell contains a two-row matrix. The first row is current, and the second row is voltage. The labels for each measured signal cell is returned as Y, which is also a 37 element cell array, with each cell being a categorical vector for the labels ("Regular" and "Pulse").

[X, Y] = hProcessClassficationData(data);

Visualize the preprocessed data for neural network training

currentPlot = X{2}(1,:);
voltagePlot = X{2}(2,:);
classes = categories(Y{2});

hPlotLabeledSignals(currentPlot, voltagePlot, classes, Y)

Figure contains 3 axes objects. Axes object 1 with title Labeled input voltage signal, xlabel Data point, ylabel Voltage (V) contains 2 objects of type scatter. These objects represent Pulse, Regular. Axes object 2 with title Labeled input current signal, xlabel Data point, ylabel Current (A) contains 2 objects of type scatter. These objects represent Pulse, Regular. Axes object 3 with title Output class, ylabel Counts contains an object of type categoricalhistogram.

As seen in the above plots, voltage data by it self is not very different between the regular and pulse classes because the cell has to operate within its nominal range. However, the current data is clearly differentiated between the pulse and the regular classes. Thereby the combination of the current and voltage data as predictors can achieve good segmentation results. Further, the training data has been processed to balance the number of data points for regular and pulse classes to ensure a good fit.

Select 70% of RPTs for training using cvpartition function and use hTrainSegmentModel helper function to define and train the neural network.

rng default

cv = cvpartition(max(data.RPT_Index),"HoldOut",0.3);

idxTrain = training(cv);
Xtrain = X(idxTrain,1);
Ytrain = Y(idxTrain,1);

net = hTrainSegmentModel(Xtrain,Ytrain);
Training on single CPU.
|========================================================================================|
|  Epoch  |  Iteration  |  Time Elapsed  |  Mini-batch  |  Mini-batch  |  Base Learning  |
|         |             |   (hh:mm:ss)   |   Accuracy   |     Loss     |      Rate       |
|========================================================================================|
|       1 |           1 |       00:00:00 |       44.37% |       0.6741 |          0.0010 |
|      50 |          50 |       00:00:18 |       87.23% |       0.3224 |          0.0010 |
|     100 |         100 |       00:00:35 |       98.57% |       0.0443 |          0.0010 |
|========================================================================================|
Training finished: Max epochs completed.

Classify all steps using this trained model

The trained neural network can classify each data point. Given that one step can only associate to one class (i.e., a step is either "Regular" or "Pulse"), apply majority voting for each step to correct possible misclassifications at the beginning/end of the step. Use the helper function hRptDataParser to label each step as either "Regular" or "Pulse". The neural network model only classifies the step before the current pulse. So, the index for the step after pulses needs to be added explicitly after the model completes the segmentation.

segmentedData = hRptDataParser(data,net);
head(segmentedData)
    RPT_Index    Record number     status      Jump    Cycle    Steps    Current(A)    Voltage(V)    Capacity(Ah)    Energy(Wh)    Relative Time(h:min:s.ms)     Real Time(h:min:s.ms)        Label       Individual_class    Step_class
    _________    _____________    _________    ____    _____    _____    __________    __________    ____________    __________    _________________________    _______________________    ___________    ________________    __________

        1              1          "CC DChg"     1        1        1        -0.05         4.0119                0              0          00:00:00.000           2022-09-16 20:13:49.000    <undefined>         Pulse           Regular  
        1              2          "CC DChg"     1        1        1        -0.05         4.0091       6.9437e-05     0.00027847          00:00:05.000           2022-09-16 20:13:54.000    <undefined>         Pulse           Regular  
        1              3          "CC DChg"     1        1        1        -0.05         4.0073       0.00013888     0.00055682          00:00:10.000           2022-09-16 20:13:59.000    <undefined>         Pulse           Regular  
        1              4          "CC DChg"     1        1        1        -0.05          4.006       0.00020833     0.00083505          00:00:15.000           2022-09-16 20:14:04.000    <undefined>         Pulse           Regular  
        1              5          "CC DChg"     1        1        1        -0.05         4.0051       0.00027777      0.0011132          00:00:20.000           2022-09-16 20:14:09.000    <undefined>         Pulse           Regular  
        1              6          "CC DChg"     1        1        1        -0.05         4.0042       0.00034721      0.0013913          00:00:25.000           2022-09-16 20:14:14.000    <undefined>         Pulse           Regular  
        1              7          "CC DChg"     1        1        1        -0.05         4.0032       0.00041666      0.0016693          00:00:30.000           2022-09-16 20:14:19.000    <undefined>         Pulse           Regular  
        1              8          "CC DChg"     1        1        1        -0.05         4.0026        0.0004861      0.0019473          00:00:35.000           2022-09-16 20:14:24.000    <undefined>         Pulse           Regular  
mask = segmentedData.Step_class == "Pulse";
pulseIndex = unique(segmentedData.Steps(mask));
pulseIndex = reshape(pulseIndex,2,[])';
pulseIndex = [pulseIndex,pulseIndex(:,2)+1];
disp(pulseIndex)
     9    10    11
    13    14    15
    17    18    19
    21    22    23
    25    26    27
    29    30    31
    33    34    35
    37    38    39

Extract features from pulses

The pulseIndex variable is an 8-by-3 array, with each row being the indices for a complete 3-step pulse segment (i.e., the step before a current pulse, a current pulse, and the step following a current pulse). For the identified pulses, the helper function hExtractPulseFeature computes the following features for each of the eight pulses in the RPT:

  • ROhmic=ΔVOhmic/ΔI

  • Rtotal=ΔVtotal/ΔI

  • Slope_K1 = (V4-V2)/Δt

  • Slope_K2 = (V3-V1)/Δt

  • Slope_K3 = (V4-V1)/Δt

  • Slope_K4 = (V3-V2)/Δt

  • Mean_Pulse_Voltage = mean(voltage across three segments)

  • Var_Pulse_Voltage = var(voltage across three segments)

  • Kurtosis_Pulse_Voltage = kurtosis(voltage across three segments)

  • Relaxation_End_Voltage = Vrelax

pulse_characteristics.png

The suffix in the column name is the index of the pulse in a RPT from which the feature is extracted.

FeatureTable = hExtractPulseFeature(segmentedData,pulseIndex);
head(FeatureTable)
    R_ohmic_1    R_total_1    Slope_K1_1    Slope_K2_1    Slope_K3_1    Slope_K4_1    mean_Pulse_Voltage_1    var_Pulse_Voltage_1    kurtosis_Pulse_Voltage_1    Relaxation_End_Voltage_1    R_ohmic_2    R_total_2    Slope_K1_2    Slope_K2_2    Slope_K3_2    Slope_K4_2    mean_Pulse_Voltage_2    var_Pulse_Voltage_2    kurtosis_Pulse_Voltage_2    Relaxation_End_Voltage_2    R_ohmic_3    R_total_3    Slope_K1_3    Slope_K2_3    Slope_K3_3    Slope_K4_3    mean_Pulse_Voltage_3    var_Pulse_Voltage_3    kurtosis_Pulse_Voltage_3    Relaxation_End_Voltage_3    R_ohmic_4    R_total_4    Slope_K1_4    Slope_K2_4    Slope_K3_4    Slope_K4_4    mean_Pulse_Voltage_4    var_Pulse_Voltage_4    kurtosis_Pulse_Voltage_4    Relaxation_End_Voltage_4    R_ohmic_5    R_total_5    Slope_K1_5    Slope_K2_5    Slope_K3_5    Slope_K4_5    mean_Pulse_Voltage_5    var_Pulse_Voltage_5    kurtosis_Pulse_Voltage_5    Relaxation_End_Voltage_5    R_ohmic_6    R_total_6    Slope_K1_6    Slope_K2_6    Slope_K3_6    Slope_K4_6    mean_Pulse_Voltage_6    var_Pulse_Voltage_6    kurtosis_Pulse_Voltage_6    Relaxation_End_Voltage_6    R_ohmic_7    R_total_7    Slope_K1_7    Slope_K2_7    Slope_K3_7    Slope_K4_7    mean_Pulse_Voltage_7    var_Pulse_Voltage_7    kurtosis_Pulse_Voltage_7    Relaxation_End_Voltage_7    R_ohmic_8    R_total_8    Slope_K1_8    Slope_K2_8    Slope_K3_8    Slope_K4_8    mean_Pulse_Voltage_8    var_Pulse_Voltage_8    kurtosis_Pulse_Voltage_8    Relaxation_End_Voltage_8
    _________    _________    __________    __________    __________    __________    ____________________    ___________________    ________________________    ________________________    _________    _________    __________    __________    __________    __________    ____________________    ___________________    ________________________    ________________________    _________    _________    __________    __________    __________    __________    ____________________    ___________________    ________________________    ________________________    _________    _________    __________    __________    __________    __________    ____________________    ___________________    ________________________    ________________________    _________    _________    __________    __________    __________    __________    ____________________    ___________________    ________________________    ________________________    _________    _________    __________    __________    __________    __________    ____________________    ___________________    ________________________    ________________________    _________    _________    __________    __________    __________    __________    ____________________    ___________________    ________________________    ________________________    _________    _________    __________    __________    __________    __________    ____________________    ___________________    ________________________    ________________________

        0.24       0.265        -0.005       -0.0245        -0.053        0.0235             4.0908                0.0037578                  1.6321                      4.0057               0.2325       0.2495         -Inf          -Inf          -Inf           Inf             3.8893                0.0063696                  1.7985                      3.7605                0.229       0.2445      -0.0031       -0.0207       -0.0489        0.0251             3.6475                0.0063288                  1.7698                      3.5249               0.2415       0.2665       -0.005       -0.0217       -0.0533        0.0266             3.5189               0.00054497                  1.6027                      3.4867              0.23699      0.27449      -0.0075       -0.0233       -0.0549        0.0241             3.4813               0.00066076                  1.6166                      3.4433              0.25553       0.2995      -0.0087       -0.0267       -0.0599        0.0245              3.434               0.00093928                  1.7297                      3.3851                0.254       0.3485      -0.0189       -0.0363       -0.0697        0.0145                3.3                0.016161                   2.4567                      3.0468              0.19436      0.62348      -0.0859       -0.1076       -0.1247       -0.0688             3.1929                0.0028879                  1.9654                      3.2759         
     0.23057      0.2635       -0.0065       -0.0242       -0.0527         0.022             4.0889                0.0036989                  1.6712                      4.0048                0.197        0.245      -0.0096        -0.022        -0.049        0.0174             3.8906                0.0064627                  1.7844                      3.7568              0.21741       0.2415      -0.0049       -0.0204       -0.0483         0.023             3.6467                0.0063932                  1.7642                      3.5243               0.2385        0.262      -0.0047       -0.0217       -0.0524         0.026             3.5213               0.00049425                  1.5017                      3.4914              0.22091      0.26999      -0.0099       -0.0224        -0.054        0.0217             3.4833               0.00059733                  1.5478                      3.4489               0.2415       0.2915        -0.01        -0.026       -0.0583        0.0223             3.4335               0.00094114                  1.7574                      3.3835              0.19587      0.33199      -0.0273       -0.0351       -0.0664         0.004             3.3101                0.013146                     2.54                      3.0741              0.19719        0.569      -0.0744       -0.0837       -0.1138       -0.0443             3.1345                0.0023419                  2.1134                      3.2114         
     0.22104       0.265        -0.009       -0.0248        -0.053        0.0192             4.0893                0.0036391                  1.6727                       4.006               0.2265      0.24604       -0.004        -0.022       -0.0493        0.0233             3.8909                0.0064134                  1.7892                      3.7593                0.228       0.2435      -0.0031       -0.0207       -0.0487        0.0249             3.6458                  0.00647                  1.7671                      3.5227               0.2435        0.265         -Inf          -Inf          -Inf           Inf             3.5212               0.00050504                  1.4996                      3.4908              0.24649      0.27599         -Inf          -Inf          -Inf           Inf             3.4847               0.00060268                  1.4807                      3.4489              0.24974       0.2945       -0.009       -0.0263       -0.0589        0.0236             3.4337               0.00092506                  1.7462                      3.3841              0.25553       0.3395      -0.0167       -0.0158       -0.0679        0.0354             3.3204                 0.01092                   2.5723                      3.0974              0.25274        0.555      -0.0605       -0.0722        -0.111       -0.0217             3.1222                0.0020445                  2.2562                      3.1907         
      0.2125      0.2745       -0.0124       -0.0257       -0.0549        0.0168             4.0888                0.0035983                  1.6819                      4.0048              0.22259        0.256      -0.0066       -0.0226       -0.0512         0.022             3.8921                0.0064132                  1.7777                      3.7605                0.236        0.253      -0.0034       -0.0217       -0.0506        0.0255             3.6478                0.0064092                  1.7662                      3.5249               0.2445       0.2755      -0.0062       -0.0229       -0.0551         0.026             3.5207               0.00052895                  1.5185                      3.4908              0.24973      0.28499      -0.0071       -0.0239        -0.057         0.026             3.4812               0.00067423                  1.6108                      3.4433               0.2114        0.301       -0.018       -0.0059       -0.0602        0.0363             3.4352               0.00094892                  1.7435                      3.3835              0.22799      0.33949      -0.0223       -0.0351       -0.0679        0.0105             3.2877                0.018159                   2.5163                           3               0.2665       0.5315       -0.053       -0.0595       -0.1063       -0.0062             3.1035                0.0016413                  2.7146                      3.1637         
     0.24373      0.2805       -0.0074        -0.027       -0.0561        0.0217             4.0871                0.0036353                  1.6994                      4.0045               0.2295        0.256      -0.0053       -0.0229       -0.0512         0.023             3.8909                0.0065378                   1.779                       3.758              0.23644      0.25299      -0.0034       -0.0217       -0.0506        0.0255             3.6471                0.0065039                  1.7659                      3.5227               0.2495        0.277      -0.0055       -0.0232       -0.0554        0.0267             3.5207               0.00054115                  1.5185                      3.4905               0.2495        0.285      -0.0071       -0.0242        -0.057        0.0257             3.4814               0.00067806                  1.6149                      3.4433              0.24732       0.3025      -0.0109       -0.0273       -0.0605        0.0223             3.4373                0.0008658                  1.6368                      3.3916              0.22458        0.338      -0.0226       -0.0351       -0.0676        0.0099             3.2872                0.018019                   2.4479                      3.0028              0.22971      0.49598      -0.0533        -0.053       -0.0992       -0.0071             3.0904                0.0015444                  2.7748                      3.1473         
      0.2109      0.2805        -0.014       -0.0254       -0.0561        0.0167             4.0873                0.0036188                  1.6864                      4.0039                0.237        0.259      -0.0044       -0.0232       -0.0518        0.0242             3.8915                0.0064427                  1.7854                      3.7605              0.23645       0.2545      -0.0037       -0.0217       -0.0509        0.0255             3.6491                0.0064046                   1.765                      3.5255               0.2295        0.284      -0.0109       -0.0236       -0.0568        0.0223             3.5211               0.00054454                  1.5286                      3.4905              0.25549      0.28949      -0.0068       -0.0043       -0.0579        0.0468             3.4851               0.00062516                  1.4825                      3.4492              0.25403        0.307      -0.0105       -0.0279       -0.0614         0.023             3.4372               0.00090095                  1.6394                      3.3903              0.22843      0.34099      -0.0226       -0.0357       -0.0682        0.0099              3.288                0.017494                   2.3888                      3.0109              0.26949      0.48948       -0.044       -0.0536       -0.0979        0.0003             3.0831                0.0014663                  2.7124                       3.137         
       0.243       0.282       -0.0078       -0.0276       -0.0564         0.021              4.086                0.0036318                  1.7108                      4.0039              0.23655      0.25899      -0.0044       -0.0229       -0.0518        0.0245             3.8908                0.0065288                  1.7864                      3.7589               0.2129      0.25599      -0.0087       -0.0196       -0.0512        0.0229              3.649                0.0065362                    1.75                      3.5233              0.24823      0.28549      -0.0075       -0.0239       -0.0571        0.0257             3.5209               0.00055955                  1.5215                      3.4902               0.2555       0.2915      -0.0072       -0.0046       -0.0583        0.0465              3.485               0.00064314                  1.4628                      3.4492              0.25552      0.30999      -0.0108       -0.0282        -0.062         0.023             3.4369                0.0009327                  1.6478                      3.3888                0.245       0.3425      -0.0195       -0.0357       -0.0685        0.0133             3.2853                0.017821                   2.3017                      3.0109               0.2525       0.4695      -0.0434       -0.0431       -0.0939        0.0074             3.0758                0.0013801                   2.859                      3.1274         
     0.24023       0.282       -0.0084       -0.0279       -0.0564        0.0201             4.0856                0.0036491                  1.7118                      4.0035                0.234        0.256      -0.0044       -0.0037       -0.0512        0.0431             3.8915                0.0067584                  1.7697                      3.7568              0.23923       0.2545      -0.0031        -0.022       -0.0509        0.0258             3.6504                0.0063927                  1.7609                      3.5264              0.25474        0.287         -Inf          -Inf          -Inf           Inf              3.522               0.00056946                  1.4454                      3.4898              0.23572        0.291      -0.0111       -0.0254       -0.0582        0.0217             3.4839               0.00064495                  1.5475                      3.4489              0.25749      0.31149      -0.0108        -0.009       -0.0623        0.0425             3.4383               0.00094386                  1.6318                      3.3875                0.225       0.3425      -0.0235       -0.0363       -0.0685        0.0087             3.2911                 0.01751                   2.4071                       3.014              0.23122        0.457      -0.0452         -0.04       -0.0914        0.0062             3.0725                0.0013136                  2.8724                      3.1231         

To estimate the health of the cell, use the helper function hFindCapacity to calculate the remaining capacity of the cell and capacity loss at each RPT.

[capacity,capacityLoss] = hFindCapacity(segmentedData);
capacityTable = array2table([capacity,capacityLoss],...
    'VariableNames',["Remaining_Capacity","Capacity_Loss"]);
head(capacityTable)
    Remaining_Capacity    Capacity_Loss
    __________________    _____________

         0.28524                    0  
         0.28411            0.0011261  
         0.28285            0.0023864  
         0.27962            0.0056198  
         0.27672              0.00852  
         0.27418             0.011059  
         0.27213             0.013109  
         0.27008             0.015162  

Plot the extracted features to visualize any trends that indicate correlation with aging.

rptFeaturesToPlot = ["mean_Pulse_Voltage_3","R_ohmic_8"];

for iii = 1:length(rptFeaturesToPlot)
    figure()
    yyaxis left
    plot(FeatureTable,rptFeaturesToPlot(iii))
    xlabel('RPT Index')
    ylabel(rptFeaturesToPlot(iii),Interpreter="none")
    yyaxis right
    plot(capacityTable,"Capacity_Loss")
    ylabel('Capacity loss(Ah)')
end

Figure contains an axes object. The axes object with xlabel RPT Index, ylabel Capacity loss(Ah) contains 2 objects of type line.

Figure contains an axes object. The axes object with xlabel RPT Index, ylabel Capacity loss(Ah) contains 2 objects of type line.

The trends of these features as cell ages align with the capacity loss, but the evolution of feature values is not smooth as the capacity loss. The main reason is that the current pulse in this dataset is only applied for 1 seconds, which is a very short period of time so that cell is still in transient state. This will result in higher noise in the feature extraction because the measurements can be taken at different stage of the transient state.

Conclusion

This example illustrates automatic segmentation of pulses from battery reference performance tests using deep learning. Automatic data segmentation reduces the need for manual intermediate data processing to extract pulse or other type of test components (e.g., EIS). Synthetic data simulated from physics-based models could be used to expand the capability of such deep learning models for more complicated RPT designs, such as a blend of charge and discharge pulses.

The segmented data was used to extract key features that show strong correlation with the capacity loss as the cell ages. These features can then be used as predictors of state of health or other battery health indicators.

[1] Thelen, Adam; Li, Tingkai; Liu, Jinqiang; Tischer, Chad; Hu, Chao (2023). ISU-ILCC Battery Aging Dataset. Iowa State University. Dataset. https://doi.org/10.25380/iastate.22582234.v2

See Also

Topics