iwannaher 发表于 2007-5-14 13:29

一个qpsk调制小程序,总提示出错

我在仿真RS码时用8PSK来进行调制,想对比分析一下,就换做QPSK调制。可是程序写出来,总不对,麻烦大家帮忙看一下,运行的时候提示这样的错误:
??? Attempted to access dsource1(21433); index out of bounds because numel(dsource1)=21432.

Error in ==> qpsk at 28
if((dsource1(i)==0)&(dsource2(i)==0))

程序如下:
function =qpsk(input,No)
u=input.x;
sgma=sqrt(No);
%信号映射成qpsk
s00=;
s01=;
s11=[-1 0];
s10=;
for i=1:length(u)
switch u(i)
case 0
dsource1(i)=0;
dsource2(i)=0;
case 1
dsource1(i)=0;
dsource2(i)=1;
case 2
dsource1(i)=1;
dsource2(i)=0;
case 3
dsource1(i)=1;
dsource2(i)=1;
end;
end;
%经过高斯信道
for i=1:length(u)
n=gngauss(sgma);
if((dsource1(i)==0)&(dsource2(i)==0))
r=s00+n;
elseif((dsource1(i)==0)&(dsource2(i)==1))
r=s01+n;
elseif((dsource1(i)==1)&(dsource2(i)==0))
r=s10+n;
else
r=s11+n;
end;
%计算互相关度
c00=dot(r,s00);
c01=dot(r,s01);
c10=dot(r,s10);
c11=dot(r,s11);
%对第i个符号进行判决
c_max=max();
if(c00==c_max)
decis1(i)=0;
decis2(i)=0;
elseif(c01==c_max)
decis1(i)=0;
decis2(i)=1;
elseif(c10==c_max)
decis1(i)=1;
decis2(i)=0;
else
decis1(i)=1;
decis2(i)=1;
end;
end;
%映射成多进制信号
for i=1:length(u)
if((decis1(i)==0)&(decis2(i)==0))
channelout(i)=0;
elseif((decis1(i)==0)&(decis2(i)==1))
channelout(i)=1;
elseif((decis1(i)==1)&(decis2(i)==0))
channelout(i)=2;
else
channelout(i)=3;
end
end

[ 本帖最后由 eight 于 2007-5-14 15:02 编辑 ]

eight 发表于 2007-5-14 15:03

原帖由 iwannaher 于 2007-5-14 13:29 发表 http://www.chinavib.com/forum/images/common/back.gif
我在仿真RS码时用8PSK来进行调制,想对比分析一下,就换做QPSK调制。可是程序写出来,总不对,麻烦大家帮忙看一下,运行的时候提示这样的错误:
??? Attempted to access dsource1(21433); index out of bound ...


像这种越界问题根据出错提示的位置设置断点,然后调试一下就可以了

iwannaher 发表于 2007-5-14 15:39

没法调试呀,不知道该怎样改程序。无语了~~~

eight 发表于 2007-5-14 15:50

原帖由 iwannaher 于 2007-5-14 15:39 发表 http://www.chinavib.com/forum/images/common/back.gif
没法调试呀,不知道该怎样改程序。无语了~~~


如果你自己都调试不到,外人怎帮到你?

iwannaher 发表于 2007-5-14 17:25

你误会我的意思了。如果我能改过来的话我就不到论坛上来提问了,正是因为有问题所以才来问。肯定是某个细节出了问题。

eight 发表于 2007-5-14 19:53

原帖由 iwannaher 于 2007-5-14 17:25 发表 http://www.chinavib.com/forum/images/common/back.gif
你误会我的意思了。如果我能改过来的话我就不到论坛上来提问了,正是因为有问题所以才来问。肯定是某个细节出了问题。

我的意思是,如果连熟悉该背景的你都无法知道哪里出问题了,而且你的程序带输入参数,但没有任何数据可以测试,试问外人如何帮你看?从相反的角度想想,如果我给你这样的函数,你能否回答哪里出问题了?

iwannaher 发表于 2007-5-15 22:17

这只是一个子程序,输入的参数放在主程序中的。我就想看看这个子程序有问题没

eight 发表于 2007-5-15 22:25

原帖由 iwannaher 于 2007-5-15 22:17 发表 http://www.chinavib.com/forum/images/common/back.gif
这只是一个子程序,输入的参数放在主程序中的。我就想看看这个子程序有问题没


如果你用的是2006以上的matlab,可以用 cell mode 功能

iwannaher 发表于 2007-5-18 10:35

发现问题所在了:设置断点运行后发现u变量的大小为u:1x21435 double运行到dsource1就变成了1x21432。数组的大小不匹配。可是以前后8PSK调制的时候没遇到这个问题,改成4psk就不通了。如何修改dsource这个变量,请达人指教!

eight 发表于 2007-5-18 10:49

原帖由 iwannaher 于 2007-5-18 10:35 发表 http://www.chinavib.com/forum/images/common/back.gif
发现问题所在了:设置断点运行后发现u变量的大小为u:1x21435 double运行到dsource1就变成了1x21432。数组的大小不匹配。可是以前后8PSK调制的时候没遇到这个问题,改成4psk就不通了。如何修改dsource这个变量, ...


使用变量前最好先预分配空间,建议多看看 置顶贴:聚宝盆 中提到的精华贴:“写给学习 matlab 的新手们”

caowei 发表于 2007-6-1 17:21

把你的程序发到我的邮箱。8psk.qpsk都发
邮箱是michaeler@163.com

我是学生我也做8PSK调制,能不能参考一下
邮箱caowei986@sina.com

[ 本帖最后由 eight 于 2007-6-1 17:33 编辑 ]
页: [1]
查看完整版本: 一个qpsk调制小程序,总提示出错