To add to Richard's good answer, I specifically want to show the difference between:
Down-conversion and low-pass filtering (heterodyne the signal).
Bandpass filtering the signal directly (heterodyne the coefficients).
This will clearly show the relationship between the DFT and FIR filtering, and how the DFT is indeed a bank of bandpass filters.
This can all be demonstrated nicely with a simple four point DFT given as:
$$X[k] = \sum_{n=0}^{N-1}x[n]W_n^{nk}$$
Where $W_n = e^{-j2\pi /N}$ are the so-called "Twiddle Factors" coined by W. M. Gentleman and G. Sande in "Fast Fourier Transforms- for fun and profit" Proc. AFIPS 29, 563-578 (1966).
The four point DFT would then be in matrix form as given in the graphic below:
Given our choice in this case of a 4 point DFT, the twiddle factors reduce to $\pm 1$ and $\pm j$ resulting in the simplified matrix below:
The DFT can be described as a bank of filters, with each filter being an N-tap moving average FIR filter centered on a particular frequency bin. To clearly understand this, it will help to first understand what an N-tap moving average filter looks like and to understand frequency translation through the heterodyne process, and how that can be used to either translate the signal OR can be used to translate the filter! I will cover each of these in turn.
4 tap moving average
A four tap moving average as an FIR filter with four unity gain coefficients is a low-pass filter. It's transfer function is given as:
$$H(z) = 1 + z^{-1} + z^{-2} + z^{-3}$$
The structure for such a filter and it's frequency response in the range of $\pm f_s/2$ where $f_s$ is the sampling rate is shown in the graphic below. The frequency response is easily computed in Matlab, Octave or Python scipy.signal using the freqz
command as freqz([1, 1, 1, 1])
(no commas in Matlab or Octave), and by default will show the single-sided response from $0$ to $f_s/2$.
What we note immediately is that this matches the processing of the first row in the DFT matrix as the scaled average of the 4 most current samples:
$$X[0] = x[0] + x[1] + x[2] + x[3]$$
The immediate difference between the typical application of the DFT and the FIR filter is that with the DFT we compute the result over an entire block of samples, while with the FIR filter we stream the data through the filter and compute a new output sample for every input. However the math operations and results are identical and we can use either structure in block or streaming mode. Note that the output of bin 0 of the 4 point DFT exactly matches the output of this given 4 tap FIR filter, at the fourth sample. If we were to shift the data into the DFT by one sample and recompute the DFT, the next sample out of bin 0 would again exactly match the next sample out of the FIR filter.
Heterodyne Process
The "Heterodyne Process" is frequency translation by multiplying with a complex phasor as depicted in the graphic below. For the case when the frequency is translated to zero specifically, this is also referred to as "Homodyne".
This is simple to see given a single tone at $A(t)e^{j\omega_o t}$, if we multiply it with the complex conjugate of the carrier, the exponents add resulting in the frequency getting translated:
$$A(t)e^{j\omega_o t}e^{-j\omega_c t} = e^{-j(\omega_o - \omega_c) t} $$
A typical receiver operation is to down-convert and low pass filter. In this case, we move the signal to the filter- we heterodyne the signal. This is depicted below where we translate a signal that is centered at $f_s/4$ to the same low pass filter we introduced above. (This is NOT the DFT!):
Alternatively we can make any FIR low pass filter into a bandpass filter by heterodyning the coefficients! In this case we translate in frequency the filter to the signal rather than the signal to the filter! This is exactly what occurs for all the higher bins in the DFT:
Understanding this provides much insight into other spectral properties of the DFT, including resolution bandwidth and as demonstrated below "spectral leakage". Here we see the result of a 4 point DFT when the frequency of the input signal is between DFT bins, the resulting DFT is the response from each of the 4 filters. We also see how when the input is exactly on bin center, that all other bins will be zero in their response.