A fine example of a solution that is not optimized for microcontrollers.
Compute a table in Excel/LibreOfficeCalc/Whatever, and drop it in a LUT. Each value is only an 8-bit unsigned integer.
Your update rate should be determined by the rate at which you wish to 'breathe'. If 10 breaths per minute is the target, and you store 600 values, you'll update at 10 mS. If you decide to 'breathe' at 100 breaths per minute, you update at 1mS. Extrapolate those to the desired ends, and cut or increase your data as necessary.
If your data contains a lot of points consecutively at the min value, consider making the min value a keyword, which is always followed by a count.
Consider, with a key value of 0:
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,3,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
vs
0,17,1,2,3,2,1,0,25
In this case, a 50-sample run is compressed to 9 bytes.
Your limitation will be the number of values you can store, sure, but at least it won't be computation-constipated.
Just an alternative viewpoint, from a micro-dinosaur. All presumes a constant update rate, of course, though that could also be finessed with a flag value if necessary.