· 

ADALM-PLUTO(pythonで)(2)

pythonのSpyder環境でADALM-PLUTOを動かしてみます。で、うまくいったのでその記録、、、
サンプルソースを動かしてみたらそれらしく動きました 、、、なんで?、、、と思っていたら、、、なんとも簡単なことで。

ふと、サンプルコードの61,62行目の、*2**14ってなんなん?と、、、三角関数の結果に*2**14(すなわち*(2^14))してるってことはPlutoSDR.tx()の引数の範囲は+/-1*2^14ってことかぁ、、、 なんとも。
  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. # import time
  11.  
  12.  
  13. # https://jp.mathworks.com/help/signal/examples/fir-gaussian-pulse-shaping-filter-design.html
  14. def gaussdesign(bt,nsymbol_in_filter=3,nsample_per_symbol=2):
  15.     t_normalized=np.linspace(-nsymbol_in_filter/2,nsymbol_in_filter/2,nsymbol_in_filter*nsample_per_symbol+1)
  16.     a=np.sqrt(np.log(2)/2)/bt
  17.     expindex=-(np.pi*t_normalized/a)**2
  18.     h=np.sqrt(np.pi/a)*np.exp(expindex)
  19.     h=h/np.sum(h)
  20.     return h
  21.  
  22. # シンボル列を引き延ばす
  23. def extend_symbol_to_simulation_sampling_rate(symbols,t_symbol,t_simulation_sampling):
  24.     # シンボル数
  25.     size_of_symbols=symbols.size
  26.     # 最後のシンボルが終わる時間
  27.     end_time=size_of_symbols*t_symbol
  28.     # 計算タイミング
  29.     t=np.arange(0,end_time,t_simulation_sampling)
  30.     # 各シンボルの開始(終了)時間
  31.     t_periods_of_symbols=np.append(0,np.arange(1,size_of_symbols,1)*t_symbol)
  32.     # 結果データ領域確保
  33.     ex_symbols=np.zeros_like(t)
  34.     # 先頭データは入れておく
  35.     ex_symbols[0]=symbols[0]
  36.     # 各シンボルについて、その期間のインデックスを取得し、データを入れ込む
  37.     for i in range(0,size_of_symbols):
  38.         ex_symbols[np.where(t>t_periods_of_symbols[i])]=symbols[i]
  39.     return ex_symbols,end_time
  40.          
  41. # よく使う変数
  42. pi=np.pi
  43. deg2rad=pi/180.0
  44. twopi=2*pi
  45.  
  46. # 設定
  47. f_carrier=2400e6              # 搬送波周波数 in Hz
  48. f_sym=1e6                       # シンボルレート in Hz
  49. m=0.5                           # 変調指数
  50. f_samp_simulation=f_sym*8       # 計算のサンプリングレート in Hz
  51. thetaIB=0*deg2rad         # 搬送波の初期位相(何でもいい) in rad
  52. f_deviation=(m*f_sym)/2         # 周波数偏差 in Hz
  53. n_symbol_preamble=16
  54.  
  55. # ガウスフィルタ設定
  56. n_sample_per_symbol=f_samp_simulation/f_sym
  57. BT=0.5
  58. n_symbol_in_filter=float(6)
  59. filter_length=n_symbol_in_filter*n_sample_per_symbol+1
  60. h=gaussdesign(BT,int(n_symbol_in_filter),int(n_sample_per_symbol))
  61. symbols_gf_in_base=np.zeros(int(np.ceil(n_symbol_in_filter/2)))
  62.  
  63. # シンボル列生成 
  64. symbols_in_base=signal.max_len_seq(7)[0] # シンボル
  65. #symbols_in_base[0::1]=0
  66. #symbols_in_base[0::2]=1
  67. #symbols_in_base[1::2]=0
  68. symbols_preamble_in_base=np.zeros(n_symbol_preamble)
  69. symbols_preamble_in_base[0::2]=1
  70. symbols_in_base=np.append(symbols_preamble_in_base,symbols_in_base)
  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. # 計算するタイミング
  88. t=np.arange(0,t_end,t_samp_simulation)
  89.  
  90. # 全計算タイミングにおける瞬間的な角速度
  91. omega_in_moment=omega_deviation*symbols
  92.  
  93. # 全計算タイミングにおける瞬間的な位相変化量
  94. phase_change_in_moment=omega_in_moment*t_samp_simulation
  95.  
  96. # 全計算タイミングでの位相
  97. phiIB_t=np.cumsum(phase_change_in_moment)+thetaIB
  98.  
  99. # 送信波形生成
  100. xITX_t=np.exp(1j*phiIB_t)
  101. n_samples_rx=xITX_t.size
  102.  
  103. # ADALM-PLUTOの設定
  104. sdr = adi.Pluto()
  105. sdr.tx_lo=int(f_carrier)
  106. sdr.tx_rf_bandwidth=int(f_deviation*8)
  107. sdr.tx_hardwaregain_chan0=0
  108. # 繰り返し送信を有効にする
  109. sdr.tx_cyclic_buffer=1
  110.  
  111. sdr.rx_lo=int(f_carrier)
  112. sdr.rx_rf_bandwidth=int(f_deviation*8)
  113. sdr.gain_control_mode_chan0='manual'
  114. sdr.rx_hardwaregain_chan0=6
  115. sdr.rx_buffer_size=n_samples_rx
  116.  
  117. sdr.sample_rate=int(f_samp_simulation)
  118.  
  119. #sdr.tx(np.ones(1))
  120. sdr.tx(xITX_t*16384)
  121. #time.sleep(1)
  122. # 受信
  123. xIRX_t = sdr.rx()
  124. print(sdr)
  125.  
  126. sdr.tx_destroy_buffer()
  127. sdr.tx_cyclic_buffer=0
  128. # オブジェクト解放
  129. sdr=None
  130.  
  131. # 復調
  132. xIRX_t0=xIRX_t[:-1:]
  133. xIRX_t1=xIRX_t[1::]
  134. symbols_rx=1*np.angle(xIRX_t1/xIRX_t0)
  135. symbols_rx=np.append(0,symbols_rx)
  136.  
  137. # 規格化
  138. symbols_rx=symbols_rx/(f_sym/f_samp_simulation*pi*m)
  139.  
  140.  
  141. # プロット
  142. fig = plt.figure(figsize=(8.0, 12.0))
  143. plt.subplot(4,1,1)
  144. plt.plot(xITX_t.real)
  145. plt.plot(xITX_t.imag)
  146. plt.subplot(4,1,2)
  147. plt.plot(symbols)
  148. plt.subplot(4,1,3)
  149. plt.plot(xIRX_t.real)
  150. plt.plot(xIRX_t.imag)
  151. plt.subplot(4,1,4)
  152. plt.plot(symbols_rx)
  153. plt.ylim((-1,1))

これで、

で、

あけましておめでとうございます。

引き続き公私ともすっちゃんがっちゃんですよ。まちがいない。