梦晓 发表于 2009-5-8 15:26

急,各位大虾看看这个程序该怎么修改,

%*******************************************************************%
%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();

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(); grid; title('滤波前信号的频谱');

%滤波
=butter(2,wn); y=filter(b,a,Xn);
subplot(223); plot(t,y);title('滤波后信号'); axis();
Y=abs(fft(y,N)); Pyy=Y.*conj(Y)/N;
subplot(224); plot(f0,Pyy(1:N/2+1)); grid
axis(); 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();


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 编辑 ]

liushuiwuxin 发表于 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不用赋值吧

liushuiwuxin 发表于 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是复数单位啊,我看书上做傅里叶变换的按照做的可就是不对,不知道为什么

liushuiwuxin 发表于 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,为什么还是不行啊,用点乘也不对,

liushuiwuxin 发表于 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 的帖子

不管怎么样,还是谢谢你

ChaChing 发表于 2009-5-9 00:41

建议楼主说清楚些, 并看下本版规则及加强发问题方式!
楼主的问题已不是编程问题, 而是专业问题!
楼主的三个帖, 都应该移至信号处理方法版块, 并合成一帖吧!?
如此别人较容易知道LZ要什麽!
页: [1]
查看完整版本: 急,各位大虾看看这个程序该怎么修改,