本帖最后由 814685372 于 2020-6-8 14:06 编辑
请问这个代码我出错辽 有没有大佬看看怎么改
clear all;
clc;
%%参数设置
snr_mini = 5; %信噪比最小值
snr_max = 20; %信噪比最大值
TxSampleRate = 32e9; %信号的码元速率
TxLinewidth = 0; %发射信号的载波线宽
TxCarrierRate = 0; %发射信号的载波频率
DataSymbolNumber = 10000; %数据点的个数
ClassifySetNumber = 100; %独立仿真的次数
printJ = 5; %需要输出观察的调制方式,0为不输出
printXingZuo = 1; %是否需要打印星座图,0为不打印
% signal generation;如果想要进行100组独立的测试,可以建立100次循环,产生100组独立的数据
for j = 1:6 % bit per symbol: 1. PSK; 2. QPSK; 3.8QAM; 4. 16QAM; 5. 32QAM; 6.64QAM...
System.BitPerSymbol = j;
snr = snr_mini:snr_max; %SNR信噪比的设置,单位dB
classify_correct_ratio = zeros(length(snr), 1);
for snrIndex= 1:length(snr)
if(j==printJ) fprintf('\n--------------- snr = %d ------------\n',snr(snrIndex)); end
classify_correct = 0;
for i = 1:ClassifySetNumber
Tx.SampleRate = TxSampleRate; %symbol Rate,信号的码元速率,可以自行定义
Tx.Linewidth = TxLinewidth;%发射信号的载波的线宽,一般与信号的相位噪声有关
Tx.Carrier = DataSymbolNumber;%发射信号的载波频率
M = 2^System.BitPerSymbol;
%%信号生成
Tx.DataSymbol = randi([0 M-1],1,DataSymbolNumber);%每一次随机产生的数据量
%数据的不同调制方式产生:这里把2^3(8QAM)的形式单独拿出来设置,是为了实现最优的星型8QAM星座图
if M ~= 8;
h = modem.qammod('M', M, 'SymbolOrder', 'Gray');
Tx.DataConstel = modulate(h,Tx.DataSymbol);
else
tmp = Tx.DataSymbol;
tmp2 = zeros(1,length(Tx.DataSymbol));
for kk = 1:length(Tx.DataSymbol)
switch tmp(kk)
case 0
tmp2(kk) = 1 + 1i;
case 1
tmp2(kk) = -1 + 1i;
case 2
tmp2(kk) = -1 - 1i;
case 3
tmp2(kk) = 1 - 1i;
case 4
tmp2(kk) = 1+sqrt(3);
case 5
tmp2(kk) = 0 + 1i .* (1+sqrt(3));
case 6
tmp2(kk) = 0 - 1i .* (1+sqrt(3));
case 7
tmp2(kk) = -1-sqrt(3);
end
end
Tx.DataConstel = tmp2;
clear tmp tmp2;
end
Tx.Signal = Tx.DataConstel;
%数据的载波加载,考虑到相位噪声等
N = length(Tx.Signal);
dt = 1/Tx.SampleRate;
t = dt*(0:N-1);
Phase1 = [0, cumsum(normrnd(0,sqrt(2*pi*Tx.Linewidth/(Tx.SampleRate)), 1, N-1))];
carrier1 = exp(1i*(2*pi*t*Tx.Carrier + Phase1));
Tx.Signal = Tx.Signal.*carrier1;
Rx.Signal = awgn(Tx.Signal,snr(snrIndex),'measured');%数据在AWGN信道下的接收
%%信号识别
CMAOUT = Rx.Signal;
%去除直流成分
CMAOUT = CMAOUT - mean(CMAOUT);
%normalization接收信号功率归一化
CMAOUT=CMAOUT/sqrt(mean(abs(CMAOUT).^2));
s = CMAOUT;
signalpow = mean(abs(s).^2);%信号功率
noisepow = signalpow/(10^(snr(snrIndex)/10));%噪声功率
C20_hat = mean(s.^2);
C21_hat = mean(abs(s).^2);
C21_hat = C21_hat-noisepow;%计算信号二阶累积量C21时,由于C21为信号模的平方
%而我们接收的s是在AWGN信道下接收的,所以求C21时还应考虑噪声功率。
C40_hat = mean(s.^4)-3*C20_hat^2;
%C41_hat = mean((s.^3).*conj(s))-3*C20_hat*C21_hat;
C42_hat = mean(abs(s).^4)-abs(C20_hat)^2-2*C21_hat^2;
C40_normal = C40_hat/C21_hat.^2;
%C42_normal = C42_hat/C21_hat.^2;
AbsC40 = abs(C40_normal);
if(j==printJ) fprintf('%g ',AbsC40); end
if(AbsC40>=1.5)%PSK
classify = 1;
elseif(AbsC40>=0.9&&AbsC40<1.1)%QPSK
classify = 2;
elseif(AbsC40>=1.1&&AbsC40<1.3)%8QAM
classify = 3;
elseif(AbsC40>=0.67&&AbsC40<0.9)%16QAM
classify = 4;
elseif(AbsC40<0.35)%32QAM
classify = 5;
elseif(AbsC40>=0.35&&AbsC40<0.63)%64QAM
classify = 6;
end
if(classify == System.BitPerSymbol)
classify_correct = classify_correct + 1;
end
%subplot(1,7,snrIndex);%绘制原始噪声
%plot(Rx.Signal,'.');
%plot(CMAOUT,'.');
end
classify_correct_ratio(snrIndex) = classify_correct/ClassifySetNumber*100;
end
%%绘制图形
figure(1);subplot(2, 3, j);
plot(snr, classify_correct_ratio, '-b.');
axis([snr_mini snr_max 0 110]);
ylabel('识别正确率/%');
xlabel('信噪比/dB');
if(j == 1)
title('PSK调制方式识别');
elseif(j == 2)
title('QPSK调制方式识别');
elseif(j == 3)
title('8QAM调制方式识别');
elseif(j == 4)
title('16QAM调制方式识别');
elseif(j == 5)
title('32QAM调制方式识别');
else
title('64QAM调制方式识别');
end
if(printXingZuo==1)
figure(2);subplot(2, 3, j);
plot(real(CMAOUT),imag(CMAOUT),'.');
if(j == 1)
title('PSK调制方式星座图');
elseif(j == 2)
title('QPSK调制方式星座图');
elseif(j == 3)
title('8QAM调制方式星座图');
elseif(j == 4)
title('16QAM调制方式星座图');
elseif(j == 5)
title('32QAM调制方式星座图');
else
title('64QAM调制方式星座图');
end
end
end
错误使用 modem.qammod (line 82)
MODEM.QAMMOD has been removed. Use QAMMOD instead.
出错 Untitled (line 36)
h = modem.qammod('M', M, 'SymbolOrder', 'Gray');