· 

numpyでCPFSK

  1. # 変数クリア
  2. from IPython import get_ipython
  3. get_ipython().magic('reset -sf')
  4.  
  5. import matplotlib.pyplot as plt
  6. import numpy as np
  7.  
  8. # シンボル列を引き延ばす
  9. def extend_symbol_to_simulation_sampling_rate(symbols,t_symbol,t_simulation_sampling):
  10.     # シンボル数
  11.     size_of_symbols=symbols.size
  12.     # 最後のシンボルが終わる時間
  13.     end_time=size_of_symbols*t_symbol
  14.     # 計算タイミング
  15.     t=np.arange(0,end_time,t_simulation_sampling)
  16.     # 各シンボルの開始(終了)時間
  17.     t_periods_of_symbols=np.append(0,np.arange(1,size_of_symbols,1)*t_symbol)
  18.     # 結果データ領域確保
  19.     ex_symbols=np.zeros_like(t)
  20.     ex_symbols[0]=symbols[0]
  21.     # 各シンボルについて、その期間のインデックスを取得し、データを入れ込む
  22.     for i in range(0,size_of_symbols):
  23.         ex_symbols[np.where(t>t_periods_of_symbols[i])]=symbols[i]
  24.     return ex_symbols,end_time
  25.         
  26. # よく使う変数
  27. pi=np.pi
  28. deg2rad=pi/180.0
  29. twopi=2*pi
  30.  
  31. # 設定
  32. f_carrier=1e6            # 搬送波周波数 in Hz
  33. f_deviation=0.3e6         # 周波数偏差 in Hz
  34. f_sym=4e3                 # シンボルレート in Hz
  35. f_samp_simulation=1e9     # 計算のサンプリングレート in Hz
  36. phase_initial=45*deg2rad  # 搬送波の初期位相(何でもいい) in rad
  37. symbols_in_base=np.array([1,0,1,0,1]) # シンボル
  38.  
  39. # 後で使う変数
  40. t_sym=1/f_sym
  41. t_samp_simulation=1/f_samp_simulation
  42. omega_carrier=twopi*f_carrier
  43. omega_deviation=twopi*f_deviation
  44.  
  45. # シンボルを計算用に拡張
  46. [symbols,t_end]=extend_symbol_to_simulation_sampling_rate(symbols_in_base,t_sym,t_samp_simulation)
  47. symbols=symbols*2-1       # "0 or 1" を "-1 or 1"にする
  48.  
  49. # 計算するタイミング
  50. t=np.arange(0,t_end,t_samp_simulation)
  51.  
  52. # 全計算タイミングにおける瞬間的な角速度
  53. omega_in_moment=omega_carrier+omega_deviation*symbols
  54.  
  55. # 全計算タイミングにおける瞬間的な位相変化量
  56. phase_change_in_moment=omega_in_moment*t_samp_simulation
  57.  
  58. # 全計算タイミングでの位相
  59. phase_t=np.cumsum(phase_change_in_moment)+phase_initial
  60.  
  61. # 波形生成
  62. amp_t=np.exp(1j*phase_t)
  63.  
  64. # プロット
  65. fig=plt.figure(figsize=(12,12))
  66. fig.add_subplot(2,1,1)
  67. plt.plot(t,phase_t)
  68. fig.add_subplot(2,1,2)
  69. plt.plot(t,amp_t)
  70. plt.xlim(t_sym*1.97,t_sym*2.03) # ちょうどシンボルの変わり目を表示
  71.  

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

コメント: 1
  • #1

    名無し (日曜日, 12 7月 2020 17:36)

    なるほど