Matlab-奈奎斯特滤波器实现《二》

来源:互联网 发布:佰斯纳特 淘宝 编辑:程序博客网 时间:2024/05/21 15:23

    Matlab-奈奎斯特滤波器实现《一》中编写了根升余弦滤波器的函数,其实Matlab也有自带的函数用于产生根升余弦滤波器。需要注意的是:当需要将信号通过根升余弦或者升余弦滤波器之前,注意时刻一定要相互对应。通常为了实现脉冲整形的效果,常常需要对输入信号进行IPOINT = fd/fs点内插 0 ;其中 fd为滤波器的采样频率,fs为传输数据的符号速率。

    下面,图解传输的数字信号通过脉冲整形滤波器的过程:

首先,产生需要传输的数据,为了方便观察,参数的数据为:x=[1 0 1];同时,假设符号速率为sr = 256000;%传输速率



接着产生脉冲成型滤波器的时域冲击响应 xh。



在最开始有提到,若此时的输入信号 x 不进行内插零那么又会怎么样呢?下面直接将 x 和 xh 卷积看看输出的时域响应是什么:



对,可以看出来这输出的信号和输入的信号 x 差得万里!最主要的原因是: 卷积的两项时刻不对应,脉冲成型滤波器时间分辨率为:tstp = 1/(sr*IPOINT);而输入信号的时间分辨率为:ts = 1/sr。同时脉冲成型,我们希望对一个符号成型一下就ok,所以,常常对输入信号 x 内插 0 以满足相同的时间分辨率。
下面,就将输入信号内插零:
xx = zeros(1,length(x)*IPOINT);xx(1:IPOINT:end) = x;% 补零


明显可以看出,这个才是脉冲成型后我们想要的结果。

仿真源代码:
%*****************************************************%hrolllcoef_detect.m%功能:对成型滤波器的实验%Author: jdf%Date:2017-3-14%******************************************************addpath(fileparts(mfilename('full')));clc;%*******全局变量*******%*********** hrollfoef2.m 升余弦滤波器所需要的系数******N = 3; %规定实验数据alfs = 0.5;%滚降系数irfn = 21;%滤波器阶数%**********************************************IPOINT = 8;%采样点数(高于传输速率的倍数)sr = 256000;%传输速率%*******开始实验********% x = randn(1,N)>0.5;x=[1 0 1];x = 2*x-1;xh = rcosine(sr, sr*IPOINT);% xh = hrollfcoef2(irfn,8,sr,alfs);  %若要仿真Matlab-奈奎斯特滤波器实现《一》中的滤波器,解除此项的注释y = conv(x,xh);xx = zeros(1,length(x)*IPOINT);xx(1:IPOINT:end) = x;% 补零yy = conv(xx,xh);mid = length(xh)/2;tt = ([0 :length(xh)-1]-mid)/7;%将中点mid放置在0的位置try    clf(21)catch me    disp(me);endfigure(21);%*******画图****************************************************subplot(221);plot(x,'ro-');grid on; xlabel('Time');ylabel('Amplitude');title('Transmission Data');subplot(222);plot(tt,xh,'ro-');grid on; xlabel('Time(t/Ts)');ylabel('Amplitude');title('filter impulse response');set(gca,'xtick',[-6:1:6]);xlim([-6 6]);subplot(223);plot(y,'ro-');grid on;  xlabel('Time');ylabel('Amplitude');title('passed filter without IPOINT oversample');subplot(224);plot(yy,'ro-');grid on; xlabel('Time');ylabel('Amplitude');title('passed filter with IPOINT oversample');hold on;plot([floor(length(xh)/2) floor(length(xh)/2)],[-2 2],'b--','LineWidth',2);plot([length(yy)-floor(length(xh)/2) length(yy)-floor(length(xh)/2)],[-2 2],'b--','LineWidth',2);%****************************end of file **************************

1 0