その4でFM変調があいまいだったので作り直してみた。
ポイント数が、2048ポイント限定なので、1周期がせめて4ポイントは欲しいということで、キャリアマルチプライヤとデビエーションマルチプライヤの和が500までにして作成してほしいという限定付きだ。
FM変調のおさらいは、信号発生器のメーカーのTektronixのマニュアルに良い記述があったのでそれを拝借した。AWG510/AWG520型のユーザマニュアルのEquation作成波形の記述を参考にさせていただいた。
この会社の昔の機器のマニュアルには基礎となる記述が多々あって勉強になる。
import serial
import math
from time import sleep
ser= serial.Serial('/dev/ttyUSB0', baudrate=115200, timeout=3.0)
cmd=':w20=0,0.\r\n' #Output=off
bcmd=cmd.encode()
ser.write(bcmd)
a=ser.readline()
bcmd=a.decode()
print(bcmd)
m=1 #mod frequency multiplier m=1 then Mode freq=waveform frequency
d=100 #carrier multiplier
a=50 #deviation a+d<500 recommend a+d=500 then 1cycle=4point
c=0
cmd=''
while c<2048:
#temp=int(2048*(1+(0.5+0.5*a*math.sin(2*3.14/2048*c))*math.sin(2*3.14/2048*d*c)))
temp=int(2048*(1+math.sin(2*3.14*c*d/2048+a/m*math.sin(2*3.14*c*m/2048))))
c=c+1
if c<2048:
cmd=cmd+str(temp)+','
else:
cmd=cmd+str(temp)
cmd=':a07='+str(cmd)+'.\r\n' #write to Arbmem 05
print(cmd)
bcmd=cmd.encode()
ser.write(bcmd)
sleep(0.05)
bcmd=''
a=''
a=ser.readline()
bcmd=a.decode()
print(bcmd)
cmd=':w21=107.\r\n' #waveform=Arbmemory 05
bcmd=cmd.encode()
ser.write(bcmd)
a=ser.readline()
bcmd=a.decode()
print(bcmd)
bcmd=''
a=''
a=ser.readline()
bcmd=a.decode()
print(bcmd)
cmd=':w23=1000000.\r\n' #Repeat Freq=10.0kHz
bcmd=cmd.encode()
ser.write(bcmd)
a=ser.readline()
bcmd=a.decode()
print(bcmd)
cmd=':w20=1,1.\r\n' #OUTPUT ON
bcmd=cmd.encode()
ser.write(bcmd)
a=ser.readline()
bcmd=a.decode()
print(bcmd)
ser.close()
上記のコードは、
繰り返し周波数10kHz
キャリアマルチプライアd=100
デビエーションマルチプライアa=50
この時のキャリア周波数は、10kHz x 100=1MHz
デビエーション周波数は、10kHz x 50=500kHz
ですので、1MHz±500kHzの周波数に変調されることになる。
変調周波数は、m=1の時繰り返し周波数に一致する 10kHzだ。
オシロスコープで取り込んでFFTしてみると確かにおおむね一致していることがわかる。
m=1としているが、これを変えることで、変調周波数も変更できます。
m=2で変調周波数=10kHz x2=20kHzとなります。
念のため、オシロでFM変調の上限と下限の周波数の時間軸波形を確認してみた。
トリガ用にCH2に同じ周波数の矩形波を出力させて、Duty50%の立ち上がり、立下りにトリガをかけて近辺の周波数を確認してみた。
CH2は、トリガ用に便利だ。位相も変えられるので、決まったところにトリガをかけることができる。