您的位置:首页 > 编程语言 > MATLAB

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

2017-04-02 22:39 211 查看
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);
end
figure(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 **************************
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息