声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 976|回复: 6

[综合讨论] 为什么这个卷积总是有问题?

[复制链接]
发表于 2007-12-12 13:05 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
这是一个褶积滤波的程序
输入信号为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=[na:nb];
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);  那么就可以正常画图 画出的图如下
QQ截图未命名.jpg


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


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

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


运行产生的图像如下:
QQ截图未命名fft.jpg

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

[ 本帖最后由 eight 于 2007-12-12 15:16 编辑 ]
回复
分享到:

使用道具 举报

发表于 2007-12-12 13:23 | 显示全部楼层
可以找个简单的卷积的例子,最好能手算就知道结果的那种
分别用你的那2种方法试试看
看哪个正确用哪个

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


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

[ 本帖最后由 sigma665 于 2007-12-12 13:26 编辑 ]
发表于 2007-12-12 15:16 | 显示全部楼层
原帖由 5827418 于 2007-12-12 13:05 发表
这是一个褶积滤波的程序
输入信号为x(n)  滤波因子为h(n)  结果保存在yn当中

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



N=0:199; ...

自己调试一下便知道哪里出问题了
发表于 2007-12-12 15:19 | 显示全部楼层
x1n=ones(1,length(x));
x2n=ones(1,length(h));
n=[na:nb];
yn=conv(x1n,x2n); %卷积完毕


变成了矩阵全是1的卷积了,已经不是原来信号的卷积了。
所以我认为第二种方法是正确的。
发表于 2007-12-12 16:20 | 显示全部楼层
我同意楼上的
 楼主| 发表于 2007-12-13 10:37 | 显示全部楼层
我也觉得有问题~~

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

matlab内置的函数只能进行从零开始的两个数列的卷积
发表于 2007-12-13 11:00 | 显示全部楼层
原帖由 5827418 于 2007-12-13 10:37 发表
我也觉得有问题~~

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

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

晕!你不会使用 conv(a(2:4),b(6:8)) 这种形式吗

评分

1

查看全部评分

您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-11-12 07:49 , Processed in 0.067265 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表