声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 1370|回复: 9

[综合讨论] 急,各位大虾看看这个程序该怎么修改,

[复制链接]
发表于 2009-5-8 15:26 | 显示全部楼层 |阅读模式

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

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

x
%*******************************************************************%
%f—模拟信号的频率
%用来模拟 模拟信号的 数字信号的采样频率Fs
%过采样频率fs
%*******************************************************************%
f=100; Fs=10000; N=1024; % fft点数=取样总点数
Ts=1/Fs; % 取样时间间隔
T=N*Ts; % 取样总时间=取样总点数*取样时间间隔
n=0:N-1; t=n*Ts; wn=2*f/Fs; Xn=sin(2*f*pi*t)+randn(1,N);

figure(1)
subplot(221); plot(t,Xn); title('滤波前信号'); axis([0 T/2 min(Xn) max(Xn)]);

X=abs(fft(Xn,N)); Pxx=X.*conj(X)/N; f0=Fs*(0:N/2)/N;
subplot(222);
plot(f0(1:N/2+1),Pxx(1:N/2+1)); axis([0 Fs/10 min(Pxx) max(Pxx)]); grid; title('滤波前信号的频谱');

%滤波
[b,a]=butter(2,wn); y=filter(b,a,Xn);
subplot(223); plot(t,y);title('滤波后信号'); axis([0 T/2 -1 1]);
Y=abs(fft(y,N)); Pyy=Y.*conj(Y)/N;
subplot(224); plot(f0,Pyy(1:N/2+1)); grid
axis([0 Fs/10 min(Pyy) max(Pyy)]); title('滤波后信号的频谱');

%采样点数,间隔的计算
fs=200 %采样频率
deltaN=Fs/fs %采样间隔
Ns=N/deltaN

%采样
for i=1:Ns, xd(i)=Xn((i-1)*deltaN+1); end

figure(2)
subplot(4,1,1); stem(xd,'.'); title('采样后离散信号'); axis([1 Ns min(Xd) max(Xd)]);


t=0:1/fs:N-1/Fs; w1=2*pi*10; % 显示从-20*pi到20*pi频率范围内的频谱
K=1000; % 计算出2*1000+1个频率点的值
k=0:K; w=k*w1/K; XD=xd*exp(-j*t'*w);
figure
plot(w,XD); title('采样后离散信号的频谱');


??? Error using ==> mtimes
Inner matrix dimensions must agree.

Error in ==> zibianchengxu at 71
XD=xd*exp(j*w*t);
就是想对一采样信号做频谱分析,然后观察过采样时的频谱,以及欠采样时频谱的重叠情况,怎么做都做不来了,各位大虾帮个忙啊,小弟感激不尽

[ 本帖最后由 ChaChing 于 2009-5-8 22:15 编辑 ]
回复
分享到:

使用道具 举报

发表于 2009-5-8 16:14 | 显示全部楼层
应该是矩阵的维数不相等。XD=xd*exp(j*w*t);这个里面的你好好检查一下。我找了半天,硬是没看到j ,w和t的值是多少   呵呵
 楼主| 发表于 2009-5-8 16:18 | 显示全部楼层

回复 沙发 liushuiwuxin 的帖子

我也发现就是这里的问题,但是就是不知道该怎么修改,
t=0:1/fs:N-1/Fs;
w1=2*pi*10; % 显示从-20*pi到20*pi频率范围内的频谱
K=1000; % 计算出2*1000+1个频率点的值
k=0:K;
w=k*w1/K;
这是我给的t和w值,j不用赋值吧
发表于 2009-5-8 16:46 | 显示全部楼层
w1=2*pi*10好像就是20*pi吧,怎么会是-20*pi到20*pi频率范围内的频谱
呢?如是-20*pi到20*pi则可用-20*pi:a:20*pi   a是间隔。w=k*w1/K;是什么意思哦?怎么乘以k后又除以k呢?这两个k是不是要加以区别呀?你的j是不是复数的单位呀?
 楼主| 发表于 2009-5-8 17:01 | 显示全部楼层

回复 地板 liushuiwuxin 的帖子

改了频率范围为w1=2*pi*300,两个k一个是大写,j是复数单位啊,我看书上做傅里叶变换的按照做的可就是不对,不知道为什么
发表于 2009-5-8 17:54 | 显示全部楼层
K=1000;k=0:K;w=k*w1/K;说明w的长度是1000;而XD=xd*exp(-j*t'*w);中for i=1:Ns ;xd(i)=Xn((i-1)*deltaN+1); end 说明xd的长度是Ns。Ns具体等于多少,我没找到相关数据,但是应该不是1000.他们的长度不相等,当然不能相乘了。而且这两个好像都是行向量,应该是不能用*的,要是长度相等的话,可以用点乘。也就是 XD=xd.*exp(-j*t'*w);你自己检查一下倒是需要怎么乘。
 楼主| 发表于 2009-5-8 18:28 | 显示全部楼层

回复 6楼 liushuiwuxin 的帖子

那我把K直接改为K=Ns,为什么还是不行啊,用点乘也不对,
发表于 2009-5-8 19:33 | 显示全部楼层
我刚才也运行了一下,出错信息是
??? Error using ==> mtimes
Out of memory. Type HELP MEMORY for your options.

Error in ==> wwww at 61
XD=xd*exp(-j*t'*w);
这种出错信息我以前也没遇到过,也不知道该怎么调试。等待高手来解答!
 楼主| 发表于 2009-5-8 19:38 | 显示全部楼层

回复 8楼 liushuiwuxin 的帖子

不管怎么样,还是谢谢你
发表于 2009-5-9 00:41 | 显示全部楼层
建议楼主说清楚些, 并看下本版规则及加强发问题方式!
楼主的问题已不是编程问题, 而是专业问题!
楼主的三个帖, 都应该移至信号处理方法版块, 并合成一帖吧!?
如此别人较容易知道LZ要什麽!
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

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

GMT+8, 2024-7-2 13:42 , Processed in 0.053176 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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