pythonのSpyder環境でADALM-PLUTOを動かしてみます。が、思い通りにいっていないので、その記録。
CWはそれらしいのが出ていたので、任意の波形を出してみたい。
- # -*- coding: utf-8 -*-
- # 変数クリア
- from IPython import get_ipython
- get_ipython().magic('reset -sf')
- import matplotlib.pyplot as plt
- import numpy as np
- import scipy.signal as signal
- import adi
- # https://jp.mathworks.com/help/signal/examples/fir-gaussian-pulse-shaping-filter-design.html
- def gaussdesign(bt,nsymbol_in_filter=3,nsample_per_symbol=2):
- t_normalized=np.linspace(-nsymbol_in_filter/2,nsymbol_in_filter/2,nsymbol_in_filter*nsample_per_symbol+1)
- a=np.sqrt(np.log(2)/2)/bt
- expindex=-(np.pi*t_normalized/a)**2
- h=np.sqrt(np.pi/a)*np.exp(expindex)
- h=h/np.sum(h)
- return h
- # シンボル列を引き延ばす
- def extend_symbol_to_simulation_sampling_rate(symbols,t_symbol,t_simulation_sampling):
- # シンボル数
- size_of_symbols=symbols.size
- # 最後のシンボルが終わる時間
- end_time=size_of_symbols*t_symbol
- # 計算タイミング
- t=np.arange(0,end_time,t_simulation_sampling)
- # 各シンボルの開始(終了)時間
- t_periods_of_symbols=np.append(0,np.arange(1,size_of_symbols,1)*t_symbol)
- # 結果データ領域確保
- ex_symbols=np.zeros_like(t)
- # 先頭データは入れておく
- ex_symbols[0]=symbols[0]
- # 各シンボルについて、その期間のインデックスを取得し、データを入れ込む
- for i in range(0,size_of_symbols):
- ex_symbols[np.where(t>t_periods_of_symbols[i])]=symbols[i]
- return ex_symbols,end_time
- # よく使う変数
- pi=np.pi
- deg2rad=pi/180.0
- twopi=2*pi
- # 設定
- f_carrier=2400e6 # 搬送波周波数 in Hz
- f_sym=1e6 # シンボルレート in Hz
- m=0.5 # 変調指数
- f_samp_simulation=f_sym*8 # 計算のサンプリングレート in Hz
- thetaIB=0*deg2rad # 搬送波の初期位相(何でもいい) in rad
- f_deviation=(m*f_sym)/2 # 周波数偏差 in Hz
- n_symbol_constant_tone=24
- n_symbol_preamble=16
- # ガウスフィルタ設定
- n_sample_per_symbol=f_samp_simulation/f_sym
- BT=0.5
- n_symbol_in_filter=float(6)
- filter_length=n_symbol_in_filter*n_sample_per_symbol+1
- h=gaussdesign(BT,int(n_symbol_in_filter),int(n_sample_per_symbol))
- symbols_gf_in_base=np.zeros(int(np.ceil(n_symbol_in_filter/2)))
- # シンボル列生成
- symbols_in_base=signal.max_len_seq(5)[0] # シンボル
- symbols_in_base[0::1]=0
- #symbols_in_base[0::2]=1
- #symbols_in_base[1::2]=0
- symbols_preamble_in_base=np.zeros(n_symbol_preamble)
- symbols_preamble_in_base[0::2]=1
- symbols_in_base=np.append(symbols_preamble_in_base,symbols_in_base)
- symbols_in_base=np.append(symbols_in_base,np.zeros(n_symbol_constant_tone))
- # 後で使う変数
- t_sym=1/f_sym
- t_samp_simulation=1/f_samp_simulation
- omega_deviation=twopi*f_deviation
- # シンボルを計算用に拡張
- symbols,t_end=extend_symbol_to_simulation_sampling_rate(symbols_in_base,t_sym,t_samp_simulation)
- symbols=symbols*2-1 # -1 or +1 にする
- symbols_gf,t_end_gf=extend_symbol_to_simulation_sampling_rate(symbols_gf_in_base,t_sym,t_samp_simulation)
- symbols_gf=symbols_gf*2-1 # -1 or +1 にする
- # ガウスフィルタ適用
- symbols_gf=signal.lfilter(h,1,np.append(symbols,symbols_gf))
- symbols=symbols_gf[symbols_gf.size-symbols.size::1]
- # 計算するタイミング
- t=np.arange(0,t_end,t_samp_simulation)
- # 全計算タイミングにおける瞬間的な角速度
- omega_in_moment=omega_deviation*symbols
- # 全計算タイミングにおける瞬間的な位相変化量
- phase_change_in_moment=omega_in_moment*t_samp_simulation
- # 全計算タイミングでの位相
- phiIB_t=np.cumsum(phase_change_in_moment)+thetaIB
- # 送信波形生成
- xITX_t=np.exp(1j*phiIB_t)
- # ADALM-PLUTOの設定
- sdr = adi.Pluto()
- sdr.tx_lo=int(f_carrier)
- sdr.tx_rf_bandwidth=int(f_sym*2)
- sdr.tx_hardwaregain_chan0=-10
- # 繰り返し送信を有効にする
- sdr.tx_cyclic_buffer=1
- sdr.rx_lo=int(f_carrier)
- sdr.rx_rf_bandwidth=int(f_sym*2)
- sdr.rx_hardwaregain_chan0=60
- sdr.gain_control_mode_chan0='manual'
- sdr.sample_rate=int(f_samp_simulation)
- # 送信するデータ
- sdr.tx(xITX_t)
- # 受信
- data_rx = sdr.rx()
- sdr.tx_destroy_buffer()
- sdr.tx_cyclic_buffer=0
- # オブジェクト解放
- print(sdr)
- sdr=None
- # プロット
- fig = plt.figure(figsize=(8.0, 6.0))
- plt.subplot(2,1,1)
- plt.plot(xITX_t.real)
- plt.plot(xITX_t.imag)
- plt.subplot(2,1,2)
- plt.plot(data_rx.real)
- plt.plot(data_rx.imag)
これでどうだ!
ぜんぜんだめーorz
コメントをお書きください