pythonで、コサイン波の足し合わせの逆を見てみよう

足し合わせた波形を分解しようpythonで遊ぼう

コサイン波を足すのは簡単、では分解は?

例えば周波数1,3,5のコサイン波を足し合わせると、

足し合わせは、足せばいいんですけど、では逆に分解できますか?ということを考えてみます。分解とはつまり、このグラフの波形から、周波数1,3,5の波がある、ということをつきとめることができますか?、ということになります。

考える前に準備をしましょう

周波数が同じコサイン波を掛けて足し合わせる

周波数が1Hzのコサイン波を掛け合わせて、結果を足し合わせてみます。言葉で言ってもよく意味が通らなので、イメージ図を見てみましょう。

図にあるコサイン波は両方周波数1のコサイン波なのですが、2つは違う波形ととらえて、各ポイントの掛け算を計算します。

x0×y0、x1×y1、x2×y2、・・・xn×yn、を計算します。

これらをすべて足し合わせます。(ここまでイメージ図)この結果を点の個数nで割って、この値を観察します。プログラムを見てみましょう。

import math

pi=math.pi
n=0
t=0
kaisu=0

while t<2:
    sita=2*pi*t
    a=math.cos(sita)
    n=n+a*a
    kaisu=kaisu+1
    t=t+0.002

n=n/kaisu
print(str(n))

【コードを見てみよう】

プログラムは図の点(x0,x1など)の値をaで表しています。sitaの値が t 毎に変化するので、sitaの値もwhileの中の計算を繰り返すごとに変わっていきます。

n=n+a*a

で、a*aの値を次々足しこんでいきます。

kaisu=kaisu+1

は何回while文の中身の計算をしたか、をカウントしています。100回繰り返せば、kaisu=100になります。

最後に計算が終われば、n=n/kaisu で足し合わせた結果を、ループの回数で割ります。

実行すると、

0.5000000000000004

となりました。

周波数の違うコサイン波を掛けわせるとどうなる?

では次に、周波数1のコサイン波と周波数2のコサイン波を掛け合わせるとどうなるか、プログラムで見てみましょう。

import math

pi=math.pi
n=0
t=0
kaisu=0

while t<2:
    sita=2*pi*t
    a=math.cos(sita)
    b=math.cos(2*sita)
    n=n+a*b
    kaisu=kaisu+1
    t=t+0.002

n=n/kaisu
print(str(n))

【コードを見てみます】

ほとんど一緒なのですが、bで周波数2のコサイン波を生成し、n=n+a*b として和をとっています。

結果を見てみましょう。

7.334133300673784e-16

e-16は10-16ということなので、0に非常に近い値なので、0とみなしていいです。

もっひとつおまけで、 bのところを b=math.cos(3*sita) に変えるとどうなるでしょうか。

8.525402606096577e-16

という結果が得られます。0とみなしていい数値が出てきます。

足し合わせの波形で同じことをしてみます

以上を踏まえて、同じことをコサインの足し合わせのグラフでやってみます。周波数1,3,5Hzのコサイン波の足し合わせ波形を作り、周波数5Hzまでの範囲で、書く周波数の有り無しを見てみましょう。プログラムはもっと簡単にかけるのですが、読者さんはプログラム習い始めの方を想定していますので、効率よりも簡単さ重視で書いています。

import math

pi=math.pi
t=0
kaisu=0
cos_1=0
cos_2=0
cos_3=0
cos_4=0
cos_5=0

while t<2:
    sita=2*pi*t
    a=math.cos(sita)+math.cos(3*sita)+math.cos(5*sita)
    cos_1=cos_1+a*math.cos(sita)
    cos_2=cos_2+a*math.cos(2*sita)
    cos_3=cos_3+a*math.cos(3*sita)
    cos_4=cos_4+a*math.cos(4*sita)
    cos_5=cos_5+a*math.cos(5*sita)
    kaisu=kaisu+1
    t=t+0.002

cos_1=cos_1/kaisu
cos_2=cos_2/kaisu
cos_3=cos_3/kaisu
cos_4=cos_4/kaisu
cos_5=cos_5/kaisu

print('cos_1='+str(cos_1))
print('cos_2='+str(cos_2))
print('cos_3='+str(cos_3))
print('cos_4='+str(cos_4))
print('cos_5='+str(cos_5))

【コードを見てみよう】

cos_1からcos_5に、重ね合わせた波形と、各周波数のコサイン波の和を取り込んでいきます。whileの中で計算できたら、whileで繰り返した数(kaisu)で割ります。結果をprintで打ち出します。

print(str(cos_1))

とすると、結果を見ると何の計算結果はわからないので、

print(‘cos_1=’+str(cos_1))

と書いておきます。これで、数値に前に、cos_1=を書くことができます。ただし+が必要になります。つまり、

print(‘cos_1=’str(cos_1))   (誤り構文)

これでは動きませんので注意しましょう。

結果を見てみましょう。

cos_1=0.5000000000000018
cos_2=2.191136161400209e-15
cos_3=0.5000000000000019
cos_4=2.283506717049022e-15
cos_5=0.5000000000000026

これを見ると、周波数1,3,5の成分はある、周波数2,4の成分はない、ということがわかります。

pyhtonプログラムのチェックポイント

回数をカウントしているkaisuは、以下のような形になっています。

kaisu=0

while t<2:
     kaisu=kaisu+1

この形で、whileの中が何回実行されたか確認できます。1回目のwhileが実行されると、どうなるかというと、

  • まずkaisu=0である
  • kaisu=kaisu+1 なので、これはkaisu←kaisu+1 と解釈する
  • kaisu=0なので、kaisu←0+1なので、kaisuは1になる。
  • 2回目にwhileが実行されると、kaisu=1なので、kaisu←1+1 でkaisu=2になる

以下同様です。n=n+a*aも同様の解釈で理解できると思います。

コメント

タイトルとURLをコピーしました