用PythonNumPy图解LTE 20M带宽与30.72M采样率的数学关系在通信工程领域理解信号带宽与采样率的关系是每个工程师的必修课。但面对枯燥的公式推导很多人往往陷入知其然而不知其所以然的困境。本文将带你用Python和NumPy通过代码实现和可视化直观理解LTE系统中20M带宽为何对应30.72M采样率这一经典问题。1. 实信号与复信号的频谱特性对比1.1 信号类型的基本概念在通信系统中信号可以分为实信号和复信号两大类实信号每个时间点的取值都是实数如sin(t)、cos(t)复信号每个时间点的取值可能是复数如e^(jωt)用Python可以轻松生成这两种信号import numpy as np import matplotlib.pyplot as plt t np.linspace(0, 1, 1000) # 1秒时间序列 f 5 # 5Hz频率 # 生成实信号 real_signal np.sin(2 * np.pi * f * t) # 生成复信号 complex_signal np.exp(1j * 2 * np.pi * f * t) plt.figure(figsize(12, 4)) plt.subplot(121) plt.plot(t, real_signal) plt.title(实信号(sin)) plt.subplot(122) plt.plot(t, np.real(complex_signal), label实部) plt.plot(t, np.imag(complex_signal), label虚部) plt.title(复信号(e^jωt)) plt.legend() plt.show()1.2 频谱对称性分析实信号和复信号在频域表现出截然不同的特性特性实信号复信号频谱对称性对称不对称正负频率分量共轭对称独立带宽利用率低高通过FFT可以直观看到这种差异def plot_spectrum(signal, title): fft_result np.fft.fft(signal) freq np.fft.fftfreq(len(signal), d1/1000) # 采样率1kHz plt.figure(figsize(10, 4)) plt.plot(freq, np.abs(fft_result)) plt.title(title) plt.xlabel(Frequency (Hz)) plt.ylabel(Magnitude) plt.xlim(-50, 50) plt.grid() plt.show() plot_spectrum(real_signal, 实信号频谱) plot_spectrum(complex_signal, 复信号频谱)2. 复信号在通信中的优势2.1 带宽效率翻倍的原理复信号的不对称频谱特性带来了关键优势频谱不对称只需传输单边频谱带宽减半相同信息量所需带宽仅为实信号的一半正交调制I/Q两路信号可独立传输这种效率提升可以用数学公式表示实信号带宽 2 × 最大频率分量 复信号带宽 最大频率分量2.2 I/Q调制实现通信系统通过I/Q调制将复信号转换为实信号传输# 生成基带复信号 I np.random.randn(1000) # I路数据 Q np.random.randn(1000) # Q路数据 complex_baseband I 1j * Q # 调制到载波 fc 100 # 载波频率100Hz t np.arange(1000) / 1000 # 1kHz采样率 carrier np.exp(1j * 2 * np.pi * fc * t) modulated complex_baseband * carrier # 转换为实信号传输 real_transmit np.real(modulated) # 可视化 plt.figure(figsize(12, 6)) plt.subplot(221) plt.plot(I[:100], labelI路) plt.plot(Q[:100], labelQ路) plt.legend() plt.title(基带I/Q信号) plt.subplot(222) plt.plot(np.real(modulated[:100]), label实部) plt.plot(np.imag(modulated[:100]), label虚部) plt.legend() plt.title(调制后复信号) plt.subplot(223) plt.plot(real_transmit[:100]) plt.title(实际传输的实信号) plt.subplot(224) plot_spectrum(real_transmit, 传输信号频谱) plt.tight_layout() plt.show()3. LTE采样率的数学推导3.1 从带宽到采样率LTE 20M带宽系统的采样率推导过程复信号特性20M带宽对应实际最大频率10M奈奎斯特定理采样率 2 × 最大频率 20M工程实现考虑IFFT点数等因素最终选择30.72M用Python验证这一关系bandwidth 20e6 # 20MHz max_freq bandwidth / 2 # 复信号最大频率10MHz nyquist_rate 2 * max_freq # 20MHz print(f理论最小采样率: {nyquist_rate/1e6}MHz)3.2 OFDM参数设计LTE系统的具体参数选择参数值说明子载波间隔15kHzOFDM基本参数RB数量10020M带宽配置每RB子载波12LTE标准总子载波1200100×12IFFT点数2048最接近的2^n计算采样率subcarrier_spacing 15e3 # 15kHz fft_size 2048 sampling_rate fft_size * subcarrier_spacing print(f实际采样率: {sampling_rate/1e6}MHz)4. 完整仿真验证4.1 构建LTE-like信号让我们用Python构建一个简化的LTE信号模型def generate_ofdm_signal(): # 参数设置 num_rb 100 # 资源块数 sc_per_rb 12 # 每RB子载波数 fft_size 2048 # IFFT点数 subcarrier_spacing 15e3 # 子载波间隔15kHz # 生成频域信号 freq_signal np.zeros(fft_size, dtypecomplex) active_sc num_rb * sc_per_rb freq_signal[1:active_sc//21] np.random.randn(active_sc//2) 1j*np.random.randn(active_sc//2) freq_signal[-active_sc//2:] np.random.randn(active_sc//2) 1j*np.random.randn(active_sc//2) # IFFT转换到时域 time_signal np.fft.ifft(freq_signal) * fft_size return time_signal ofdm_signal generate_ofdm_signal()4.2 采样率验证验证不同采样率下的信号重建质量def resample_signal(signal, original_rate, new_rate): from scipy import signal as sp_signal num_samples int(len(signal) * new_rate / original_rate) return sp_signal.resample(signal, num_samples) original_rate 30.72e6 rates_to_test [15e6, 20e6, 25e6, 30.72e6, 40e6] plt.figure(figsize(12, 8)) for i, rate in enumerate(rates_to_test): resampled resample_signal(ofdm_signal, original_rate, rate) reconstructed resample_signal(resampled, rate, original_rate) plt.subplot(3, 2, i1) plt.plot(np.abs(reconstructed[:100]), labelf{rate/1e6}MHz) plt.legend() plt.title(f采样率: {rate/1e6}MHz) plt.tight_layout() plt.show()4.3 频谱效率可视化比较不同信号类型的频谱利用率def plot_spectral_efficiency(): # 生成三种信号 t np.linspace(0, 1, 10000) f1, f2 5, 10 # 实信号(双边带) real_dsb np.sin(2*np.pi*f1*t) 0.5*np.sin(2*np.pi*f2*t) # 复信号 complex_sig np.exp(1j*2*np.pi*f1*t) 0.5j*np.exp(1j*2*np.pi*f2*t) # 实信号(单边带) real_ssb np.real(complex_sig) # 计算频谱 def calc_spectrum(sig): fft_val np.fft.fft(sig) freq np.fft.fftfreq(len(sig), t[1]-t[0]) return freq, np.abs(fft_val) # 绘图 plt.figure(figsize(15, 5)) plt.subplot(131) freq, spec calc_spectrum(real_dsb) plt.plot(freq, spec) plt.title(实信号(双边带)) plt.xlim(-15, 15) plt.subplot(132) freq, spec calc_spectrum(complex_sig) plt.plot(freq, spec) plt.title(复信号) plt.xlim(-15, 15) plt.subplot(133) freq, spec calc_spectrum(real_ssb) plt.plot(freq, spec) plt.title(实信号(单边带)) plt.xlim(-15, 15) plt.tight_layout() plt.show() plot_spectral_efficiency()