5827418 发表于 2007-12-12 13:05

为什么这个卷积总是有问题?

这是一个褶积滤波的程序
输入信号为x(n)滤波因子为h(n)结果保存在yn当中

现在x(n)和h(n)的信号产生都没有问题问题就处在卷积和画图上
具体见代码   红色部分为出问题部分



N=0:199;    %产生x(n)信号
t1=N*0.004;
s=exp(-100*t1).*sin(2*pi*25*t1)+exp(-100*t1.*t1).*sin(2*pi*40*t1);
p=0.5*(sin(2*pi*5*t1)+cos(2*pi*80*t1));
x=s+p;      %x(n)信号产生玩完毕长度为200

ff1=20;      %产生h(n)信号
ff2=45;
w1=2*pi*ff1;
w2=2*pi*ff2;
w0=(w1+w2)/2;
w3=(w2-w1)/2;
m1=-60:-1;
t2=m1*0.004;
h1=(2*cos(w0*t2).*sin(w3*t2))./(pi*t2);
h2=(2*w3)/pi;
m2=1:60;
t2=m2*0.004;
h3=(2*cos(w0*t2).*sin(w3*t2))./(pi*t2);
h=horzcat(h1,h2,h3);      %h(n)信号产生完毕 长度不足200

h4=zeros(1,79);      %产生全零数列 用于后面补零

M1=-60:60;
t2=M1*0.004;
subplot(3,1,1),stem(t1,x);    %产生x(n)的图像

xlabel('t');ylabel('x(t)');
subplot(3,1,2),stem(t2,h);    %产生h(n)的图像
xlabel('t');ylabel('h(t)');

h=horzcat(h1,h2,h3,h4);    %对h(n)补零 使其长度与x(n)相同(全部为200)

na=min(x)+min(h);   %卷积开始
nb=max(x)+max(h);
x1n=ones(1,length(x));
x2n=ones(1,length(h));
n=;
yn=conv(x1n,x2n); %卷积完毕

subplot(3,1,3),stem(n,yn);%产生y(n)的图像
xlabel('n');ylabel('y(t)');title('卷积结果')


红色部分为我在参考书看到的修改后的卷积代码   说是可以实现两个不是从零开始的数列的卷积并且画图
但是每次运行都会提示画图时的x轴与y轴长度不匹配请问是哪里出了问题? 是不是这段代码本身有问题?

还有就是如果把最后画图的部分改为X轴自动匹配y轴 即 改为subplot(3,1,3),stem(yn);那么就可以正常画图 画出的图如下



请帮我看看这个图是对的吗? 总感觉不大对~~~


最后我也试过不用书上的代码而直接把x与y进行卷积即把原代码中的红色部分改为

yn=conv(x,h); %卷积完毕
subplot(3,1,3),stem(yn);%产生y(n)的图像
xlabel('n');ylabel('y(t)');title('卷积结果')

运行产生的图像如下:


这和上图的结果完全不一样 不知道哪个是对的啊????

[ 本帖最后由 eight 于 2007-12-12 15:16 编辑 ]

sigma665 发表于 2007-12-12 13:23

可以找个简单的卷积的例子,最好能手算就知道结果的那种
分别用你的那2种方法试试看
看哪个正确用哪个

另外:n=;
yn=conv(x1n,x2n); %卷积完毕

n有90个
yn有399个
当然不匹配

[ 本帖最后由 sigma665 于 2007-12-12 13:26 编辑 ]

eight 发表于 2007-12-12 15:16

原帖由 5827418 于 2007-12-12 13:05 发表 http://www.chinavib.com/forum/images/common/back.gif
这是一个褶积滤波的程序
输入信号为x(n)滤波因子为h(n)结果保存在yn当中

现在x(n)和h(n)的信号产生都没有问题问题就处在卷积和画图上
具体见代码   红色部分为出问题部分



N=0:199; ...
自己调试一下便知道哪里出问题了

news 发表于 2007-12-12 15:19

x1n=ones(1,length(x));
x2n=ones(1,length(h));
n=;
yn=conv(x1n,x2n); %卷积完毕

变成了矩阵全是1的卷积了,已经不是原来信号的卷积了。
所以我认为第二种方法是正确的。

sigma665 发表于 2007-12-12 16:20

我同意楼上的

5827418 发表于 2007-12-13 10:37

我也觉得有问题~~

那么有没有对两个一维数列进行卷积的代码啊? 要求这两个数列都是可以从任意数开始

matlab内置的函数只能进行从零开始的两个数列的卷积

eight 发表于 2007-12-13 11:00

原帖由 5827418 于 2007-12-13 10:37 发表 http://www.chinavib.com/forum/images/common/back.gif
我也觉得有问题~~

那么有没有对两个一维数列进行卷积的代码啊? 要求这两个数列都是可以从任意数开始

matlab内置的函数只能进行从零开始的两个数列的卷积
晕!你不会使用 conv(a(2:4),b(6:8)) 这种形式吗
页: [1]
查看完整版本: 为什么这个卷积总是有问题?