升余弦和根升余弦滤波器(SRRC,RRC)的单位脉冲响应
本博客详细讲述了升余弦和根升余弦滤波器的频域和时域表达式,最后给出了单位脉冲响应的
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[∣f∣−2Ts1−β])],0,∣f∣≤2T1−β2Ts1−β<∣f∣≤2Ts1+β 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+β(π4−1)),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)=Tsh(t)=πTs4β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)
图像
更多推荐
所有评论(0)