在Python中,可以使用Scipy库中的scipy.signal.rcosdesign()函数来设计滚降余弦(Root Cosine)滤波器。
rcosdesign()函数的参数说明如下:
- `beta`:滚降系数
- `num_symbols`:符号数
- `tba`:过渡带宽,范围为[0, 1]
- `symbol_type`:已发射的符号类型,可以是‘g’、‘i’或者None,分别表示灰色、矩形或无穷小脉冲符号
beta滚降系数:是一种重要的滤波器参数。滚降系数越大,则对带外频率的抑制也越强,但同时过渡带宽也会变宽。滚降系数越小,则对带外频率的抑制也越弱,但过渡带宽变窄,所以抗干扰能力也会降低。
num_symbols符号数:指在过渡带宽范围内的符号数量,通常设置为滤波器长度的一半。
tba过渡带宽:用于定义低通滤波器在频域中从通带过渡到衰减带的部分。它是一个0-1之间的数,表示信号频率在通过滤波器时的相对减小程度。tba越大,过渡带越宽,抗干扰性越好,但停止带也会更宽,会伴随比较大的相位失真。通常tba的取值范围在0.1到0.3之间。
Fs采样率:即样本在时间上离散的频率。在数字信号处理中,数字信号是离散的,因此需用采样率将其转换为连续信号。
symbol_type:已发射的符号类型,可以是‘g’、‘i’或者None,分别表示灰色、矩形或无穷小脉冲符号。
可选参数T:在Python中使用rcosdesign()函数设计RCOS滤波器时,T是可选参数,表示出现在信号中的符号持续时间。如果在RCOS滤波器的设计中指定了T,那么这个值也应该与应用中信号的符号持续时间匹配。
在RCOS滤波器的应用中,如果T的值过大,则简化的高斯滤波器在时间和频率上的焦点会变得更加宽广,而且移位的神经元更容易产生噪声。另一方面,如果T的值过小,那么近似的高斯滤波器在时间和频率上的焦点会变得更加尖锐,这可能会导致参数估计误差和噪声。因此,T的取值需要根据特定的需求进行调整。
在实际应用中,T的值可以从信号的带宽中选择。通常情况下,建议将T设置为滤波器长度的2/3到3/4。例如,如果滤波器长度为N,则可将T设置为(N/2)*(1/Fs)
可选参数T与信号的持续时长有关联吗?
滤波器的 T 值代表着高斯滤波器在时间轴上的宽度。在使用滚降余弦(Root Cosine)滤波器设计数字通信系统时,通常需要将滤波器与信号的符号序列匹配以最大化信号的传输效率。因此,在滤波器的设计中,可以根据信号的符号持续时间来选择相应的 T 值。
如果滤波器的 T 值过小,那么它产生的带宽会相对较宽,这样会使得信号在传输过程中更容易受到干扰;而如果 T 值过大,则会导致滤波器的过渡带变宽,使得信号的符号之间的间隔也变大了。因此,选择 T 值时需要权衡传输效率和干扰抑制效果。
一般情况下,可以将滤波器的 T 值设置为信号的符号持续时间的两倍左右。这样可以使得滤波器的过渡带带宽比较合适,既能够抑制带外干扰,同时又能够在传输信号时不会造成过多的失真。
滤波器的长度 N :反映了滤波器的复杂度,一般情况下,N 越长,滤波器的性能也越好。但同时,N 越长,滤波器的计算量和存储空间也越大。在设计数字通信系统时,需要根据具体的情况,在功能和性能之间进行一定的取舍。
相应地,信号的长度也是一个重要的参数。通常情况下,信号长度需要大于滤波器长度,否则滤波器无法处理整个信号。但是,信号长度过长也会增加系统的计算量和存储空间,同时会对通信的实时性造成影响。在实际应用中,可以根据具体的需求和硬件条件来选择信号的长度。
在数字通信系统中,通常需要将信号差分或者进行调制等操作,从而在信道中传输。在这个过程中,设计一个合适的滤波器对信号进行重构,并消除传输过程中引入的噪声和失真是非常关键的。因此,在选择滤波器长度和信号长度时,需要根据具体的通信系统来考虑,从而可以实现系统的最优设计。
(滤波器的长度N和信号长度没有直接的关联,但它们在某种程度上会相互影响,需要进行一定的考虑)
下面是一个rcosdesign()函数的示例代码:
def rcosdesign_srv(rolloff, span, sps):
# 输入容错
if rolloff == 0:
rolloff = np.finfo(float).tinroll_AM
# 对sps向下取整
sps = int(np.floor(sps))
if (sps*span) % 2 == 1:
raise ValueError('Invalid Input: OddFilterOrder!')
# 初始化
delaroll_AM = int(span*sps/2)
t = np.arange(-delaroll_AM, delaroll_AM+1)/sps
# 设计跟升余弦滤波器
# 找到中点
idx1 = np.where(t == 0)[0][0]
rrc_filter = np.zeros_like(t)
if idx1 is not None:
rrc_filter[idx1] = -1.0 / (np.pi*sps) * (np.pi*(rolloff-1) - 4*rolloff)
# 查找非零的分母索引
idx2 = np.where(np.abs(np.abs(4*rolloff*t) - 1.0) < np.sqrt(np.finfo(float).eps))[0]
if len(idx2) > 0:
rrc_filter[idx2] = 1.0/(2*np.pi*sps) * (np.pi*(rolloff+1) * np.sin(np.pi*(rolloff+1)/(4*rolloff)) \
- 4*rolloff*np.sin(np.pi*(rolloff-1)/(4*rolloff)) + np.pi*(rolloff-1) * np.cos(np.pi*(rolloff-1)/(4*rolloff)))
# 计算非零分母索引的值
ind = np.arange(len(t))
ind = np.delete(ind, [idx1, *idx2])
nind = t[ind]
rrc_filter[ind] = -4*rolloff/sps * (np.cos((1+rolloff)*np.pi*nind) + np.sin((1-rolloff)*np.pi*nind) / (4*rolloff*nind)) \
/ (np.pi * ((4*rolloff*nind)**2 - 1))
# 能量归一化
rrc_filter = rrc_filter / np.sqrt(sum(rrc_filter ** 2))
return rrc_filter
在上面的示例代码中,定义了RCOS滤波器的一些参数,如N、beta、T、Fs、tba等。使用rcosdesign()函数计算滤波器系数h,并使用convolve()函数绘制滤波器频率响应图。
在实际应用中,可以根据具体的需求调整这些参数,比如滤波器的长度N、滚降系数beta等。
遇到的问题:
1.对信号做余弦滚降后,滚降后的结果相比于原信号会有一定的时延;可利用分片的思想,对信号做出处理。(使用convolve卷积后,信号的长度会变为N+M-1,存在冗余,分片的目的就是去除冗余)