如何在Python中生成根升余弦时域冲激响应及排查生成失败问题
解决根升余弦冲激响应生成的问题
看起来你在手动实现根升余弦(RRC)冲激响应时踩了几个常见的坑,我帮你梳理一下问题点,再给出修正后的代码:
你的代码里的核心问题
np.linspace参数完全用错了linspace的第三个参数是样本数量,不是步长!你写的np.linspace(0, 1000/2.4e6, 1/2.4e6 )会把样本数解析成一个极小值,直接被截断为0,根本生成不了有效时间序列。而且RRC是偶对称的,只取正时间轴也看不到完整的类sinc波形。浮点数直接相等判断不可靠
比如x[i] == Ts/(4*Beta),由于浮点数精度误差,几乎不会出现精确相等的情况,应该用绝对值差小于极小值(如1e-9)来判断特殊点。公式语法错误
分母部分((np.pi*x[i])/Ts)(1-((4*Beta*x[i])/Ts)**2)少了乘号,应该是((np.pi*x[i])/Ts) * (1-((4*Beta*x[i])/Ts)**2),否则会触发语法报错。时间范围太窄
只取0到1000/2.4e6秒的范围,连一个完整的符号周期(Ts=10µs)都覆盖不了,自然看不到完整的RRC波形。
修正后的完整代码
import numpy as np import matplotlib.pyplot as plt # 定义参数 Fs = 2.4e6 # 采样频率 Beta = 0.5 # 滚降系数 Ts = 1/100000 # 符号周期(10µs) # 生成对称时间轴:覆盖±5个符号周期,保证波形完整 total_time = 10 * Ts # 总时间跨度10Ts num_samples = int(total_time * Fs) # 计算样本数 t = np.linspace(-5*Ts, 5*Ts, num_samples) # 初始化RRC响应数组 rrc_response = np.zeros_like(t) epsilon = 1e-9 # 浮点数比较的精度阈值 # 逐点计算RRC冲激响应 for i in range(num_samples): ti = t[i] if abs(ti) < epsilon: # 处理t=0的特殊情况 val = (1/Ts) * (1 + Beta * (4/np.pi - 1)) rrc_response[i] = val elif abs(abs(ti) - Ts/(4*Beta)) < epsilon: # 处理t=±Ts/(4Beta)的特殊情况 term1 = (1 + 2/np.pi) * np.sin(np.pi/(4*Beta)) term2 = (1 - 2/np.pi) * np.cos(np.pi/(4*Beta)) val = (Beta/(Ts*np.sqrt(2))) * (term1 + term2) rrc_response[i] = val else: # 通用情况的计算公式 numerator = np.sin(np.pi*ti/Ts * (1 - Beta)) + 4*Beta*ti/Ts * np.cos(np.pi*ti/Ts * (1 + Beta)) denominator = (np.pi*ti/Ts) * (1 - (4*Beta*ti/Ts)**2) val = (1/Ts) * (numerator / denominator) rrc_response[i] = val # 绘制波形 plt.figure(figsize=(10, 6)) plt.plot(t, rrc_response, linewidth=1.5) plt.xlabel('Time (s)') plt.ylabel('Amplitude') plt.title('Root Raised Cosine Impulse Response (Beta=0.5)') plt.grid(True, linestyle='--', alpha=0.7) plt.show()
补充:用CommPy正确生成RRC的方法
如果你之前用commPy的rrcosfilter失败,大概率是参数顺序搞错了,正确用法如下:
from commpy.filters import rrcosfilter # 参数顺序:(抽头数, 滚降系数, 符号周期, 采样频率) num_taps = num_samples # 和手动实现的样本数一致 h_rrc, t_rrc = rrcosfilter(num_taps, Beta, Ts, Fs) # 对比手动实现和CommPy的结果 plt.figure(figsize=(10, 6)) plt.plot(t_rrc, h_rrc, label='CommPy RRC', linewidth=1.5) plt.plot(t, rrc_response, label='Manual RRC', linestyle='--', linewidth=1.5) plt.xlabel('Time (s)') plt.ylabel('Amplitude') plt.title('RRC Impulse Response Comparison') plt.legend() plt.grid(True, linestyle='--', alpha=0.7) plt.show()
运行上面的代码就能得到你预期的类sinc波形了。
内容的提问来源于stack exchange,提问作者Janre
相关产品推荐
相关产品推荐

