为什么这个卷积总是有问题?
这是一个褶积滤波的程序输入信号为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 编辑 ] 可以找个简单的卷积的例子,最好能手算就知道结果的那种
分别用你的那2种方法试试看
看哪个正确用哪个
另外:n=;
yn=conv(x1n,x2n); %卷积完毕
n有90个
yn有399个
当然不匹配
[ 本帖最后由 sigma665 于 2007-12-12 13:26 编辑 ] 原帖由 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; ...
自己调试一下便知道哪里出问题了 x1n=ones(1,length(x));
x2n=ones(1,length(h));
n=;
yn=conv(x1n,x2n); %卷积完毕
变成了矩阵全是1的卷积了,已经不是原来信号的卷积了。
所以我认为第二种方法是正确的。 我同意楼上的 我也觉得有问题~~
那么有没有对两个一维数列进行卷积的代码啊? 要求这两个数列都是可以从任意数开始
matlab内置的函数只能进行从零开始的两个数列的卷积 原帖由 5827418 于 2007-12-13 10:37 发表 http://www.chinavib.com/forum/images/common/back.gif
我也觉得有问题~~
那么有没有对两个一维数列进行卷积的代码啊? 要求这两个数列都是可以从任意数开始
matlab内置的函数只能进行从零开始的两个数列的卷积
晕!你不会使用 conv(a(2:4),b(6:8)) 这种形式吗
页:
[1]