声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 2602|回复: 10

[编程技巧] 一个qpsk调制小程序,总提示出错

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

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

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

x
我在仿真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 [channelout]=qpsk(input,No)
u=input.x;
sgma=sqrt(No);
%信号映射成qpsk
s00=[1 0];
s01=[0 1];
s11=[-1 0];
s10=[0 -1];
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([c00 c01 c10 c11 ]);
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 编辑 ]
回复
分享到:

使用道具 举报

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



像这种越界问题根据出错提示的位置设置断点,然后调试一下就可以了
 楼主| 发表于 2007-5-14 15:39 | 显示全部楼层
没法调试呀,不知道该怎样改程序。无语了~~~
发表于 2007-5-14 15:50 | 显示全部楼层
原帖由 iwannaher 于 2007-5-14 15:39 发表
没法调试呀,不知道该怎样改程序。无语了~~~



如果你自己都调试不到,外人怎帮到你?
 楼主| 发表于 2007-5-14 17:25 | 显示全部楼层
你误会我的意思了。如果我能改过来的话我就不到论坛上来提问了,正是因为有问题所以才来问。肯定是某个细节出了问题。
发表于 2007-5-14 19:53 | 显示全部楼层
原帖由 iwannaher 于 2007-5-14 17:25 发表
你误会我的意思了。如果我能改过来的话我就不到论坛上来提问了,正是因为有问题所以才来问。肯定是某个细节出了问题。


我的意思是,如果连熟悉该背景的你都无法知道哪里出问题了,而且你的程序带输入参数,但没有任何数据可以测试,试问外人如何帮你看?从相反的角度想想,如果我给你这样的函数,你能否回答哪里出问题了?
 楼主| 发表于 2007-5-15 22:17 | 显示全部楼层
这只是一个子程序,输入的参数放在主程序中的。我就想看看这个子程序有问题没
发表于 2007-5-15 22:25 | 显示全部楼层
原帖由 iwannaher 于 2007-5-15 22:17 发表
这只是一个子程序,输入的参数放在主程序中的。我就想看看这个子程序有问题没



如果你用的是2006以上的matlab,可以用 cell mode 功能
 楼主| 发表于 2007-5-18 10:35 | 显示全部楼层
发现问题所在了:设置断点运行后发现u变量的大小为u:1x21435 double运行到dsource1就变成了1x21432。数组的大小不匹配。可是以前后8PSK调制的时候没遇到这个问题,改成4psk就不通了。如何修改dsource这个变量,请达人指教!
发表于 2007-5-18 10:49 | 显示全部楼层
原帖由 iwannaher 于 2007-5-18 10:35 发表
发现问题所在了:设置断点运行后发现u变量的大小为u:1x21435 double运行到dsource1就变成了1x21432。数组的大小不匹配。可是以前后8PSK调制的时候没遇到这个问题,改成4psk就不通了。如何修改dsource这个变量, ...



使用变量前最好先预分配空间,建议多看看 置顶贴:聚宝盆 中提到的精华贴:“写给学习 matlab 的新手们”
发表于 2007-6-1 17:21 | 显示全部楼层
把你的程序发到我的邮箱。8psk.qpsk都发
邮箱是michaeler@163.com

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

[ 本帖最后由 eight 于 2007-6-1 17:33 编辑 ]
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

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

GMT+8, 2024-11-25 22:39 , Processed in 0.065399 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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