使用matlab如何求卷积,利用MATLAB求解卷积的方法分类
利用MATLAB 求解卷積的方法分類 求法一:
求有序列A (n )=1 n=3,4,5,6,7,8,9,,10,11,1,2.B(n)=1 n=2,3,4,5,6,7,8,9,. 代碼:
n1=3;n2=12;
>> m1=2;m2=9;
>> a=ones(1,(n2-n1+1));
>> b=ones(1,(m2-m1+1));
>> c=conv(a,b);
>> nc1=n1+m1;nc2+m2+n2;
nc1=n1+m1;nc2=m2+n2;
>> kc=nc1:nc2;
>> kc,c
stem(kc,c),text(18,6,'非平凡法')
>> CC=[zeros(1,kc(1)),c];
kc=0:(n2+m2);
>> stem(kc,CC),text(18,6,'非平凡法')
求法二:
N1=3;N2=12;
a=ones(1,N2+1);a(1:N1)=0;
M1=2;M2=9;
b=ones(1,M2+1);b(1:M1)=0;
c=conv(a,b);
kc=0:(N2+M2);
kc,c
subplot(2,1,1),stem(kc,c),text(20,6,'0 起點(diǎn)法')
求法三:
求有限序列與無(wú)限序列的卷積
clear
>> M=4;
>> h=[0.1,0.35,-0.42,-0.05,0.15];
>> N=10000;
>>rng default %恢復(fù)matlab 啟動(dòng)時(shí)默認(rèn)的全局隨機(jī)流。
>> u=randsrc(1,N);
>>tic
>> y_filter=filter(h,1,u);
>> t_filter=toc;
>> tic
>> ct=[u(1),zeros(1,M)];
>> ut=toeplitz(ct,u);
>> y_toe=h*ut;
>> t_toe=toc;
>> %卷積指令法
>> tic
>> y_conv=conv(h,u);
>> t_conv=toc;
>> y_conv(N+1:end)=[];
filter 是一維數(shù)字濾波器
使用方法:
Y = filter(B,A,X) ,輸入X 為濾波前序列,Y 為濾波結(jié)果序列,B/A 提供濾波器系數(shù),B 為分子, A 為分母
整個(gè)濾波過(guò)程是通過(guò)下面差分方程實(shí)現(xiàn)的:
a(1)*y(n) = b(1)*x(n) + b(2)*x(n-1) + ... + b(nb+1)*x(n-nb) - a(2)*y(n-1) - ... - a(na+1)*y(n-na)
[Y,Zf] = filter(B,A,X,Zi),輸入X 為濾波前序列,Y 為濾波結(jié)果序列,B/A 提供濾波器系數(shù),B 為分子, A 為分母,
在MATLAB 中,可以用函數(shù)y=filter(p,d,x)實(shí)現(xiàn)差分方程的仿真,也可以用函數(shù) y=conv(x,h)計(jì)算卷積,用y=impz(p,d,N)求系統(tǒng)的沖激響應(yīng)。
實(shí)現(xiàn)差分方程
先從簡(jiǎn)單的說(shuō)起:
filter([1,2],1,[1,2,3,4,5])
實(shí)現(xiàn) y[k]=x[k]+2*x[k-1]
y[1]=x[1]+2*0=1%(x[1]之前狀態(tài)都用0)
y[2]=x[2]+2*x[1]=2+2*1=4
a. 下面程序是用來(lái)實(shí)現(xiàn)h 和x 的卷積得,分別用了filter 和conv 函數(shù),兩者函數(shù)得出的結(jié)果一樣。
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;
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;
要實(shí)現(xiàn)下式的沖擊響應(yīng)和階躍響應(yīng),可以分別采用三種方法。
y[n]+0.75y[n-1]+0.125y[n-2]=x[n]-x[n-1]。
b. 單位沖激響應(yīng):
(1)用filter 函數(shù)
a1=[1,0.75,0.125];
b1=[1,-1];
n=0:20;
x1=[1 zeros(1,20)];
y1filter=filter(b1,a1,x1);
stem(n,y1filter);
title('y1filter');
xlabel('x');
ylabel('y');
(2)用conv 函數(shù)
a1=[1,0.75,0.125];
b1=[1,-1];
x1=[1 zeros(1,10)];
[h]=impz(b1,a1,10);
y1conv=conv(h,x1);
n=0:19;
stem(n,y1conv,'filled')
(3)用impz 函數(shù)
a1=[1,0.75,0.125];
b1=[1,-1];
impz(b1,a1,21);
c. 單位階躍響應(yīng):
(1)用filter 函數(shù)
a1=[1,0.75,0.125];
b1=[1,-1];
n=0:20;
x2=ones(1,21);
y1filter=filter(b1,a1,x2);
stem(n,y1filter);
title('y1filter_step');
xlabel('x');
ylabel('y');
(2)用conv 函數(shù)
a1=[1,0.75,0.125];
b1=[1,-1];
x2=ones(1,21);
[h]=impz(b1,a1,20);
y1=conv(h,x2);
y1conv=y1(1:21); %為何y1conv 要取y1中1:21的值,解釋見
n1=0:20; %y2à單位階躍響應(yīng)à用conv 函數(shù)中注釋
stem(n1,y1conv,'filled');
title('y1conv');
xlabel('n');
ylabel('y1[n]');
(3)用impz 函數(shù)
a=[1,0.75,0.125];
b=1;
impz(b,a)
即y=filter(p,d,x)用來(lái)實(shí)現(xiàn)差分方程,d 表示差分方程輸出y 的系數(shù),p 表示輸入x 的系數(shù),而x 表示輸入序列。輸出結(jié)果長(zhǎng)度數(shù)等于x 的長(zhǎng)度。
而y=conv(x,h)是用來(lái)實(shí)現(xiàn)卷級(jí)的,對(duì)x 序列和h 序列進(jìn)行卷積,輸出的結(jié)果個(gè)數(shù)等于x 的長(zhǎng)度與h 的長(zhǎng)度之和減去1。
y=impz(p,d,N)是用來(lái)實(shí)現(xiàn)沖擊響應(yīng)的,d 和p 的定義見filter ,N 表示沖擊響應(yīng)輸出的序列個(gè)數(shù)。
總結(jié)
以上是生活随笔為你收集整理的使用matlab如何求卷积,利用MATLAB求解卷积的方法分类的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深度学习String、StringBuf
- 下一篇: matlab卷积神经网络的创建与图片识别