脉冲成型滤波器仿真
脉冲型滤波器用成型脉冲即数字1用矩形脉冲表示用升余弦脉冲或高斯脉冲表示主要用于基带数据处理。
在数字通信系统中,基带信号进入调制器前,波形是矩形脉冲,突变的上升沿和下降沿包含高频成分较丰富,信号的频谱一般比较宽。从本质上说,脉冲成形就是一种滤波。数字通信系统的信号都必须在一定的频带内,但是基带脉冲信号的频谱是一个Sa函数,在频带上是无限宽的,单个符号的脉冲将会延伸到相邻符号码元内产生码间串扰,这样就会干扰到其他信号,这是不允许的。为了消除干扰,信号在发射之前要进行脉冲成形滤波,把信号的频率约束在带内。因此在信道带宽有限的条件下,要降低误码率,提升信道频带利用率,需要在信号传输前,对其进行脉冲成形处理,改善其频谱特,产生适合信道传输的波形。符号/秒代表单位波特(Baud),波特率是符号信息的比特率。一般的脉冲成型是要过采样的,不然没有意义,因为成型滤波会扩展带宽,过采样是为了减少频谱混叠。
常用的脉冲成型滤波器有RC成型(升余弦)、Gaussian成型等。
Matlab作为一个强大的仿真工具,在通信信号处理中有着广泛的应用。新版的Matlab(2014a)中关于滤波器设计,很多API都做了更新,下面个根据文档仿真和对比几个成型滤波器。
早些版本的firrcos函数用来设计升余弦滤波器的函数,现在已经更改成了rcosdesign函数。
例如:设计一个16阶升余弦滤波器,载波频率Fc = 1KHz,滚降系数0.25,采样率为8KHz。
N = 16;
Fc = 1000;
R = 0.25;
Fs = 8000;
h = firrcos(N, Fc, R, Fs, 'rolloff', 'normal');
figure();plot(h)
下图是滤波器的抽头系数,阶数为16共有17个抽头。
如果用rcosdesign函数来设计这个滤波器,那么要用下面的调用方法来实现。
h1 = rcosdesign(R, N/(Fs/Fc/2), Fs/Fc/2,'normal');
h1 = h1 / max(h1) / (Fs/Fc/2); %重新量化一下系数
figure;plot(h1)
同样进行绘图,结果同上面的相同。
在Matlab工具箱中,涉及升余弦滤波器的函数有好几个:rcosflt 使用升余弦滤波器对输入信号进行滤波,rcosine设计升余弦滤波器,rcosiir 设计升余弦IIR滤波器,firrcos 升余弦滤波器设计。他们大部分已经慢慢被Matlab抛弃(新版本的Matlab将不赞成使用,但是会因为兼容性的历史原因被保留)。
下面重点介绍一下 rcosdesign函数,这个函数数Matlab推荐的用来做升余弦成型滤波的函数。
[语法]
b = rcosdesign(beta,span,sps)
b = rcosdesign(beta,span,sps,shape)
[描述]
b = rcosdesign(beta,span,sps) 函数返回一个滚降系数为beta的均方根升余弦函数。函数被截断为span个符号并且每个符号周期有sps个采样点。滤波器的阶数为 span*sps并且必须为偶数。滤波器的能量为1。
b = rcosdesign(beta,span,sps,shape)中,最后一个参数shape,当shape设置为'sqrt'时返回均方根升余弦滤波器系数,当shape被设置为'normal'时,返回一个升余弦滤波器的系数。
[例如]
设计一个滚降系数为0.25,符号截断数为6,每符号采样点为4的滤波器。
h = rcosdesign(0.25, 6, 4);
mx = max(abs(h - rcosdesign(0.25, 6, 4)));
fvtool(h,'Analysis','impluse');
下面的程序片段做了一个成型滤波的过程。
设计一个48阶的升余弦FIR滤波器,滚降因子为0.5,发送速率为1被速率,过采样率为8倍过采样。
%% filter: order = 48, rolloff factor: alpha = 0.5, sps = 8
% b = firros(n,Fc,df,Fs) Fc:cutoff frequency,df: transmition bandwidth, Fs:oversampling frequency
h = firrcos(48, 0.5, 0.5, 8); %Fc = 1/2, h = rcosdesign(0.5, 6, 8);也可以
figure(1);
plot(h);
grid on;
xlabel('Time');
ylabel('Amplitude');
title(' raised cosine rolloff filter');
tx_bits1x = randint(100,1)*2 -1;
tx_bits8x = zeros(1,800);
tx_bits8x(1:8:end) = tx_bits1x;
tx_shaped = filter(h,1,tx_bits8x);
tx_sampled = tx_shaped(1:8:end);
figure(2);
stem(tx_bits1x(1:40));
title('orginal bitstream');
figure(3);
plot(tx_shaped(1:100));
title('output waveform');
grid on;
figure(4);
stem(tx_sampled(1:40));
grid on;
title('sampled output');
图1:成型滤波器的系数
图2:原始的数据比特流
图3:经过滤波器后的波形
图4:抽取之后的数据
rocsdesign是firrcos的替代,在新版的matlab中建议使用rcosdesign,具体请看MarthWorks的文档。下面展示了它们之间的转换方法。
N = 48; R = 0.5; beta = R; Fs = 8; Fc = 0.5; sps = Fs/(2*Fc); span = N/sps; b1 = firrcos(N,Fc,R,Fs,'rolloff','normal'); b1n = rcosdesign(beta, span, sps, 'normal'); b1n = b1n / max(b1n) /sps; figure; plot(b1) hold on plot(b1n, 'r-.') grid on legend('firrcos', 'rcosdesign'); max(abs(b1n-b1));