滤波器之升余弦


            一直很想深入学习滤波器方面的知识,图书馆也去借了书然后准备看,结果就是:然后就没有然后了。DSP一直是自己的短板,因为这里面感觉小的技巧好多,而且都需要自己去琢磨,像滤波器这种东西,我脑海里也只有少的可怜点印象。比如什么FIR 和 IIR 之类的。理论尚且薄弱更不谈实践了,这也是制约自己进一步提高的重要方面。但是,现在的自己仿佛早已经没了以前那么耐心去啃书了,最多上网googling,再看点博文。所以,前今天看到导师改的msn签名:静心!觉得很有启发,确实啊现在这个急功近利的社会,要做到的确有难度。说到这,又不得不再次表达对杨鸿文老师的敬佩,我觉得他应该是真正做到了那点,现在是很难再找到这样热爱自己工作的老师了,除了敬佩只剩瞻仰!

   貌似每次写正文前,我都要唠叨几句。哎,唠叨唠叨也就过去了,人一辈子也不就这样嘛。好了,言归正传,今天谈谈最常见的滤波器----升余弦滤波器。先说说我们为什么这么喜欢这个滤波器,最主要的原因就是它的拖尾衰减的比Nyquist滤波器(sinc())快,这样的好处就是当我们出现了定时误差的时候,码间干扰尽可能降低了。另一方面,既然衰减快了,说明它的频率成分肯定是增加了,这就导致带宽的增加。所以,它是以带宽换取低ISI的典型应用。接下来给出升余弦滤波器时域和频域表达式:

 

 

 

 

接下来我们就实践下,我们从时域来产生滤波器,再验证频域图像是否正确。

 

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Author	: ZXY
% Email		: zxy_ee@163.com
% Version	: 1.0
% Date		: 2012-2-16
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
看代码,直接点左上角view plain!

clear all
fs = 20;
%we define T = 1,so we ignore it!!
% defining the sinc filter
sincNum = sin(pi*[-fs:1/fs:fs]); % numerator of the sinc function
sincDen = (pi*[-fs:1/fs:fs]); % denominator of the sinc function
sincDenZero = find(abs(sincDen) < eps);%the eps is 2.2204e-016
sincOp = sincNum./sincDen;
sincOp(sincDenZero) = 1; % sin(pix/(pix) =1 for x =0 诺比达法则

alpha = 0;
cosNum = cos(alpha*pi*[-fs:1/fs:fs]);
cosDen = (1-(2*alpha*[-fs:1/fs:fs]).^2);
cosDenZero = find(abs(cosDen)<eps);
cosOp = cosNum./cosDen;
cosOp(cosDenZero) = pi/4;
gt_alpha0 = sincOp.*cosOp;
N = length(gt_alpha0);
GF_alpha0 = fft(gt_alpha0,N);

alpha = 0.5;
cosNum = cos(alpha*pi*[-fs:1/fs:fs]);
cosDen = (1-(2*alpha*[-fs:1/fs:fs]).^2);
cosDenZero = find(abs(cosDen)<eps);
cosOp = cosNum./cosDen;
cosOp(cosDenZero) = pi/4;%诺比达法则直接计算
gt_alpha5 = sincOp.*cosOp;
N = length(gt_alpha5);
GF_alpha5 = fft(gt_alpha5,N);

alpha = 1;
cosNum = cos(alpha*pi*[-fs:1/fs:fs]);
cosDen = (1-(2*alpha*[-fs:1/fs:fs]).^2);
cosDenZero = find(abs(cosDen)<eps);
cosOp = cosNum./cosDen;
cosOp(cosDenZero) = pi/4;
gt_alpha1 = sincOp.*cosOp;
N = length(gt_alpha5);
GF_alpha1 = fft(gt_alpha1,N);

close all
figure
plot([-fs:1/fs:fs],[gt_alpha0],'r','LineWidth',2)
hold on
plot([-fs:1/fs:fs],[gt_alpha5],'g','LineWidth',2)
plot([-fs:1/fs:fs],[gt_alpha1],'b','LineWidth',2)
legend('alpha=0','alpha=0.5','alpha=1');
grid on
xlabel('时间, t')
ylabel('幅度, g(t)')
title('时域图像')

figure
%除以fs的原因是因为采样导致幅度加权了。
plot([-N/2:N/2-1]/N*fs, abs(fftshift(GF_alpha0))/fs,'r','LineWidth',2);
hold on
plot([-N/2:N/2-1]/N*fs, abs(fftshift(GF_alpha5))/fs,'g','LineWidth',2);

plot([-N/2:N/2-1]/N*fs, abs(fftshift(GF_alpha1))/fs,'b','LineWidth',2);
legend('alpha=0','alpha=0.5','alpha=1');
axis([-2 2 0 1.2])
grid on
xlabel('频率, f')
ylabel('幅值, |G(f)|')
title('频域图像')

对于其中频域计算在前面一篇文章中有说明,利用FFT 及 IFFT实现傅立叶正反变换

结果如图所示:

 

好了,我们可以看出与理论分析是一致的,由于我们用的是很粗暴的矩形窗,所以你能明显看见吉布斯现象。同样,当拖尾衰减更快时,它的频域也无情地展开了。这个仿真的难点还是写出它的时域表达式,其他的都还好说。原来仿真很少加窗,现在可以用上自己的升余弦了,不再去用自带的函数,参数不好记啊那些。关键是对原理更清楚了。比如:我们数据发送出去之前,要成形滤波,这样来抵抗ISI,那么我们就用数据与这里的滤波器(准确说是带根号,整体效果还是一个升余弦)做卷积运算。注意的是,这里的数据也要相应的过采样,关于采样,等自己弄明白来说,好多东西自己还没理解那么透彻。完!



  • 56
    点赞
  • 176
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
Matlab平方根余弦滤波器余弦滤波器是数字信号处理中常见的滤波算法,两者的主要区别在于其滤波响应的幅频特性。 平方根余弦滤波器(Root Raised Cosine Filter,简称RRCF)是一种特殊的卷积滤波器,它的频率响应是类似于平方根函数的形状。这种滤波器用于数字通信系统中的匹配滤波,用于接收端对发送端发出的带符号的调制信号进行匹配。它的主要特点是能够有效地抑制信号带外的噪声和干扰,同时保留信号带内的信息。 在Matlab中,实现RRCF可以使用firrcos函数,该函数可以生成镶嵌在余弦窗口中的滤波器。用户需要指定余弦窗口和带宽扩展因子等参数,firrcos函数会自动计算出所需的滤波器系数。 余弦滤波器(Raised Cosine Filter,简称RCF)也是一种常见的数字滤波器,它的特点是具有类似于余弦函数的频率响应形态。这种滤波器也用于数字通信系统中的匹配滤波,用于信号发送端对调制信号进行滤波,以减少带宽占用和降低误码率。 Matlab中实现RCF可以使用firrcos函数或者firrcos2函数,这两个函数的参数相对较少,用户只需要指定滤波器的带宽、抽样频率等基本参数即可。这种滤波器相对于RRCF来说,在频域上存在一定的失真,但是实现起来相对简单,使用广泛。 总之,Matlab中的平方根余弦滤波器余弦滤波器都是数字滤波器的常见算法,用户可以根据具体的实际情况和需求选择适合的算法,并使用Matlab提供的函数进行实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值