pythonのSpyder環境でADALM-PLUTOを動かしてみます。で、うまくいったのでその記録、、、
サンプルソースを動かしてみたらそれらしく動きました 、、、なんで?、、、と思っていたら、、、なんとも簡単なことで。
ふと、サンプルコードの61,62行目の、*2**14ってなんなん?と、、、三角関数の結果に*2**14(すなわち*(2^14))してるってことはPlutoSDR.tx()の引数の範囲は+/-1*2^14ってことかぁ、、、 なんとも。
サンプルソースを動かしてみたらそれらしく動きました 、、、なんで?、、、と思っていたら、、、なんとも簡単なことで。
ふと、サンプルコードの61,62行目の、*2**14ってなんなん?と、、、三角関数の結果に*2**14(すなわち*(2^14))してるってことはPlutoSDR.tx()の引数の範囲は+/-1*2^14ってことかぁ、、、 なんとも。
- # -*- 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
- # import time
- # 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_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(7)[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)
- # 後で使う変数
- 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)
- n_samples_rx=xITX_t.size
- # ADALM-PLUTOの設定
- sdr = adi.Pluto()
- sdr.tx_lo=int(f_carrier)
- sdr.tx_rf_bandwidth=int(f_deviation*8)
- sdr.tx_hardwaregain_chan0=0
- # 繰り返し送信を有効にする
- sdr.tx_cyclic_buffer=1
- sdr.rx_lo=int(f_carrier)
- sdr.rx_rf_bandwidth=int(f_deviation*8)
- sdr.gain_control_mode_chan0='manual'
- sdr.rx_hardwaregain_chan0=6
- sdr.rx_buffer_size=n_samples_rx
- sdr.sample_rate=int(f_samp_simulation)
- #sdr.tx(np.ones(1))
- sdr.tx(xITX_t*16384)
- #time.sleep(1)
- # 受信
- xIRX_t = sdr.rx()
- print(sdr)
- sdr.tx_destroy_buffer()
- sdr.tx_cyclic_buffer=0
- # オブジェクト解放
- sdr=None
- # 復調
- xIRX_t0=xIRX_t[:-1:]
- xIRX_t1=xIRX_t[1::]
- symbols_rx=1*np.angle(xIRX_t1/xIRX_t0)
- symbols_rx=np.append(0,symbols_rx)
- # 規格化
- symbols_rx=symbols_rx/(f_sym/f_samp_simulation*pi*m)
- # プロット
- fig = plt.figure(figsize=(8.0, 12.0))
- plt.subplot(4,1,1)
- plt.plot(xITX_t.real)
- plt.plot(xITX_t.imag)
- plt.subplot(4,1,2)
- plt.plot(symbols)
- plt.subplot(4,1,3)
- plt.plot(xIRX_t.real)
- plt.plot(xIRX_t.imag)
- plt.subplot(4,1,4)
- plt.plot(symbols_rx)
- plt.ylim((-1,1))
これで、
で、
あけましておめでとうございます。
引き続き公私ともすっちゃんがっちゃんですよ。まちがいない。

コメントをお書きください