波形生成
fsk_study_gen_ver2.py
- # 変数クリア
- from IPython import get_ipython
- get_ipython().magic('reset -sf')
- import matplotlib.pyplot as plt
- import numpy as np
- import scipy.signal as signal
- # シンボル列を引き延ばす
- 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=433.92e6 # 搬送波周波数 in Hz
- f_sym=1e6 # シンボルレート in Hz
- m=0.5 # 変調指数
- f_samp_simulation=f_carrier*10 # 計算のサンプリングレート in Hz
- phase_initial=0*deg2rad # 搬送波の初期位相(何でもいい) in rad
- f_deviation=(m*f_sym)/2 # 周波数偏差 in Hz
- symbols_in_base=signal.max_len_seq(5)[0] # シンボル
- #symbols_in_base[0::2]=1
- #symbols_in_base[1::2]=0
- # 後で使う変数
- t_sym=1/f_sym
- t_samp_simulation=1/f_samp_simulation
- omega_carrier=twopi*f_carrier
- 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 にする
- # 計算するタイミング
- t=np.arange(0,t_end,t_samp_simulation)
- # 全計算タイミングにおける瞬間的な角速度
- omega_in_moment=omega_carrier+omega_deviation*symbols
- # 全計算タイミングにおける瞬間的な位相変化量
- phase_change_in_moment=omega_in_moment*t_samp_simulation
- # 全計算タイミングでの位相
- phase_t=np.cumsum(phase_change_in_moment)+phase_initial
- # 波形生成
- amp_t=np.exp(1j*phase_t)
- np.save('output/fsk_o_t',t)
- np.save('output/fsk_o_amp_t',amp_t)
- np.save('output/fsk_o_f_sym',f_sym)
- np.save('output/fsk_o_f_carrier',f_carrier)
- # プロット
- fig=plt.figure()
- fig.add_subplot(2,1,1)
- plt.plot(t,symbols)
- fig.add_subplot(2,1,2)
- plt.plot(t,amp_t)
普通に正弦波の局発でやってみる
fsk_study_qdemod_ver2.py
- # 変数クリア
- from IPython import get_ipython
- get_ipython().magic('reset -sf')
- import matplotlib.pyplot as plt
- import numpy as np
- from scipy import signal
- # 波形を読み込む
- f_carrier=np.load("output/fsk_o_f_carrier.npy")
- f_sym=np.load("output/fsk_o_f_sym.npy")
- t=np.load('output/fsk_o_t.npy')
- amp_complex_t=np.load('output/fsk_o_amp_t.npy')
- t_sym=1/f_sym
- amp_t=amp_complex_t.real
- td0=t[:-1:]
- td1=t[1::]
- t_samp_simulation=np.average(td1-td0)
- f_samp_simulation=1/t_samp_simulation
- # よく使う変数
- pi=np.pi
- deg2rad=pi/180.0
- twopi=2*pi
- # 設定
- f_Lo=f_carrier # 搬送波周波数 in Hz
- phase_Lo=0*deg2rad # 搬送波の初期位相(何でもいい) in rad
- m=0.5 # 波形生成時の変調指数
- f_deviation=(m*f_sym)/2
- # 後で使う変数
- t_samp_simulation=1/f_samp_simulation
- omega_Lo=twopi*f_Lo
- # 局発信号の生成
- amp_LoI_t=np.cos(omega_Lo*t+phase_Lo)
- amp_LoQ_t=np.sin(omega_Lo*t+phase_Lo)
- # ミキサー
- amp_I_t_before_LPF=amp_t*amp_LoI_t
- amp_Q_t_before_LPF=amp_t*amp_LoQ_t
- # フィルター係数生成
- freq_cutoff=f_sym*2
- w_cutoff=freq_cutoff/(f_samp_simulation/2)
- b,a=signal.butter(1,w_cutoff,'lowpass')
- # フィルター適用
- amp_I_t=signal.lfilter(b,a,amp_I_t_before_LPF)
- amp_Q_t=signal.lfilter(b,a,amp_Q_t_before_LPF)
- amp_demod_t=amp_I_t+1j*amp_Q_t
- # ダウンサンプリング
- f_sampling_target=f_sym*10
- downsampling_rate=int(f_samp_simulation/f_sampling_target)
- t_downsample=t[::downsampling_rate]
- amp_demod_t_downsample=amp_demod_t[::downsampling_rate]
- f_samp_simulation_downsample=f_samp_simulation/downsampling_rate
- t_samp_simulation_downsample=1/f_samp_simulation_downsample
- # 復調
- amp_demod_t0_downsample=amp_demod_t_downsample[:-1:]
- amp_demod_t1_downsample=amp_demod_t_downsample[1::]
- phase_shift_t_downsample=-1*np.angle(amp_demod_t1_downsample/amp_demod_t0_downsample)
- phase_shift_t_downsample=np.append(0,phase_shift_t_downsample)
- # 規格化
- phase_shift_t_downsample=phase_shift_t_downsample/(f_sym/f_samp_simulation_downsample*pi*m)
- # プロット
- fig=plt.figure()
- fig.add_subplot(2,1,1)
- plt.plot(t_downsample,amp_demod_t_downsample.real)
- plt.plot(t_downsample,amp_demod_t_downsample.imag)
- fig.add_subplot(2,1,2)
- plt.plot(t_downsample,phase_shift_t_downsample)
- plt.ylim(-2,2)
- fig=plt.figure()
- ax=fig.add_subplot(1,1,1)
- plt.scatter(amp_demod_t_downsample.real,amp_demod_t_downsample.imag)
- plt.xlim(-0.5,0.5)
- plt.ylim(-0.5,0.5)
- ax.set_aspect('equal', adjustable='box')
矩形波でやってみる。
fsk_study_qdemod_lo_sqwave_ver2.py
- # 変数クリア
- from IPython import get_ipython
- get_ipython().magic('reset -sf')
- import matplotlib.pyplot as plt
- import numpy as np
- from scipy import signal
- # 波形を読み込む
- f_carrier=np.load("output/fsk_o_f_carrier.npy")
- f_sym=np.load("output/fsk_o_f_sym.npy")
- t=np.load('output/fsk_o_t.npy')
- amp_complex_t=np.load('output/fsk_o_amp_t.npy')
- t_sym=1/f_sym
- amp_t=amp_complex_t.real
- td0=t[:-1:]
- td1=t[1::]
- t_samp_simulation=np.average(td1-td0)
- f_samp_simulation=1/t_samp_simulation
- # よく使う変数
- pi=np.pi
- deg2rad=pi/180.0
- twopi=2*pi
- # 設定
- f_Lo=f_carrier # 搬送波周波数 in Hz
- phase_Lo=0*deg2rad # 搬送波の初期位相(何でもいい) in rad
- m=0.5 # 波形生成時の変調指数
- f_deviation=(m*f_sym)/2
- # 後で使う変数
- t_samp_simulation=1/f_samp_simulation
- omega_Lo=twopi*f_Lo
- # 局発信号の生成
- amp_LoI_t=np.cos(omega_Lo*t+phase_Lo)
- amp_LoQ_t=np.sin(omega_Lo*t+phase_Lo)
- amp_LoI_t[amp_LoI_t<0]=-1/4*pi
- amp_LoI_t[amp_LoI_t>=0]=1/4*pi
- amp_LoQ_t[amp_LoQ_t<0]=-1/4*pi
- amp_LoQ_t[amp_LoQ_t>=0]=1/4*pi
- # ミキサー
- amp_I_t_before_LPF=amp_t*amp_LoI_t
- amp_Q_t_before_LPF=amp_t*amp_LoQ_t
- # フィルター係数生成
- freq_cutoff=f_sym*2
- w_cutoff=freq_cutoff/(f_samp_simulation/2)
- b,a=signal.butter(1,w_cutoff,'lowpass')
- # フィルター適用
- amp_I_t=signal.lfilter(b,a,amp_I_t_before_LPF)
- amp_Q_t=signal.lfilter(b,a,amp_Q_t_before_LPF)
- amp_demod_t=amp_I_t+1j*amp_Q_t
- # ダウンサンプリング
- f_sampling_target=f_sym*10
- downsampling_rate=int(f_samp_simulation/f_sampling_target)
- t_downsample=t[::downsampling_rate]
- amp_demod_t_downsample=amp_demod_t[::downsampling_rate]
- f_samp_simulation_downsample=f_samp_simulation/downsampling_rate
- t_samp_simulation_downsample=1/f_samp_simulation_downsample
- # 復調
- amp_demod_t0_downsample=amp_demod_t_downsample[:-1:]
- amp_demod_t1_downsample=amp_demod_t_downsample[1::]
- phase_shift_t_downsample=-1*np.angle(amp_demod_t1_downsample/amp_demod_t0_downsample)
- phase_shift_t_downsample=np.append(0,phase_shift_t_downsample)
- # 規格化
- phase_shift_t_downsample=phase_shift_t_downsample/(f_sym/f_samp_simulation_downsample*pi*m)
- # プロット
- fig=plt.figure()
- fig.add_subplot(2,1,1)
- plt.plot(t_downsample,amp_demod_t_downsample.real)
- plt.plot(t_downsample,amp_demod_t_downsample.imag)
- fig.add_subplot(2,1,2)
- plt.plot(t_downsample,phase_shift_t_downsample)
- plt.ylim(-2,2)
- fig=plt.figure()
- ax=fig.add_subplot(1,1,1)
- plt.scatter(amp_demod_t_downsample.real,amp_demod_t_downsample.imag)
- plt.xlim(-0.5,0.5)
- plt.ylim(-0.5,0.5)
- ax.set_aspect('equal', adjustable='box')
良いっちゃ~良いんだけど、、、やっぱり正弦波よりは美的に劣るか、、、
ていうか、今までやったのパルスじゃなくて矩形波じゃん;
コメントをお書きください