Take the 2-minute tour ×
Mathematics Stack Exchange is a question and answer site for people studying math at any level and professionals in related fields. It's 100% free, no registration required.

I am currently studying fourier transform, and especially the way that the signal could be reconstructed from its spectrum.

In many lectures, I have seen the shannon interpolation method to reconstruct the signal: $$f(t) = \sum_{n=-N}^{N} f(nT_{e}) \;\text {sinc}\left(\frac{t-nT_{e}}{T_{e}}\right) $$

with $ T_{e} $ being the sampling period

I did not tried to do the demonstration, I read that it could be achieved using poisson summation formula but I did not investigated much more on it.

But in other lectures, I have found a demonstration, that uses the dirichlet kernel: $$ f(t) = \frac{1}{2N+1} \sum_{n=0}^{2N} f[nT_{e}]\; D\left( 2\pi F_{e} \left( t - \frac{nT_{e}}{2N+1} \right) \right) $$

Where D which is defined as follow:

$$ D(t) = \frac{\sin((N+\frac{1}{2})t)}{\sin(\frac{t}{2})} $$

I tried to re-do the demonstration, and I think I achieved to do it by recalculating fourier coefficient expression in the discrete world and reinjecting this expression in the original fourier series expression of the continuous function.

So I decided to try the two versions on matlab to assess the accuracy of each of them. But the dirichlet version gave me strange results : there are more important errors in the middle of the time domain than with classical shannon interpolation .

I would like to know if comparing these two methods is the right things to do,or if there is a fundamental difference between the that I have not seen.

Here is my matlab code, I would be glad to have a feedback on it :

clear all;
close all;

Fe = 3005;
Te = 1/Fe;
Nech = 100;

F1 = 500;
F2 = 1000;
FMax = 1500;

time = [0:Te:(Nech-1)*Te];
timeDiscrete = [1:1:Nech];
frequency = (timeDiscrete/Nech)*Fe;

signal = cos(2*pi*F1*(time))+cos(2*pi*F2*(time))+cos(2*pi*FMax*(time));

%Compute the FFT
for k = timeDiscrete
    for l = timeDiscrete
        spectrum(k) = spectrum(k) + signal(l)*exp(-2*pi*j*l*k/Nech);

%Compute de inverse FFT
for k = timeDiscrete
    for l = timeDiscrete
        reconstruction(k) = reconstruction(k) + spectrum(l)*exp(2*pi*j*l*k/Nech);

%%%%%%%%%%%%%%%%%%    Now interpolation will take place   %%%%%%%%%%%%%%%%%%

Finterp = 6*Fe;
Tinterp = 1/Finterp;
TimeInterp = [0:Tinterp:(Nech-1)*Te];
[m,n] = size(TimeInterp);
NechInterp = n;
TimeInterpDiscrete = [1:1:NechInterp];

%Compute original signal value without any interpolation
signalResampled = cos(2*pi*F1*(TimeInterp))+cos(2*pi*F2*(TimeInterp))+cos(2*pi*FMax*(TimeInterp));

%Compute original signal interpolation through patlab resample function
[P,Q] = rat(Finterp/Fe);
interp_matlab = resample(reconstruction,P,Q);

%Compute original signal interpolation through shannon interpolation method
for k = TimeInterpDiscrete
    for l = timeDiscrete
        interp_shannon(k) = interp_shannon(k) + reconstruction(l)*sinc(Fe*(TimeInterp(k)-time(l)));

%Compute original signal interpolation through dirichlet kernel interpolation method
for k = TimeInterpDiscrete
    for l = timeDiscrete
        if (TimeInterp(k) ~= time(l))
            x = 2*pi*Fe*(TimeInterp(k)-time(l))/NechInterp;
            interp_dirichlet(k) = interp_dirichlet(k) + reconstruction(l)*(sin((NechInterp/2 + 0.5)*x)/sin(0.5*x));
            interp_dirichlet(k) = NechInterp * reconstruction(l);
interp_dirichlet = interp_dirichlet/NechInterp; 

%%%%%%%%%%%%%%%%%%       Let's print out the result       %%%%%%%%%%%%%%%%%%

% figure(1);
% plot(time,signal);
% hold on;
% plot(time,real(reconstruction),'r');
% figure(2);
% plot(frequency(1:Nech/2),abs(spectrum(1:Nech/2)));

% Ground truth : deterministic signal is recomputed
% plot(TimeInterp,signalResampled,'g');
% hold on;
% linear interpolation between subsampled points (matlab tracing tool)
% plot(time,real(reconstruction),'c');
% hold on;
% matlab resample command interpolation
hold on;
% Shannon interpolation method
hold on;
% Dirichlet kernel interpolation method

and I drawn the error here, with Dirichlet interpolation in black and shannon interpolation in blue and matlab resample command error in red:


Thank you for your help

share|improve this question
On StackExchange, you need to use dollar signs ($) instead of regular MathJax ( ( and ) ). I've fixed a bunch of stuff for you. –  Ahaan Rungta Aug 14 '13 at 18:01

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Browse other questions tagged or ask your own question.