# rcosdesign
升余弦 FIR 脉冲整形滤波器设计
函数库: TySignalProcessing
# 语法
b = rcosdesign(beta,span,sps)
b = rcosdesign(beta,span,sps,shape)
# 说明
b=rcosdesign(beta,span,sps) 返回系数 b,是由 beta 指定的滚降因子的平方根升余弦 FIR 滤波器系数。 滤波器被截断以跨越符号,每个符号周期包含sps样本。 滤波器阶数,sps*span,必须是偶数。 滤波能量为 1。
b=bandpass(beta,span,sps,shape) 将 shape 设置为 "sqrt" 时返回平方根升余弦滤波器,将形状设置为 "normal" 时返回正常升余弦 FIR 滤波器。
# 示例
设计平方根升余弦滤波器
指定滚降因子 0.25。 将滤波器截断为 6 个符号,并用 4 个样本表示每个符号。 验证 "sqrt" 是 shape 参数的默认值。
using TyPlot
using TySignalProcessing
h = rcosdesign(0.25, 6, 4);
mx = maximum(abs.(h - rcosdesign(0.25, 6, 4, "sqrt")))
mx = 0.0
a, b = impz(h)
figure()
stem(b, a, markerfacecolor = "auto")
xlabel("Samples")
ylabel("Amplitude")
title("Impulse Response")
正弦滤波器和方根升余弦滤波器的脉冲响应
比较正余弦滤波器和平方根余弦滤波器。一个理想的(无限长)正余弦脉冲整形滤波器相当于两个理想的级联方根余弦滤波器。因此,FIR 法向滤波器的脉冲响应应类似于与自身卷积的平方根滤波器的脉冲响应。
创建一个滚降为 0.25 的正余弦滤波器。指定该滤波器跨越 4 个符号,每个符号 3 个采样点。
using TySignalProcessing
using TyPlot
using TyMath
rf = 0.25
span = 4
sps = 3
h1 = rcosdesign(rf,span,sps,"normal")
a, b = impz(h1)
figure()
stem(b, a, markerfacecolor = "auto")
xlabel("Samples")
ylabel("Amplitude")
title("Impulse Response")
正常滤波器的过零点为 sps 的整数倍。因此,它符合奈奎斯特的零符号间干扰标准。而平方根滤波器则不然:
h2 = rcosdesign(rf,span,sps,"sqrt")
a, b = impz(h2)
figure()
stem(b, a, markerfacecolor = "auto")
xlabel("Samples")
ylabel("Amplitude")
title("Impulse Response")
将方根滤波器与自身卷积。从最大值开始向外截断脉冲响应,使其长度与 h1 相同。使用最大值对响应进行归一化处理。然后,将卷积后的平方根滤波器与正常滤波器进行比较。
h3 = conv(h2,h2)
p2 = ceil(length(h3)/2)
m2 = ceil(p2-length(h1)/2)
M2 = floor(p2+length(h1)/2)
ct = h3[Int(m2):Int(M2)]
x1, = findmax(abs.(h1))
x2, = findmax(abs.(ct))
figure()
stem([h1/x1 ct/x2],filled=true)
xlabel("Samples")
ylabel("Normalized amplitude")
legend("h1","h2 * h2")
由于正常滤波器的长度有限,卷积响应与正常滤波器的响应并不一致。增加跨度可使响应更加一致,并更好地符合奈奎斯特准则。
将信号通过升余弦滤波器
本例演示了如何将信号通过一个平方根、升余弦滤波器。
指定滤波器参数。
using TySignalProcessing
using TyPlot
using TyMath
rng = MT19937ar(1234)
rolloff = 0.25
span = 6
sps = 4
生成平方根升余弦滤波器系数。
b = rcosdesign(rolloff, span, sps)'
创建双极数据向量。
d = 2*randi(rng,[0 1], 100, 1) .- 1
对数据进行升采样和滤波,以进行脉冲整形。
x = upfirdn(d, b, sps)
加入噪音。
r = x + randn(rng,size(x))*0.01
对接收到的信号进行滤波和下采样,以进行匹配滤波。
y = upfirdn(r, b, 1, sps)
y = 112×1 Matrix{Float64}:
-0.0006561107301481651
0.0005609915107483601
0.00496127132705578
-0.016181354004618308
0.0506185401247891
-0.05407216388565074
-0.9590327521255205
1.0130691443042978
⋮
-0.9898560340716342
0.988609737295547
0.04502105935562493
-0.05669835830899387
0.04519329302898772
-0.009799185288896912
0.0007591176279980351
0.00022960126031149066
# 输入参数
beta - 滚降系数非负实数
滚降因子,指定为不大于 1 的实数非负标量。滚降因子决定了滤波器的额外带宽。 零滚降对应于 brick-wall 滤波器,单位滚降对应于纯升余弦。
数据类型: Float | Int
span - 符号数量正整数
符号数,指定为正整数标量。
数据类型: Int
sps - 每符号样本数正整数
每个符号的样本数(过采样因子),指定为正整数标量。
数据类型: Int
shape - 升余弦窗的形状"sqrt"(默认) | "normal"
升余弦窗口的形状,指定为 "normal" 或 "sqrt"。
数据类型: String
# 输出参数
b - FIR 滤波器系数向量
升余弦滤波器系数,以向量形式返回。
数据类型: Float
# 参考文献
[1] Tranter, William H., K. Sam Shanmugan, Theodore S. Rappaport, and Kurt L. Kosbar. Principles of Communication Systems Simulation with Wireless Applications. Upper Saddle River, NJ: Prentice Hall, 2004.