· 

ADALM-PLUTO(MATLABで動作確認)

MATLABで確認したいときもあるのでADALM-PLUTOをMATLABで使う。

ここに書いてあるので、そのままやる。 Spyder環境では何も言ってくれなかったけど、ADALM-PLUTO内のFirmwareが更新できるらしいので、言われるがままに更新します。

ちなみに、MassStorageクラスでファイルを転送してから更新が実行されるっぽいので、パソコンからMassStorageへのアクセスが制限されている会社の方はさっさとあきらめてください。「何で?何で?」と思う時間の無駄です。自宅でADALM-PLUTOを買おう!、、、更新せずとも使えるのでそれでもいいけど。

で、その後動作チェックもしてくれる、、、一度USB抜いてそのあと挿して「Test Connection」

まぁ、たぶんうまくいったのでしょう。

で、いきなりですが、

  1. clear all;
  2.         
  3. % よく使う変数
  4. deg2rad=pi/180.0;
  5. twopi=2*pi;
  6.   
  7. % 設定
  8. f_carrier=2400e6;                % 搬送波周波数 in Hz
  9. f_sym=1e6;                       % シンボルレート in Hz
  10. m=0.5;                           % 変調指数
  11. f_samp_simulation=f_sym*8;       % 計算のサンプリングレート in Hz
  12. thetaIB=0*deg2rad;               % 搬送波の初期位相(何でもいい) in rad
  13. f_deviation=(m*f_sym)/2;         % 周波数偏差 in Hz
  14. n_symbol_preamble=16;
  15.  
  16. % ガウスフィルタ設定
  17. n_sample_per_symbol=f_samp_simulation/f_sym;
  18. BT=0.5;
  19. n_symbol_in_filter=6;
  20. filter_length=n_symbol_in_filter*n_sample_per_symbol+1;
  21. h=gaussdesign(BT,n_symbol_in_filter,n_sample_per_symbol);
  22. symbols_gf_in_base=zeros(1, ceil(n_symbol_in_filter/2));
  23.  
  24. % シンボル列生成 
  25. symbols_in_base=max_len_seq(7)'; % シンボル
  26. %symbols_in_base(1:1:end)=0;
  27. %symbols_in_base(1:2:end)=1;
  28. %symbols_in_base(2:2:end)=0;
  29. symbols_preamble_in_base=zeros(1,n_symbol_preamble);
  30. symbols_preamble_in_base(1:2:end)=1;
  31. symbols_in_base=[symbols_preamble_in_base symbols_in_base];
  32.  
  33. % 後で使う変数
  34. t_sym=1/f_sym;
  35. t_samp_simulation=1/f_samp_simulation;
  36. omega_deviation=twopi*f_deviation;
  37.  
  38. % シンボルを計算用に拡張
  39. [symbols,t_end]=extend_symbol_to_simulation_sampling_rate(symbols_in_base,t_sym,t_samp_simulation);
  40. symbols=symbols*2-1; % -1 or +1 にする
  41. [symbols_gf,t_end_gf]=extend_symbol_to_simulation_sampling_rate(symbols_gf_in_base,t_sym,t_samp_simulation);
  42. symbols_gf=symbols_gf*2-1; % -1 or +1 にする
  43. % ガウスフィルタ適用
  44. symbols_gf=filter(h,1,[symbols symbols_gf]);
  45. symbols=symbols_gf(length(symbols_gf)-length(symbols)+1:1:end);
  46.  
  47. % 計算するタイミング
  48. t=(0:t_samp_simulation:t_end);
  49.  
  50. % 送信ポイント数が偶数になっていない場合は偶数にする
  51. if rem(length(t),2)==1
  52.     symbols=symbols(1:1:end-1);
  53.     t=t(1:1:end-1);
  54. end
  55.  
  56. % 全計算タイミングにおける瞬間的な角速度
  57. omega_in_moment=omega_deviation*symbols;
  58.  
  59. % 全計算タイミングにおける瞬間的な位相変化量
  60. phase_change_in_moment=omega_in_moment*t_samp_simulation;
  61.  
  62. % 全計算タイミングでの位相
  63. phiIB_t=cumsum(phase_change_in_moment)+thetaIB;
  64.  
  65. % 送信波形生成
  66. xITX_t=exp(1j*phiIB_t);
  67.  
  68. connectedRadios=findPlutoRadio;
  69. radioID=connectedRadios(1).RadioID;
  70.  
  71. sdr_tx=sdrtx('Pluto','RadioID',radioID);
  72. sdr_tx.CenterFrequency=f_carrier;
  73. sdr_tx.Gain=-10;
  74. sdr_tx.SamplesPerFrame=length(xITX_t);
  75. sdr_tx.BasebandSampleRate=f_samp_simulation;
  76. sdr_tx.ShowAdvancedProperties=true;
  77.  
  78. % 受信サンプル数はプリアンブルサーチのため2倍+フィルタ用とするかもしれない
  79. %n_samples_rx=length(xITX_t)*2+n_symbol_in_filter/2*n_sample_per_symbol;
  80. n_samples_rx=length(xITX_t);
  81. sdr_rx=sdrrx('Pluto','RadioID',radioID);
  82. sdr_rx.CenterFrequency=f_carrier;
  83. sdr_rx.GainSource='Manual';
  84. sdr_rx.Gain=30;
  85. sdr_rx.SamplesPerFrame=n_samples_rx;
  86. sdr_rx.BasebandSampleRate=f_samp_simulation;
  87. sdr_rx.OutputDataType='double';
  88. sdr_rx.ShowAdvancedProperties=true;
  89.  
  90. transmitRepeat(sdr_tx,xITX_t');
  91. xIRX_t=sdr_rx();
  92. release(sdr_tx);
  93.  
  94. sdr_rx_0=xIRX_t(1:end-1);
  95. sdr_rx_1=xIRX_t(2:end);
  96. symbols_rx=[0;angle(sdr_rx_1./sdr_rx_0)];
  97. symbols_rx=symbols_rx/(f_sym/f_samp_simulation*pi*m);
  98.  
  99. subplot(4,1,1);
  100. plot(t,[real(xITX_t') imag(xITX_t')]);
  101. subplot(4,1,2);
  102. plot(t,symbols);
  103. ylim([-1 1]);
  104.  
  105. subplot(4,1,3);
  106. plot(t,[real(xIRX_t) imag(xIRX_t)]);
  107. subplot(4,1,4);
  108. plot(t,symbols_rx);
  109. ylim([-1 1]);

extend_symbol_to_simulation_sampling_rate.m

  1. function [ex_symbols,end_time]=extend_symbol_to_simulation_sampling_rate(symbols,t_symbol,t_simulation_sampling)
  2.     % シンボル数
  3.     size_of_symbols=length(symbols);
  4.     % 最後のシンボルが終わる時間
  5.     end_time=size_of_symbols*t_symbol;
  6.     % 計算タイミング
  7.     t=0:t_simulation_sampling:end_time;
  8.     % 各シンボルの開始(終了)時間
  9.     t_periods_of_symbols=[0 (1:1:size_of_symbols)*t_symbol];
  10.     % 結果データ領域確保
  11.     ex_symbols=zeros(size(t));
  12.     % 先頭データは入れておく
  13.     ex_symbols(1)=symbols(1);
  14.     % 各シンボルについて、その期間のインデックスを取得し、データを入れ込む
  15.     for i=1:size_of_symbols
  16.         ex_symbols(t>t_periods_of_symbols(i))=symbols(i);
  17.     end
  18. end

 

max_len_seq.m

  1. function seq=max_len_seq(nbits)
  2.     taps = [ ...
  3.         "","x^2+x^1+1","x^3+x^2+1","x^4+x^3+1", ...
  4.         "x^5+x^3+1","x^6+x^5+1","x^7+x^6+1","x^8+x^7+x^6+x^1+1", ...
  5.         "x^9+x^5+1","x^10+x^7+1","x^11+x^9+1","x^12+x^11+x^10+x^4+1", ...
  6.         "x^13+x^12+x^11+x^8+1","x^14+x^13+x^12+x^2+1","x^15+x^14+1","x^16+x^15+x^13+x^4+1", ...
  7.         "x^17+x^14+1","x^18+x^11+1","x^19+x^18+x^17+x^14+1","x^20+x^17+1", ...
  8.         "x^21+x^19+1","x^22+x^21+1","x^23+x^18+1","x^24+x^23+x^22+x^17+1", ...
  9.         "x^25+x^22+1","x^26+x^25+x^24+x^20+1","x^27+x^26+x^25+x^22+1","x^28+x^25+1", ...
  10.         "x^29+x^27+1","x^30+x^29+x^28+x^7+1","x^31+x^28+1","x^32+x^31+x^30+x^10+1" ...
  11.     ];
  12.     Polynomial=taps{nbits};
  13.     InitialConditions=ones(1,nbits);
  14.     SamplesPerFrame=2^nbits-1;
  15.     pnSequence2 = comm.PNSequence('Polynomial',Polynomial,'InitialConditions',InitialConditions,'SamplesPerFrame',SamplesPerFrame);
  16.     seq = pnSequence2();
  17. end

 

で、なぜか符号がひっくり返ってますが、うまくいっているようです。

MATLABだとできるんだよねー

MATLABとPythonでプロパティが違うのも気になるし、、、