Reducing the number of data points of an FFT I'm in an odd situation where an FFT is giving me too much data to process. I'm performing an FFT on audio sampled at 500 Hz, over 30 seconds. The result is 7500 bins of useful information, however I don't need this sort of resolution. I still need to see frequencies up to 250 Hz so I can't reduce the sampling rate. I also need information from the entire sample, so I can't use less than 30 seconds of data either.

What can I do to reduce the number of points, but keep the magnitude and phase information relatively intact? I would prefer not to throw away points, is it possible to take an average of x points?
Do you want to know specific frequencies? Go for the Goertzel algorithm.

Do you need to know every 2nd frequency? This corresponds to downsampling in the frequency domain, which is aliasing in time domain. You can do it like this (where I have reduced the sampling rate and signal duration for better plotting, obviously it also works with 30s and 500Hz):

Fs = 50 # 50 Hz for less data
x = np.random.randn(2*Fs)  # The audio signal: 2s for less data for better plotting here
L = len(x)

# Calculate full FFT for reference
X = np.fft.fft(x)
f1 = np.linspace(0, Fs, L, endpoint=False)

# Calculate every 2nd sample of FFT
x2 = x[:L/2] + x[L/2:] # Perform the aliasing operation in time domain
X2 = np.fft.fft(x2)
f2 = np.linspace(0, Fs, L/2, endpoint=False)

plt.plot(f2, abs(X2), 'go-')
plt.plot(f1, abs(X), 'rx-')

plt.xlim((0, Fs/2))




Obviously, the approach of aliasing also works for every Nth sample in general, if $L$ can be divided by $N$ without remainder.