Decreasing Sample Rate in DFT (FFT) for Audio Analysis I'm working with audio data analysis through FFT algorithm.
My example audio is a sine wave at 440 Hz and 44100 Hz sampling rate.

FFT methods in programming, like scipy.fft(y), require a vector of samples and a number of points/samples to analyze.
Sample rate is used to determine the width of each frequency range/bin in the resulting data vector (FS/N).

I've read that to increase frequency resolution of FFT results one should dicrease sampling rate and increase window size (number of samples).

I understand that I can change the N value (samples count) that I pass to the algorithm.

But if the audio is at 44100 Hz how can I dicrease it?
Would the resulting frequency bands reflect incorrect information about magnitudes of the FFT data?

Or should I change the input audio data somehow (manipulating directly the samples in the vector) before FFT so the data is passed with lower rate (say at 22050 Hz)?

Thanks.
I've read that to increase frequency resolution of FFT results one should dicrease sampling rate and increase window size (number of samples).


To increase frequency resolution, you increase the window size (increase the number of samples).  The sample rate does not change.

For simplicity, I'll pretend your signal is sampled at 800 Hz.

If you were to take 4 samples of the audio, and run an FFT on it, you would get 4 samples in the frequency domain.  They would represent 4 frequency bins: 

[0 Hz (DC), 200 Hz, ±400 Hz (Nyquist), -200 Hz]


Each of these bins is 200 Hz wide.  If instead, you had taken 8 samples of the audio, and run an FFT on it, you would get 8 samples in the frequency domain, representing 8 frequency bins:

[0, +100, +200, +300, ±400, -300, -200, -100]


Each of these bins is 100 Hz wide.  Does that make sense?  So to get narrower bins, you need to take more samples of your audio.  But the maximum frequency in the FFT (the Nyquist frequency of ±400 Hz) does not change; it's the same regardless of the number of samples.

Note that you can get these values like this:

scipy.fftpack.fftfreq(4, 1/800)
Out[8]: array([   0.,  200., -400., -200.])

scipy.fftpack.fftfreq(8, 1/800)
Out[9]: array([   0.,  100.,  200.,  300., -400., -300., -200., -100.])