林峰Java学习 2023-03-13 22:24 采纳率: 0%
浏览 95

matlab 索引超出数组元素的数目


clc;
close;
clear;

ps=1*10^6;   %码速率为1MHz
a=0.8;       %成形滤波器系数
Fs=8*10^6;   %采样速率
fc=2*10^6;   %载波频率
N=10000;      %仿真数据的长度

t=0:1/Fs:(N*Fs/ps-1)/Fs;%产生长度为N,频率为fs的时间序列
rng ('default');%每次都产生相同的随机数
%s = randi([0 1],16,1); % 产生01之间的整数,输出一个n*1的向量
s=randi(1,16);       %产生随机16进制数据作为原始数据
Bs=dec2bin(s,4);         %将十进制数据转换成4比特的二进制数据

%对Bs的高2比特进行差分编码
%取高2比特分别存放在A,B变量中
A=s>7;
B=(s-A*8)>3;
%差分编码后的数据存放在C,D中
C=zeros(N,1);D=zeros(N,1);
for i=2:N
    C(i)=mod(((~mod(A(i)+B(i),2))&mod(A(i)+C(i-1),2)) + (mod(A(i)+B(i),2)&mod(A(i)+D(i-1),2)),2);
    D(i)=mod(((~mod(A(i)+B(i),2))&mod(B(i)+D(i-1),2)) + (mod(A(i)+B(i),2)&mod(B(i)+C(i-1),2)),2);
end
%差分编码后的高2比特数据与原数据低2比特合成映射前的数据DBs
DBs=C*8+D*4+s-A*8-B*4;


%完成调制前的正交同相支路数据映射
I=zeros(1,N);Q=zeros(1,N);
for i=1:N
    switch DBs(i)
        case 0, I(i)=3; Q(i)=3;
        case 1, I(i)=1; Q(i)=3;
        case 2, I(i)=3; Q(i)=1;
        case 3, I(i)=1; Q(i)=1;
        case 4, I(i)=-3;Q(i)=3;
        case 5, I(i)=-3;Q(i)=1;
        case 6, I(i)=-1;Q(i)=3;
        case 7, I(i)=-1;Q(i)=1;
        case 8, I(i)=3; Q(i)=-3;
        case 9, I(i)=3; Q(i)=-1;
        case 10,I(i)=1; Q(i)=-3;
        case 11,I(i)=1; Q(i)=-1;
        case 12,I(i)=-3;Q(i)=-3;
        case 13,I(i)=-1;Q(i)=-3;
        case 14,I(i)=-3;Q(i)=-1;
        otherwise,I(i)=-1;Q(i)=-1;
    end
end

%对编码数据以Fs频率采样
Ads_i=upsample(I,Fs/ps);
Ads_q=upsample(Q,Fs/ps);

%加噪声
% SNR=30;
% Ads_i=awgn(Ads_i,SNR);
% Ads_q=awgn(Ads_q,SNR);
 
%设计平方根升余弦滤波器
n_T=[-2 2];
rate=Fs/ps;
T=1;
Shape_b = rcosdesign(a,n_T,rate,T,'sqrt');
%对采样后的数据进行升余弦滤波;
rcos_Ads_i=filter(Shape_b,1,Ads_i);
rcos_Ads_q=filter(Shape_b,1,Ads_q);

%产生同相正交两路载频信号
f0_i=cos(2*pi*fc*t); 
f0_q=sin(2*pi*fc*t);       
 
%产生16QAM已调信号
qam16=rcos_Ads_i.*f0_i+rcos_Ads_q.*f0_q;       


%实现相干解调
demod_mult_i=qam16.*f0_i;
demod_mult_q=qam16.*f0_q;
%对乘法运算后的同相正交支路滤波
demod=filter(Shape_b,1,demod_mult_i+sqrt(-1)*demod_mult_q);
%绘制相干解调后的星座图
scatterplot(demod,Fs/ps,6*rate,'bx');


%仿真频率差500Hz时解调后星座图
f0_di=cos(2*pi*(fc+500)*t); 
f0_dq=sin(2*pi*(fc+500)*t);  
%实现解调
demod_mult_i=qam16.*f0_di;
demod_mult_q=qam16.*f0_dq;
%对乘法运算后的同相正交支路滤波
demod=filter(Shape_b,1,demod_mult_i+sqrt(-1)*demod_mult_q);
%绘制解调后的星座图
scatterplot(demod,Fs/ps,6*rate,'bx');

%仿真相位差 pi/6时解调后星座图
f0_di=cos(2*pi*fc*t+pi/6); 
f0_dq=sin(2*pi*fc*t+pi/6);  
%实现解调
demod_mult_i=qam16.*f0_di;
demod_mult_q=qam16.*f0_dq;
%对乘法运算后的同相正交支路滤波
demod=filter(Shape_b,1,demod_mult_i+sqrt(-1)*demod_mult_q);
%绘制解调后的星座图
scatterplot(demod,Fs/ps,6*rate,'bx');




%绘制16QAM信号频谱、信号时域波形
m_qam16=20*log10(abs(fft(qam16,1024)));m_qam16=m_qam16-max(m_qam16);
%设置幅频响应的横坐标单位为MHz
x_f=[0:(Fs/length(m_qam16)):Fs/2];x_f=x_f/10^6;
%只显示正频率部分的幅频响应
mqam16=m_qam16(1:length(x_f));
%设置时域波表的横坐标单位为us
Len=100;%设置时域波形显示的点数
x_t=1:Len;%产生长度为Len的时间序列
x_t=x_t/Fs*10^6;
%显示所需的频谱及时域波形
subplot(211); plot(x_f,mqam16);       
legend('16QAM信号频谱');
xlabel('频率(MHz)');ylabel('幅度(dB)');grid on;
subplot(212);plot(x_t,qam16(101:Len+100));
legend('16QAM时域信号波形');
xlabel('时间(us)');ylabel('幅度(V)');grid on;


索引超出数组元素的数目(8)。

求指点

  • 写回答

2条回答 默认 最新

  • threenewbee 2023-03-13 23:47
    关注

    看下是索引太大了呢,还是你的数组的元素太少了造成的。

    评论

报告相同问题?

问题事件

  • 创建了问题 3月13日

悬赏问题

  • ¥15 sqlserver执行存储过程报错
  • ¥100 nuxt、uniapp、ruoyi-vue 相关发布问题
  • ¥15 浮窗和全屏应用同时存在,全屏应用输入法无法弹出
  • ¥100 matlab2009 32位一直初始化
  • ¥15 Expected type 'str | PathLike[str]…… bytes' instead
  • ¥15 为什么在iis上部署网站,服务器可以访问,但是本地电脑访问不了
  • ¥15 三极管电路求解,已知电阻电压和三级关放大倍数
  • ¥15 ADS时域 连续相位观察方法
  • ¥15 Opencv配置出错
  • ¥15 关于模型导入UNITY的.FBX: Check external application preferences.警告。