You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python中生成根升余弦时域冲激响应及排查生成失败问题

解决根升余弦冲激响应生成的问题

看起来你在手动实现根升余弦(RRC)冲激响应时踩了几个常见的坑,我帮你梳理一下问题点,再给出修正后的代码:

你的代码里的核心问题

  1. np.linspace参数完全用错了
    linspace的第三个参数是样本数量,不是步长!你写的np.linspace(0, 1000/2.4e6, 1/2.4e6 )会把样本数解析成一个极小值,直接被截断为0,根本生成不了有效时间序列。而且RRC是偶对称的,只取正时间轴也看不到完整的类sinc波形。

  2. 浮点数直接相等判断不可靠
    比如x[i] == Ts/(4*Beta),由于浮点数精度误差,几乎不会出现精确相等的情况,应该用绝对值差小于极小值(如1e-9)来判断特殊点。

  3. 公式语法错误
    分母部分((np.pi*x[i])/Ts)(1-((4*Beta*x[i])/Ts)**2)少了乘号,应该是((np.pi*x[i])/Ts) * (1-((4*Beta*x[i])/Ts)**2),否则会触发语法报错。

  4. 时间范围太窄
    只取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:50:23