2020年7月11日土曜日

numpyでCPFSK

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 件のコメント:

コメントを投稿