在MATLAB中,可以用函数y=filter(p,d,x)实现差分方程的仿真,也可以用函数 y=conv(x,h)计算卷积。

(1)即y=filter(p,d,x)用来实现差分方程,d表示差分方程输出y的系数,p表示输入x的系数,而x表示输入序列。输出结果长度数等于x的长度。

实现差分方程,先从简单的说起:

        filter([1,2],1,[1,2,3,4,5]),实现y[k]=x[k]+2*x[k-1]

        y[1]=x[1]+2*0=1    (x[1]之前状态都用0)

        y[2]=x[2]+2*x[1]=2+2*1=4


(2)y=conv(x,h)是用来实现卷级的,对x序列和h序列进行卷积,输出的结果个数等于x的长度与h的长度之和减去1。

卷积公式:z(n)=x(n)*y(n)= ∫x(m)y(n-m)dm.

程序一:以下两个程序的结果一样

(1)h = [3 2 1 -2 1 0 -4 0 3]; % impulse response

         x = [1 -2 3 -4 3 2 1]; % input sequence

         y = conv(h,x);

         n = 0:14;

         subplot(2,1,1);

         stem(n,y);

         xlabel('Time index n'); ylabel('Amplitude');

         title('Output Obtained by Convolution'); grid;

(2)x1 = [x zeros(1,8)];

          y1 = filter(h,1,x1);

          subplot(2,1,2);

         stem(n,y1);

         xlabel('Time index n'); ylabel('Amplitude');

         title('Output Generated by Filtering'); grid;


程序二:filter和conv的不同

             x=[1,2,3,4,5];

             h=[1,1,1];

             y1=conv(h,x)

             y2=filter(h,1,x)

             y3=filter(x,1,h)


 结果:y1 =1     3     6     9    12     9     5

           y2 = 1     3     6     9    12

           y3 =1     3     6  


可见:filter函数y(n)是从n=0开始,认为所有n<0都为0;而conv是从卷积公式计算,包括n<0部分。

                因此filter 和conv 的结果长短不同


程序三:滤波后信号幅度的变化

                num=100; %总共1000个数

                x=rand(1,num); %生成0~1随机数序列 

                x(x>0.5)=1;

                x(x<=0.5)=-1;

                h1=[0.2,0.5,1,0.5,0.2];

                h2=[0,0,1,0,0];

                y1=filter(h1,1,x);

                y2=filter(h2,1,x);

                n=0:99;

                subplot(2,1,1);

                stem(n,y1);

                subplot(2,1,2);

                stem(n,y2);


可见:滤波后信号的幅度是发生变化的,最大幅度值也会变化。

转自:cherish_xmm博客