· 

ADALM-PLUTO(pythonで)(1)

pythonのSpyder環境でADALM-PLUTOを動かしてみます。が、思い通りにいっていないので、その記録。

CWはそれらしいのが出ていたので、任意の波形を出してみたい。

  1. # -*- coding: utf-8 -*-
  2. # 変数クリア
  3. from IPython import get_ipython
  4. get_ipython().magic('reset -sf')
  5.  
  6. import matplotlib.pyplot as plt
  7. import numpy as np
  8. import scipy.signal as signal
  9. import adi
  10.  
  11. # https://jp.mathworks.com/help/signal/examples/fir-gaussian-pulse-shaping-filter-design.html
  12. def gaussdesign(bt,nsymbol_in_filter=3,nsample_per_symbol=2):
  13.     t_normalized=np.linspace(-nsymbol_in_filter/2,nsymbol_in_filter/2,nsymbol_in_filter*nsample_per_symbol+1)
  14.     a=np.sqrt(np.log(2)/2)/bt
  15.     expindex=-(np.pi*t_normalized/a)**2
  16.     h=np.sqrt(np.pi/a)*np.exp(expindex)
  17.     h=h/np.sum(h)
  18.     return h
  19.  
  20. # シンボル列を引き延ばす
  21. def extend_symbol_to_simulation_sampling_rate(symbols,t_symbol,t_simulation_sampling):
  22.     # シンボル数
  23.     size_of_symbols=symbols.size
  24.     # 最後のシンボルが終わる時間
  25.     end_time=size_of_symbols*t_symbol
  26.     # 計算タイミング
  27.     t=np.arange(0,end_time,t_simulation_sampling)
  28.     # 各シンボルの開始(終了)時間
  29.     t_periods_of_symbols=np.append(0,np.arange(1,size_of_symbols,1)*t_symbol)
  30.     # 結果データ領域確保
  31.     ex_symbols=np.zeros_like(t)
  32.     # 先頭データは入れておく
  33.     ex_symbols[0]=symbols[0]
  34.     # 各シンボルについて、その期間のインデックスを取得し、データを入れ込む
  35.     for i in range(0,size_of_symbols):
  36.         ex_symbols[np.where(t>t_periods_of_symbols[i])]=symbols[i]
  37.     return ex_symbols,end_time
  38.          
  39. # よく使う変数
  40. pi=np.pi
  41. deg2rad=pi/180.0
  42. twopi=2*pi
  43.  
  44. # 設定
  45. f_carrier=2400e6              # 搬送波周波数 in Hz
  46. f_sym=1e6                       # シンボルレート in Hz
  47. m=0.5                           # 変調指数
  48. f_samp_simulation=f_sym*8       # 計算のサンプリングレート in Hz
  49. thetaIB=0*deg2rad         # 搬送波の初期位相(何でもいい) in rad
  50. f_deviation=(m*f_sym)/2         # 周波数偏差 in Hz
  51. n_symbol_constant_tone=24
  52. n_symbol_preamble=16
  53.  
  54. # ガウスフィルタ設定
  55. n_sample_per_symbol=f_samp_simulation/f_sym
  56. BT=0.5
  57. n_symbol_in_filter=float(6)
  58. filter_length=n_symbol_in_filter*n_sample_per_symbol+1
  59. h=gaussdesign(BT,int(n_symbol_in_filter),int(n_sample_per_symbol))
  60. symbols_gf_in_base=np.zeros(int(np.ceil(n_symbol_in_filter/2)))
  61.  
  62. # シンボル列生成 
  63. symbols_in_base=signal.max_len_seq(5)[0] # シンボル
  64. symbols_in_base[0::1]=0
  65. #symbols_in_base[0::2]=1
  66. #symbols_in_base[1::2]=0
  67. symbols_preamble_in_base=np.zeros(n_symbol_preamble)
  68. symbols_preamble_in_base[0::2]=1
  69. symbols_in_base=np.append(symbols_preamble_in_base,symbols_in_base)
  70. symbols_in_base=np.append(symbols_in_base,np.zeros(n_symbol_constant_tone))
  71.  
  72. # 後で使う変数
  73. t_sym=1/f_sym
  74. t_samp_simulation=1/f_samp_simulation
  75. omega_deviation=twopi*f_deviation
  76.  
  77. # シンボルを計算用に拡張
  78. symbols,t_end=extend_symbol_to_simulation_sampling_rate(symbols_in_base,t_sym,t_samp_simulation)
  79. symbols=symbols*2-1 # -1 or +1 にする
  80. symbols_gf,t_end_gf=extend_symbol_to_simulation_sampling_rate(symbols_gf_in_base,t_sym,t_samp_simulation)
  81. symbols_gf=symbols_gf*2-1 # -1 or +1 にする
  82. # ガウスフィルタ適用
  83. symbols_gf=signal.lfilter(h,1,np.append(symbols,symbols_gf))
  84. symbols=symbols_gf[symbols_gf.size-symbols.size::1]
  85.  
  86. # 計算するタイミング
  87. t=np.arange(0,t_end,t_samp_simulation)
  88.  
  89. # 全計算タイミングにおける瞬間的な角速度
  90. omega_in_moment=omega_deviation*symbols
  91.   
  92. # 全計算タイミングにおける瞬間的な位相変化量
  93. phase_change_in_moment=omega_in_moment*t_samp_simulation
  94.   
  95. # 全計算タイミングでの位相
  96. phiIB_t=np.cumsum(phase_change_in_moment)+thetaIB
  97.   
  98. # 送信波形生成
  99. xITX_t=np.exp(1j*phiIB_t)
  100.  
  101. # ADALM-PLUTOの設定
  102. sdr = adi.Pluto()
  103. sdr.tx_lo=int(f_carrier)
  104. sdr.tx_rf_bandwidth=int(f_sym*2)
  105. sdr.tx_hardwaregain_chan0=-10
  106. # 繰り返し送信を有効にする
  107. sdr.tx_cyclic_buffer=1
  108.  
  109. sdr.rx_lo=int(f_carrier)
  110. sdr.rx_rf_bandwidth=int(f_sym*2)
  111. sdr.rx_hardwaregain_chan0=60
  112. sdr.gain_control_mode_chan0='manual'
  113.  
  114. sdr.sample_rate=int(f_samp_simulation)
  115.  
  116. # 送信するデータ
  117. sdr.tx(xITX_t)
  118.  
  119. # 受信
  120. data_rx = sdr.rx()
  121.  
  122. sdr.tx_destroy_buffer()
  123. sdr.tx_cyclic_buffer=0
  124. # オブジェクト解放
  125. print(sdr)
  126. sdr=None
  127.  
  128. # プロット
  129. fig = plt.figure(figsize=(8.0, 6.0))
  130. plt.subplot(2,1,1)
  131. plt.plot(xITX_t.real)
  132. plt.plot(xITX_t.imag)
  133. plt.subplot(2,1,2)
  134. plt.plot(data_rx.real)
  135. plt.plot(data_rx.imag)

 

これでどうだ!

ぜんぜんだめーorz