numpyでCPFSK波形を作る
# 変数クリア from IPython import get_ipython get_ipython().magic('reset -sf') import matplotlib.pyplot as plt import numpy as np # シンボル列を引き延ばす 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=1e6 # 搬送波周波数 in Hz f_deviation=0.3e6 # 周波数偏差 in Hz f_sym=4e3 # シンボルレート in Hz f_samp_simulation=1e9 # 計算のサンプリングレート in Hz phase_initial=45*deg2rad # 搬送波の初期位相(何でもいい) in rad symbols_in_base=np.array([1,0,1,0,1]) # シンボル # 後で使う変数 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 # "0 or 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) # プロット fig=plt.figure(figsize=(12,12)) fig.add_subplot(2,1,1) plt.plot(t,phase_t) fig.add_subplot(2,1,2) plt.plot(t,amp_t) plt.xlim(t_sym*1.97,t_sym*2.03) # ちょうどシンボルの変わり目を表示
0 件のコメント:
コメントを投稿