qammodについての質問です。

2 views (last 30 days)
友將
友將 on 25 Aug 2022
Commented: 友將 on 25 Aug 2022
古い教材のMATLABプログラムで qammod関数でエラーが発生しています。
エラー: qammod>validatePVpair (行 187) 'SymbolOrder' は認識されたパラメーターではありません。 名前と値の有効なペア引数のリス トは、この関数のドキュメンテーションを参照してください。
エラー: qammod>validateInputArgs (行 132) validatePVpair(varargin{1:end});
エラー: qammod (行 93) plotConstellation, outputDataType] = validateInputArgs(M, varargin{:});
エラー: CFO_estimation (行 7) h=qammod('M',M,'SymbolOrder','gray');
というエラーです。
どこを改善すればよろしいでしょうか 下記がそのプログラムです。
%CFO_estimation.m
%Time-domain CP based method and Frequency-domain(Moose/Classen)method
clear,clf
CFO=0.15;
Nfft=128;
Nbps=2;M=2^Nbps;
h=qammod('M',M,symOrder,'gray');
Es=1; A=sqrt(3/2/(M-1)*Es);
N=Nfft;Ng=Nfft/4;Nofdm=Nfft+Ng;Nsym=3;
x=[];
for m=1:Nsym
msgint=randin(1,N,M);
if i<=2, Xp=add_pilot(zeros(1,Nfft),Nfft,4); Xf=Xp;
else Xf = A*modulate(h,msgint);
end
xt=ifft(Xf,Nfft);
x_sym=add_CP(xt,Ng);
x=[x x_sym];
end
y=x;
sig_pow=y*y'/length(y);
SNRdBs=0:3:30; MaxIter=100;
for i=1:length(SNRdBs)
SNRdB=SNRdBs(i);
MSE_CFO_CP=0; MSE_CFO_Moose=0; MSE_CFO_Classen=0;
rand('seed',1); randn('seed',1);
y_CFO=add_CFO(y,CFO,Nfft);
for iter=1:MaxIter
y_aw=awgn(y_CFO,SNRdB,'measured');
CFO_est_CP=CFO_CP(y_aw,Nfft,Ng);
MSE_CFO_CP=MSE_CFO_CP+(CFO_est_CP-CFO)^2;
CFO_est_Moose=CFO_Moose(y_aw,Nfft);
MSE_CFO_Moose=MSE_CFO_Moose+(CFO_est_Moose-CFO)^2;
CFO_est_Classen=CFO_Classen(y_aw,Nfft,Ng,Xp);
MSE_CFO_Classen=MSE_CFO_Classen+(CFO_est_Classen-CFO)^2;
end
MSE_CP(i)=MSE_CFO_CP/MaxIter; MSE_Moose(i)=MSE_CFO_Moose/MaxIter;
MSE_Classen(i)=MSE_CFO_Classen/MaxIter;
end
semilogy(SNRdBs,MSE_CP,'-+'), grid on, hold on
semilogy(SNRdBs,MSE_Moose,'-x'),semilogy(SNRdBs,MSE_Classen,'-*')
xlabel('SNR[dB]'),ylabel('MSE');title('CFO Estimation');
legend('CP-based technique','Moose',Classen)

Accepted Answer

Atsushi Ueno
Atsushi Ueno on 25 Aug 2022
修正すべき点が2点あります。引数の書き方が何種類かあって混乱しますね。
【誤】h = qammod(x, M, symOrder ,'gray'); % 'gray'は3番目の引数symOrderの位置に書く必要がある
【誤】h = qammod(x, M,'symOrder','gray'); % symOrderは名前と値の引数ではなく、この書き方も誤り
【正】h = qammod(x, M,'gray'); % symOrderは引数であり、この位置に'gray'と入力する必要がある
【誤】h = qammod('M', M); % 1番目の引数xに文字配列'M'を入力出来ない(77にはならない) 
【誤】h = qammod( x , M); % 1番目の引数xに入力できるのは、スカラー | ベクトル | 行列 | 3次元配列
【正】y = qammod(d,M,'bin','PlotConstellation', true); % 名前と値の引数と併記する場合はこの書き方になる
【正】y = qammod(d,M,'bin', PlotConstellation = true); % 新しい記述方法だと名前と値の引数はこの書き方になる
  3 Comments
Atsushi Ueno
Atsushi Ueno on 25 Aug 2022
Edited: Atsushi Ueno on 25 Aug 2022
中身は良く分かりませんが、質問の本質は「古いCommucation Toolboxに存在したmodem.qammod関数の引数構成を知る」事ですね。modemオブジェクト(クラス)はCommucation Toolbox 4.0辺りで導入されたものらしく、今はmodem.qammodが削除されています。古いドキュメントを探してもR2017aまでしか検索できず、古いバージョン(R2007a/b辺り)のMATLABをインストールしないとそれを読む事は出来ないと思います。
modem.qammod()
'modem.qammod' has been removed. With appropriate code changes, use 'qammod' instead.

Caused by:
Unable to resolve the name 'modem.qammod'.
% 元のプログラム(CFO_estimation.m)より抜粋
mod_object = modem.qammod('M',M, 'SymbolOrder','gray'); % 新しいVerのMATLABでは動かせない
Xf = A*modulate(mod_object,msgint);
想定ですが、M — 変調次数symOrder — シンボルの順序名前と値の引数として与える構成なのだと思います。また現在のqammod関数と異なり、modem.qammod関数は、modulate関数により変調結果を出力する為のパラメータ(QAM変調する為のパラメータ)を持つオブジェクトを出力する様なので、modulate関数と組み合わせる必要があったのだと思います。従って現在のqammod関数で書けば下記の様になると想定します。
Xf = qammod(msgint, M, 'gray');
modem.qammod関数のドキュメントが読める様になったら追記します。
友將
友將 on 25 Aug 2022
ありがとうございます。 よろしくお願いします。

Sign in to comment.

More Answers (0)

Tags

Products


Release

R2021a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!