1 view (last 30 days)

Show older comments

Ranadev Singha
on 3 Mar 2014

Kye Taylor
on 31 May 2013

When you decompose a function f in an orthonormal basis, you can relate the sum of the square of the coefficients to the L2-norm (read energy) of the function via Parseval's identity. To get the best approximation in a lossy compression, you want to kill the coefficients that are smallest when squared.

The number of coefficients you decide to threshold depends on the amount of compression your looking for and the quality of the reconstruction: As you threshold more coefficients, you will degrade the quality of the reconstruction.

Now, using curvelets is another story since a curvelet transform is highly redundant (not orthogonal). With that said, you could still proceed by killing those coefficients that are "small enough," and just monitor the quality of the recongstruction as you do..

Kye Taylor
on 31 May 2013

I interpret your prof's suggestion in this way: You could look at the distrubtion of the squared-magnitude of each coefficient. For example

t = linspace(0,2*pi,512);

x = exp(t) + 0.1*randn(size(t));

y = fft(x-mean(x));

hist(abs(y),25);

Notice from the histogram, there are a lot of very small coefficients. So, you would not want to start thresholding at the average magnitude (since this would kill all the small coefficients). Instead, start killing only the smallest:

% vector of values to threshold

th = linspace(min(abs(y)),max(abs(y)),16);

figure

for i = 1:length(th)

subplot(4,4,i)

hold on

y(y<th(i)) = 0; % threshold values small enough

xrecon = ifft(y);

plot(x-mean(x),'b')

plot(xrecon,'r')

title([num2str(nnz(y)),' coefficients used.'])

end

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!