本博客详细讲述了升余弦和根升余弦滤波器的频域和时域表达式,最后给出了单位脉冲响应的Python 实现。

升余弦滤波器

升余弦滤波器(Raised-cosine filter)是一种经常作脉冲成型滤波器,它能够最大限度地减少码间干扰(ISI)。之所以会如此命名是因为,该滤波器的最简形式频谱 ( β = 1 \beta=1 β=1) 的非零部分为余弦函数且被抬升至水平轴 f f f 的上方1

数学描述

升余弦滤波器是低通奈奎斯特滤波器的一种实现,即具有对称性的滤波器。这意味着它的频谱在 f = ± 1 2 T s f=\pm \frac{1}{2T_s} f=±2Ts1表现出奇对称性( T s T_s Ts 是符号速率),如下:

频谱特性

  • 其频域表达式是一个分段函数:
    H ( f ) = { 1 , ∣ f ∣ ≤ 1 − β 2 T 1 2 [ 1 + cos ⁡ ( π T s β [ ∣ f ∣ − 1 − β 2 T s ] ) ] , 1 − β 2 T s < ∣ f ∣ ≤ 1 + β 2 T s 0 ,  otherwise  H(f)=\left\{\begin{array}{ll} 1, & |f| \leq \frac{1-\beta}{2 T} \\ \frac{1}{2}\left[1+\cos \left(\frac{\pi T_s}{\beta}\left[|f|-\frac{1-\beta}{2 T_s}\right]\right)\right], & \frac{1-\beta}{2 T_s}<|f| \leq \frac{1+\beta}{2 T_s} \\ 0, & \text { otherwise } \end{array}\right. H(f)= 1,21[1+cos(βπTs[f2Ts1β])],0,f2T1β2Ts1β<f2Ts1+β otherwise 
  • 其时域形式即单位脉冲响应为:
    h ( t ) = { π 4 T s sinc ⁡ ( 1 2 β ) , t = ± T s 2 β 1 T s sinc ⁡ ( t T s ) cos ⁡ ( π β t T s ) 1 − ( 2 β t T s ) 2 ,  otherwise  h(t)=\left\{\begin{array}{ll} \frac{\pi}{4 T_s} \operatorname{sinc}\left(\frac{1}{2 \beta}\right), & t= \pm \frac{T_s}{2 \beta} \\ \frac{1}{T_s} \operatorname{sinc}\left(\frac{t}{T_s}\right) \frac{\cos \left(\frac{\pi \beta t}{T_s}\right)}{1-\left(\frac{2 \beta t}{T_s}\right)^{2}}, & \text { otherwise } \end{array}\right. h(t)= 4Tsπsinc(2β1),Ts1sinc(Tst)1(Ts2βt)2cos(Tsπβt),t=±2βTs otherwise 
    这里 s i n c ( x ) = sin ⁡ π x π x \mathrm{sinc}(x)=\frac{\sin{\pi x}}{\pi x} sinc(x)=πxsinπx ,不是数学中的 sin ⁡ x / x \sin{x}/x sinx/x

代码实现

import numpy as np
def rc_h(t,beta=0,T=1,normlize=False):
    """TODO: RC的单位脉冲响应
    
    :t: 时刻,numpy array
    :beta: 滚降因子
    :T: 符号周期
    :normlize: 是否能量归一化
    :returns: numpy array

    """
    # https://en.wikipedia.org/wiki/Raised-cosine_filter
    # Raised-cosine filter
    pi = np.pi
    if beta == 0:
        h = 1/T*np.sinc(t/T)
    else:
        case1 = pi/(4*T)*np.sinc(1/(2*beta))
        case2 = 1/T*np.sinc(t/T)*np.cos(pi*beta*t/T)/(1-(2*beta*t/T)**2)
        # fix case2 bug when t = pm T/(4*beta)
        case2[np.isinf(case2)] = 0
        h = np.where(np.abs(t) <= T/(2*beta), case1,case2)
    return h if not normlize else h*np.sqrt(T) #能量归一化

if __name__ == "__main__":
    # test rc_h
    import matplotlib as mpl
    import matplotlib.pyplot as plt
    mpl.use('TkAgg')
    # diff beta and draw in one figure,then save it
    t = np.linspace(-5,5,1000)
    beta = [0,0.5,1]
    fig,ax = plt.subplots(1,1)
    ax.grid()
    for b in beta:
        h = rc_h(t,beta=b)
        ax.plot(t,h,label=f"beta={b}")
    ax.legend()
    ax.set_xlabel("t")
    ax.set_ylabel("h(t)")
    ax.set_title("RC unit impulse response")
    fig.savefig("rc_h.png")
    plt.show()

图像

升余弦脉冲响应

滤波符号时,它可以消除ISI, h ( n T s ) = 0 ( n ≠ 0 ) h(nT_s)=0(n\ne 0) h(nTs)=0(n=0) 。但是在实际的通信系统中,由于白噪声的影响,一般在发送和接收端匹配滤波,即采用根升余弦滤波器。

根升余弦滤波器

在信号处理中,根升余弦滤波器(Raised-cosine filter, RRC ),有时也称为平方根升余弦滤波器( square-root-raised-cosine filter,SRRC ),经常用作数字通信系统中的发送和接收滤波器,以执行匹配滤波。这有助于最小化符号间干扰(ISI)。两个这样的滤波器的组合响应是升余弦滤波器的响应2。它的名字来源于它的频率响应, H r r c H_{rrc} Hrrc是升余弦滤波器频率响应的平方根, H r c ( f ) H_{rc}(f) Hrc(f)
H r c ( f ) = H r r c ( f ) ⋅ H r r c ( f ) H_{rc}(f)=H_{rrc}(f)\cdot H_{rrc}(f) Hrc(f)=Hrrc(f)Hrrc(f)
即:
∣ H r r c ( f ) ∣ = ∣ H r c ( f ) ∣ |H_{rrc}(f)|=\sqrt{|H_{rc}(f)|} Hrrc(f)=Hrc(f)

数学描述

SRCC滤波器有两个重要参数,滚降系数 β \beta β, 符号率的导数 T s T_s Ts

H r r x ( f ) H_{rrx}(f) Hrrx(f)进行逆傅里叶变换,滤波器的单位脉冲响应:
h ( t ) = { 1 T s ( 1 + β ( 4 π − 1 ) ) , t = 0 β T s 2 [ ( 1 + 2 π ) sin ⁡ ( π 4 β ) + ( 1 − 2 π ) cos ⁡ ( π 4 β ) ] , t = ± T s 4 β 1 T s sin ⁡ [ π t T s ( 1 − β ) ] + 4 β t T s cos ⁡ [ π t T s ( 1 + β ) ] π t T s [ 1 − ( 4 β t T s ) 2 ] ,  otherwise  h(t)=\left\{\begin{array}{ll} \frac{1}{T_{s}}\left(1+\beta\left(\frac{4}{\pi}-1\right)\right), & t=0 \\ \frac{\beta}{T_{s} \sqrt{2}}\left[\left(1+\frac{2}{\pi}\right) \sin \left(\frac{\pi}{4 \beta}\right)+\left(1-\frac{2}{\pi}\right) \cos \left(\frac{\pi}{4 \beta}\right)\right], & t=\pm \frac{T_{s}}{4 \beta} \\ \frac{1}{T_{s}} \dfrac{\sin \left[\pi \frac{t}{T_{s}}(1-\beta)\right]+4 \beta \frac{t}{T_{s}} \cos \left[\pi \frac{t}{T_{s}}(1+\beta)\right]}{\pi \frac{t}{T_{s}}\left[1-\left(4 \beta \frac{t}{T_{s}}\right)^{2}\right]}, & \text { otherwise } \end{array}\right. h(t)= Ts1(1+β(π41)),Ts2 β[(1+π2)sin(4βπ)+(1π2)cos(4βπ)],Ts1πTst[1(4βTst)2]sin[πTst(1β)]+4βTstcos[πTst(1+β)],t=0t=±4βTs otherwise 
注意上式中 h ( t ) h(t) h(t)并不是归一化能量信号,上式 ∫ − ∞ ∞ h 2 ( t ) = T s \int_{-\infty}^\infty h^2(t)=T_s h2(t)=Ts,归一化3
s ( t ) = T s h ( t ) = 4 β π T s cos ⁡ [ ( 1 + β ) T s π t ] + T s 4 β t sin ⁡ [ ( 1 − β ) T s π t ] 1 − ( 4 β t T s ) 2 s(t)=\sqrt{T_s}h(t)=\frac{4 \beta}{\pi \sqrt{T_{s}}} \frac{\cos \left[\frac{(1+\beta)}{T_{s}} \pi t\right]+\frac{T_{s}}{4 \beta t} \sin \left[\frac{(1-\beta)}{T_{s}} \pi t\right]}{1-\left(\frac{4 \beta t}{T_{s}}\right)^{2}} s(t)=Ts h(t)=πTs 4β1(Ts4βt)2cos[Ts(1+β)πt]+4βtTssin[Ts(1β)πt]

代码实现

import numpy as np
def srrc_h(t,beta=0,T=1,normlize=False):
    """TODO: RC的单位脉冲响应
    
    :t: 时刻,numpy array
    :beta: 滚降因子
    :T: 符号周期
    :normlize: 是否能量归一化
    :returns: numpy array

    """
    #  https://en.wikipedia.org/wiki/Root-raised-cosine_filter
    #  Root-raisaed-cosine filter impulse response
    pi = np.pi
    if beta==0:
        h = 1/T*np.sinc(t/T)
    else:
        cond1 = t==0
        case1= 1/T*(1+beta*(4/pi-1))
        cond2 = t==np.abs(T/(4*beta))
        case2 = beta/(T*np.sqrt(2))*((1+2/pi)*np.sin(pi/4/beta)+(1-2/pi)*np.cos(pi/4/beta))

        
        cond3 = np.logical_and(np.logical_not(cond1),np.logical_not(cond2))
        fracA=np.sin(pi*t*(1-beta)/T)+4*beta*t/T*np.cos(pi*t/T*(1+beta))
        fracB=pi*t*(1-(4*beta*t/T)**2)
        case3 = fracA/fracB
        case3[fracB==0]=0

        h = cond1*case1+cond2*case2+cond3*case3
    return h if not normlize else h*np.sqrt(T)

图像

SRCC的单位脉冲响应


  1. https://en.wikipedia.org/wiki/Raised-cosine_filter ↩︎

  2. https://en.wikipedia.org/wiki/Root-raised-cosine_filter ↩︎

  3. https://gssc.esa.int/navipedia/index.php/Square-Root_Raised_Cosine_Signals_(SRRC) ↩︎

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐