Why does spectral leakage arise in an FFT? I've tried googling and wikipedia-ing it, but I haven't gotten any answers beyond 'it's because the frequency of the input signal is sitting between two bins'.

I understand that this is the reason, but what I can't understand is why the leakage seems to extend to several adjacent bins rather than only one adjacent bin. 

To illustrate what I'm talking about, here's some simulated data (code at the end of the post) :


Above is the FFT spectrum (plotted on a log scale) of a sine wave of frequency 10. The sampling rate is one, and the number of samples is 100. The graph has been FFT-shifted. There's clearly only a peak at bin 10, and the rest is on the order of numerical error, or there about.



This is the frequency spectrum at a generated frequency of 10.1.
Clearly there is 'leakage' into more bins than just the immediately adjacent bin.



This is the plot for a frequency of 10.5.

Question: Why is there this leakage, and why does it extend to all the other bins, rather than the immediate adjacent bin?



Code, for anyone who's interested (Python code)

import numpy as np
import matplotlib.pyplot as plt

xFreq = 10.5
xSize = 100.0
xPeriod = xSize/xFreq
x = np.linspace(1,xSize,xSize)

data = np.sin(2*np.pi*x/xPeriod)
fft = np.fft.fft(data)
fft = np.fft.fftshift(fft)

fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(abs(fft), "o")
ax.set_yscale('log')
plt.show()


I changed the xFreq value from 10.0 to 10.5, etc.
An FFT has finite length, and thus constitutes a default rectangular window on a data stream.  A window in the time domain results in a convolution in the frequency domain with the transform of the window.  Note that the transform of a rectangular window is a Sinc function (sin(x)/x), which has infinite width.  It's not just 2 bins in width.  Thus the ripples of the Sinc function will show up as "leakage" far from any spectral peak that is not perfectly periodic in the FFT's length.

The picture below shows part of the frequency response of the sinc function.  When the tone is centered on one of the bins all of the other points are lined up with the nulls in the frequency response.  If it isn't centered on a bin then it's like shifting the whole frequency response, which causes the other bins to fall on non-null portions of the frequency respoonse.



Another way to look at it is that an FFT is just a filter bank, where each filter stop-band floor has lots of ripples, and is certainly not infinite in attenuation more than 1 bin away from center frequency.  Some windows (von Hann,etc.) other than rectangular have lower stop bands, which is one reason for their popular use.