消えた分の再現です。
LTspice:「前回の失敗をどうすんだ?」
画蔵:「(小一時間考える)そうだ!cos で計算すればいいのでは?」
位相がずれたならばそれに合わせて共振器の位相もずらせば良いのです。
clear
N=2000
t=0:1/N:1-1/N
fig_axis=[0,1,-1.5,1.5]
Rect(1,1:N/4)=-1
Rect(1,N/4+1:N/2)=1
Rect(1,N/2+1:N*3/4)=1
Rect(1,N*3/4+1:N)=-1
// 矩形波の発生
scf(1);clf;plot(t,Rect)
mtlb_axis(fig_axis)
fmax=20
// 評価する最大の周波数
for i=1:fmax
x=cos(2*%pi*t*i)//ここを cos にした。
combo_cos=x.*Rect
// 余弦波と矩形波の掛け算
sin_level(1,i)=sum(combo_sin)./N*2
// 総和を取って計算数で割る
end
ft_axis=[0,fmax,-1.5,1.5]
scf(2);clf;plot(1:fmax,sin_level)
mtlb_axis(ft_axis)
こういう波形が、
こうなります。
単なる総計=積分なので符号が負になるものも現れます。
絶対値を取ればスペクトラムに見えます。
入力信号に合わせて選べば良いのです。
これで完成です。
LTspice:「ちょっと待てよ。入力信号がどういう位相で来るかあらかじめ分かっているのか?」
画蔵:「ギクッ」
scilab:「それに含まれている周波数成分によってそれぞれ位相が違ったりするんじゃない?」
Excel:「今回は矩形波のご好意により上手くいったみたいですけどね...。」
画蔵:「正弦波で計算するのと余弦波で計算するのとうまく組み合わせたいが」
LTspice:「オイラーの公式を思い出せよ」
画蔵:「おいらの公式!」
scilab:「うわぁ、さぶ!」
Excel:「猛暑を吹き飛ばす凍てつく攻撃」
LTspice:「おれは逆だ。ヒートアップして暴走しかかった」
オイラーの公式を直接どうこうというわけでもないのですが、そのエッセンスを頂戴することにします。
つまり入力信号に対して正弦波を掛けたものと余弦波と掛けたものをを作っておき、それらが極座標表示になっているものとイメージしてそのベクトルの長さを計算してみようというわけです。
スクリプトをこんな風にしてみました。
clear
N=2000
t=0:1/N:1-1/N
p_shift=int(20/100*N) // 位相をずらす量をパーセントで記入
fig_axis=[0,1,-1.5,1.5]
Rect(1,1:N/4)=1
Rect(1,N/4+1:N/2)=1
Rect(1,N/2+1:N*3/4)=-1
Rect(1,N*3/4+1:N)=-1
if p_shift<>0 then
Srect(1:p_shift)=Rect(N-p_shift+1:N)
Srect(p_shift+1:N)=Rect(1:N-p_shift)
else
Srect=Rect
end
scf(10);clf;plot(t,Srect)
mtlb_axis(fig_axis)
fmax=20
for f1=1:fmax
x=sin(2*%pi*t*f1) // 正弦波
y=cos(2*%pi*t*f1) // 余弦波
combo_sin=x.*Srect
combo_cos=y.*Srect
sin_level(1,f1)=sum(combo_sin)./N*2
cos_level(1,f1)=sum(combo_cos)./N*2
level(1,f1)=((sin_level(f1))^2+(cos_level(f1))^2)^0.5
end
ft_axis=[0,fmax,-1.5,1.5]
scf(20);clf;plot(1:fmax,level,1:fmax,sin_level,1:fmax,cos_level)
mtlb_axis(ft_axis)
位相は 20%、つまり 72 deg ずらしてみました。(0 は受け付けません、あしからず)
結果はこうです。
青線が総合振幅、緑線が正弦波と掛け算した時の総和、赤線が余弦波と掛け算した時の総和。総合振幅は自乗和ですのでいわゆる絶対値で符号は正のみです。
これらの試みは学術的にはツッコミどころ満載です。一見離散フーリエ変換と同じようなことをやってそうに見えますが、離散フーリエ変換の一般式は以下のようになっていて、
元波形に掛け算するのは、複素正弦波ということで cos(x) + i sin(x) であり(オイラーの公式)実数部分に cos 虚数部分に sin となっていて、今回の計算とは逆になっています。多分極性の設定や積算範囲、式の解釈に考え落ちがあるとは思いますが、これ以上は今は深掘りしません。
イメージとしてアナログスペアナと同じように、共振回路に入れて当該周波数成分を抽出してみた、と思って下さい。
アナログフィルタによる周波数成分抽出は位相問わずやってくれますが、数値的に計算しようとすると抽出枠やサンプリング周波数、計算精度の関係で色々都合が出てきます。
M くん:「やっぱり連続的に信号を扱うことのできるアナログ信号処理の方が優れているのですね」
画蔵:「いいから黙ってろ」
本格的に勉強したい方はこちらのサイトがオススメです。
やる夫で学ぶディジタル信号処理
次回は別の混合波形も念のためいくつか見てみます。