Why Nyquist Sampling Rate depends on Bandwidth and not max frequency?

Is the Nyquist sampling rate same for different bands if those bands have same bandwith? E.g. Would the Nyquist Sampling rate be same for 1000-1400 MHz band as for 100-500 MHz band because both the bands have same bandwidth (400 MHz)? This doesn't make logical sense to me as I guess Nyquist sampling rate should depend on the max frequency that we are measuring. E.g. I think sampling rate/frequency for 1000-1400 MHz band should be 2800 MHz. Can someone please help me understand this?

This is a great question and sampling is always a little tricky.

side note: It's important to make sure that no down-conversion has been done, that the " 1000-1400 MHz band" has not already been mixed with a 900 MHz local oscillator and shifted to 100-500 MHz before conversion.

I had a hunch that you can get by with a lower frequency. I chose 1000 MHz (twice 500 MHz) but maybe a lower one works as well. The magic of sampling used as down-conversion which happens in hardware radios (like what's in our phones and other 21st century radio chip sets) should be our friend here.

So I added five sine waves; 1010, 1100, 1250, 1270, and 1490 MHz sampled at 1000 MHz and it seems to work fine!

The red dots are the initial frequencies minus 1000 MHz and they match the observed frequencies in the log power spectrum.

Script for test:

import numpy as np
import matplotlib.pyplot as plt

frequencies = np.array([1010, 1100, 1250, 1270, 1490])
N = 10000000 # 10^7

f_sample = 1000. # MHz

d = 1/f_sample
times = d * np.arange(N)

y = sum([np.sin(2 * np.pi * f * times) for f in (frequencies)])
ft = np.fft.fftshift(np.fft.fft(y))
ft_freqs = np.fft.fftshift(np.fft.fftfreq(N, d=d))
p = np.abs(ft)**2
pnorm = p / p.max()

if True:
fig, (ax1, ax2) = plt.subplots(2, 1)
ax1.plot(times[:500], y[:500], linewidth=0.5)
ax1.set_title('sampled at 1 ns, first 500 of ' + str(N) + ' points shown')
ax2.plot(ft_freqs, pnorm, linewidth=0.5)
ax2.set_yscale('log')
ax2.set_ylim(1E-25, None)
ax2.set_title('log power')
ax2.set_xlabel('frequency (MHz)')
ax2.plot(frequencies - 1000., 10 * np.ones(len(frequencies)), '.r')
fig.suptitle('frequencies: ' + str(frequencies) + ' MHz', fontsize=14)
plt.show()

• +1, You may not get aliasing for sampling at less than double the max Freq, but sampling at more than double is the only way to ensure that no aliasing occurs (without down-conversion as you subtly point out). In your above example, I think you would get a tone if you injected a sine wave at 1000 MHz. Oct 13 at 17:30
• @ConnorGarcia I'm no expert in this; now that you mention aliasing, it seems that this depends on aliasing for down-conversion, and that there not be any other signals outside of the >1000 to <1500 MHz lest they show up unexpectedly somewhere as well. I'm more than open to corrections/comments/additional answers here!
– uhoh
Oct 13 at 22:17
• @ConnorGarcia Actually I think "Because we can take advantage of aliasing." is the actual answer to the question as asked? (which I have stumbled upon without really realizing it)
– uhoh
Oct 13 at 22:42
• This does seem to show that it works but lacks a few equations to show why the sampling rate is more or less independent of the carrier frequency. Oct 14 at 13:14
• @CarlWitthoft I have trouble thinking about a "carrier frequency" in the context of radio astronomy since natural radio phenomena are unmodulated. I just think you could get some weird results especially in interferometry if you sampled at sub-Nyquist (2x the max Freq). Oct 14 at 16:19