This live code notebook acquires the revised data from the European Project for Ice Coring in Antarctica Dome ice core from Dome C (EDC) has allowed for the reconstruction of atmospheric CO2 concentrations for the last 800,000 years [1]. And exclusively computes the CO2 Wavelet decomposition frequencies. A great amount of care and detailed code and advanced 2D and 3D visualizations are gone into the Wavelet Scalograms and the computation of the frequencies for the Vostok CO2 data. And to offer a chance for the public to conduct their own future competent examinations on the impacts of the CO2 on the planet’s climate.
In[]:=
DateObject[]
Out[]=
Sun 5 Apr 2026 03:15:55GMT+1
Live Notebook:
https://www.wolframcloud.com/obj/ccn2/Published/vostok_800_years_freqs.nb
​
​CCN NODE:
https://discuss.compclassnotes.com/t/vostok-co2-frequencies-estimates-800k-interval/135
© 2012-Present CCN Studios​​Creative Commons Attribution-NonCommercial-ShareAlike 4.0​​​
url="https://www.ncei.noaa.gov/pub/data/paleo/icecore/antarctica/antarctica2015co2composite-noaa.txt";​​datavos0=Import[url,"Table"];​​data=ToExpression@Drop[datavos0,143];
In[]:=
datavos0[[143]]
Out[]=
{age_gas_calBP,co2_ppm,co2_1s_ppm}
In[]:=
data[[1]]
Out[]=
{-51.03,368.02,0.06}
In[]:=
ListLinePlot[data[[All,{1,2}]],ImageSize->600,AxesLabel->{Highlighted@"age_gas_calBP",Highlighted@"co2_ppm"},PlotLabel->Highlighted@"Antarctica 2015\nco2 composite-noaa"]
Out[]=

ContinuousWaveletTransform [ ]

● The continuous wavelet transform of a function
x(t)
is given by​
w(u,s)=
1
s
∞
∫
-∞
x(t)
*
ψ
t-u
s
t
. ​● The continuous wavelet transform of a uniformly sampled sequence
{
x
1
,
x
2
,…}={x(
t
0
),x(Δ+
t
0
),…}
is given by ​
w(u,s)=
1
s
n
∑
k=1
x
k
*
ψ
Δ(k-u)
s
.​● The scaling parameter
s
is given by equal-tempered scale
s
oct,voc
=α
oct-1
2
voc/nvoc
2
where
oct
is the octave number,
voc
the voice number, and
α
the smallest wavelet scale.​● For each scale
s
oct,voc
, the
ContinuousWaveletTransform
[]computes the wavelet coefficients ​
{w(1,
s
oct,voc
),w(2,
s
oct,voc
),…,w(n,
s
oct,voc
)}
.
In[]:=
cwd=ContinuousWaveletTransform[data[[All,2]],DGaussianWavelet[8],12,SampleRate->Length[data[[All,1]]]]
Out[]=
ContinuousWaveletData
Octaves: 12
Voices: 4
Data points: 1901
Data not saved. Save now

In[]:=
ListLinePlot[{Thread[{data[[All,1]],data[[All,2]]}],Thread[{data[[All,1]],InverseContinuousWaveletTransform[cwd]}]},ImageSize->500,PlotLegends->{"Original","Inverse"}]
Out[]=
Original
Inverse
In[]:=
cwd["IndexMap"]
Out[]=
{{1,1},{1,2},{1,3},{1,4},{2,1},{2,2},{2,3},{2,4},{3,1},{3,2},{3,3},{3,4},{4,1},{4,2},{4,3},{4,4},{5,1},{5,2},{5,3},{5,4},{6,1},{6,2},{6,3},{6,4},{7,1},{7,2},{7,3},{7,4},{8,1},{8,2},{8,3},{8,4},{9,1},{9,2},{9,3},{9,4},{10,1},{10,2},{10,3},{10,4},{11,1},{11,2},{11,3},{11,4},{12,1},{12,2},{12,3},{12,4}}
In[]:=
cwd["Properties"]
Out[]=
{DataChannels,DataDimensions,DataMean,DataWrapper,LinearScalogramFunction,ListPlot,LogScalogramFunction,Octaves,Properties,SampleRate,Scales,Voices,Wavelet,WaveletIndex,WaveletScale}
In[]:=
cwd["Octaves"]
Out[]=
12
There is an inverse relationship between scale values and frequency values:
In[]:=
freq=#11
cwd["SampleRate"]
#1〚2〛
&/@cwd["Scales"]
Match Frequency Range to Refinements
In[]:=
Cases[freq,u_/;(2048.436599092417`≤Last[u]≤3445.0459861026484`)]
Out[]=
{{1,1}3445.05,{1,2}2896.93,{1,3}2436.02,{1,4}2048.44}

Digression: Colorization of Scalogram and what colors mean

Create a single with two periodic additive components e.g. Cos[20 π x]+Sin[150 π x] .​Sample this signal/data at
1
1023
intervals or 1023 sample rate.
data2=TableCos[20πx]+Sin[250πx],x,0,1,
1
1023
;​​ListLinePlot[data2,PlotStyle->Thickness[0.003],ImageSize->500]
Out[]=
Now user the ContinuousWaveletTransform[] to compute the signal/data decomposition. As you can see two bands, each fro
In[]:=
cwd2=ContinuousWaveletTransform[data2,GaborWavelet[6],SampleRate->1023];
In[]:=
N[(20π)/(2π)]
Out[]=
10.
In[]:=
N[(250π)/(2π)]
Out[]=
125.
In[]:=
freq2=#11
cwd2["SampleRate"]
#1〚2〛
&/@cwd2["Scales"]
Find the Refinements containing the interval [10, 75]
Notice the darker frequency band for refinement {7,2}11.6761 is the lower band or the Trend, somehow the addition of the two carries more of the lower frequency post addition:
Find the Refinements containing the interval [10, 75]
Notice the darker frequency band for refinement {3,4}132.1 is the higher band more towards the Noise, somehow the addition of the two carries more of the Noise frequency post addition due to the larger amplitude 10*Sin[250π x] :

Back to Vostok CO2

Let us plot the decompositions and study their bands. However as you can see the image becomes to blurry:

Live a Little!

Let us get really bold something new here:
1. Extract the image of the scalogram
2. Sharpen 80 times!
3. Apply a RidgeFilter[ ] to expose its venation (ridges) as a mask
4. Image multiply the mask with the Sharpened image of #2
Less detailed Scalogram with focus on the lower frequency decompositions:

3D Scalogram!

This is a zoomed shot of the 3445.05 frequency top regions of the Scalogram. You can appreciate the frequency landscapes like actual natural landscapes.

3D List Stacked Decompositions!

References

CITE THIS NOTEBOOK

EPICA dome C CO₂ record & frequency estimates: 800–600 kyr BP — NOAA NCEI​
by Dara Shayda​
Wolfram Community, STAFF PICKS, April 6, 2026
https://community.wolfram.com/groups/-/m/t/3674562