· 

直交復調 numpy (1)

搬送波周波数と、周波数偏差が近すぎる場合は、LPFの次数を大きくしないと落としきれないので、今回はキャリア周波数を100MHzとして、CPFSK波形を出力し、それを直交復調してみる。

  1. # 変数クリア
  2. from IPython import get_ipython
  3. get_ipython().magic('reset -sf')
  4. import matplotlib.pyplot as plt
  5. import numpy as np
  6. from scipy import signal
  7.  
  8. # 波形を読み込む
  9. t=np.load('output/cfsk_o_t.npy')
  10. amp_t=np.load('output/cfsk_o_amp_t.npy')
  11.  
  12. # よく使う変数
  13. pi=np.pi
  14. deg2rad=pi/180.0
  15. twopi=2*pi
  16.  
  17. # 設定
  18. f_Lo=100e6              # 搬送波周波数 in Hz
  19. f_samp_simulation=1e9 # 計算のサンプリングレート in Hz
  20. f_deviation=0.3e6     # 周波数偏差 in Hz
  21. phase_Lo=0*deg2rad    # 搬送波の初期位相(何でもいい) in rad
  22.  
  23. # 後で使う変数
  24. t_samp_simulation=1/f_samp_simulation
  25. omega_Lo=twopi*f_Lo
  26.  
  27. # 局発信号の生成
  28. amp_LoI_t=np.cos(omega_Lo*t+phase_Lo)
  29. amp_LoQ_t=np.sin(omega_Lo*t+phase_Lo)
  30.  
  31. # ミキサー
  32. amp_I_t_before_LPF=amp_t*amp_LoI_t
  33. amp_Q_t_before_LPF=amp_t*amp_LoQ_t
  34.  
  35. # フィルター係数生成
  36. freq_cutoff=f_deviation*2 #ざっくり^^
  37. w_cutoff=freq_cutoff/(f_samp_simulation/2)
  38. b,a=signal.butter(1,w_cutoff,'lowpass')
  39.  
  40. # フィルター適用
  41. amp_I_t=signal.lfilter(b,a,amp_I_t_before_LPF)
  42. amp_Q_t=signal.lfilter(b,a,amp_Q_t_before_LPF)
  43.  
  44. # プロット
  45. fig=plt.figure(figsize=(12,12))
  46. fig.add_subplot(2,1,1)
  47. plt.plot(t,amp_I_t_before_LPF)
  48. plt.plot(t,amp_Q_t_before_LPF)
  49. plt.xlim(240e-6,260e-6) # ちょうどシンボルの変わり目を表示
  50. fig.add_subplot(2,1,2)
  51. plt.plot(t,amp_I_t)
  52. plt.plot(t,amp_Q_t)
  53. plt.xlim(240e-6,260e-6) # ちょうどシンボルの変わり目を表示

上のグラフが、LPF前、下のグラフがLPF後。