The maps from Planck CMB space mission are available for download. However they are super high resolution (nside=2048) 2GByte files in Healpix format.
So for the purposes of illustration I have downgraded the 100GHz maps and mapped it to RA/Dec rectangular grid - available here:
% get the data load planck_100_longlat_0p5deg % plot flat clf; imagesc(phi,theta,p100.T); axis xy; colormap jet; % astronomy convention is RA increases to the left - why? set(gca,'XDir','reverse'); % galactic emission along plane dominates - truncate the color range caxis([-300,300]) % plot mollweid clf; axesm('MapProjection','mollweid'); pcolorm([-90,90],[-180,180],p100.T); caxis([-300,300]) set(gca,'XDir','reverse'); gridmWe can check that this last looks sensible by comparing it to the I map shown on this page. (Note that CMB people use I (intensity) and T (temperature) map interchangeably.)
We can now get the \(a_{l,m}\)'s of this map using our direct decomposition function from above:
[a_lm,l,m]=decompose_direct(p100.T,4); a_lm
% make a grid of theta values [phig,thetag]=meshgrid(phi,theta); imagesc(phi,theta,thetag); axis xy % mask all the pixels along the plane p100.T(abs(thetag)<0.3)=0; % visualize clf; axesm('MapProjection','mollweid'); pcolorm([-90,90],[-180,180],p100.T); caxis([-300,300]) set(gca,'XDir','reverse'); gridm
Class was interupted to watch the LIGO announcement live - just too cool to miss!
[a_lm,l,m]=decompose_fft(p100.T); % visualize subplot(2,1,1); imagesc(m,l,real(a_lm)); colorbar subplot(2,1,2); imagesc(m,l,imag(a_lm)); colorbarFor a Gaussian random field the real and imaginary parts of the \(a_{l,m}\)'s for a given \(l\) are just Gaussian random numbers with zero mean:
subplot(2,1,1); hist(real(a_lm(end,:)),100) subplot(2,1,2); hist(imag(a_lm(end,:)),100)Look at the \(C_\ell\)'s:
% nanvar takes the variance ignoring NaN values - the 2 says take variance % along each row of the a_lm array plot(l,nanvar(a_lm,[],2))It is conventional to plot: \begin{equation} D_\ell = \frac{\ell(\ell+1)}{2\pi}C_\ell \end{equation}
plot(l,nanvar(a_lm,[],2)'.*l.*(l+1)./(2*pi)) % why is this slighly different at low l (and more correct)? plot(l,nanmean(a_lm.*conj(a_lm),2)'.*l.*(l+1)./(2*pi))This looks roughly like what we expect - peak position agrees with table 7 of Planck 2015 I. Theory spectra come from CAMB program. Why do we expect the height of the peak to be a little supressed?
If your computer can handle it we can see the second peak as well - here is a map with 2x the resolution:
load planck_100_longlat_0p25deg p100.T(abs(thetag)<0.3)=0; % takes 50 seconds on a fast computer... tic; [a_lm,l,m]=decompose_fft(p100.T); toc plot(l,nanvar(a_lm,[],2)'.*l.*(l+1)./(2*pi))