pythonで関数を使って、コサイン波を周波数ごとにを分解しよう

関数を使って、コサイン合成波形から、特定の周波数の波形があるかしらべるpythonで遊ぼう

pythonの関数をみてみよう

pythonとかで、まとまった処理を繰り返し実行したいときに、関数というものが使われることが多いです。

例えば、

print('pythonで')
print('関数を書きたい')
print('どう書けばいい?')

print('pythonで')     ←前3行と同じ
print('関数を書きたい')
print('どう書けばいい?')

print('pythonで')     ←最初3行と同じ
print('関数を書きたい')
print('どう書けばいい?')

と書きたい場合、コード全体は、最初の3行の繰り返しになっています。なので、この最初の3行を実行してくれる関数を3回実行させればいいことになります。

上の3行を関数を用いて実行する場合、次のように書くことができます。

#関数の定義
def Pri():
    print('pythonで')
    print('関数を書きたい')
    print('どう書けばいい?')
#関数ここまで

#関数を実行
Pri()

まず関数は ‘def 関数の名前():’ と関数の名前を決めて、それから関数の中に実行したい命令をかきます。関数の中に書く場合、字下げ(Tabを入れる)をしておきます。ここでは関数の名前をPriとしてあります。

関数は定義しただけでは動きません。動け、と言わなければならない。それが、

Pri()

になります。これで、関数の中が実行されます。

次に、戻り値がある関数の例を見てみましょう。

#関数の定義
def tasu():
    a=5
    b=7
    return a+b
#関数ここまで

c=tasu()
print(str(c))

【コードを見てみよう】

関数の中を見てみると、a=5,b=7を代入しています。次に見慣れない return a+b ですが、これはどういうことかといいますと、この関数を実行したときに、a+bの値、この場合5+7=12ですが、この値を返しなさい、という意味になります。

どこに返すかといいますと、関数を実行した、

c=tasu()

の c に12という値が入ります。

次に、関数の中に書いた5と7を、関数の実行時に渡すようにコードを書き換えてみましょう。

#関数の定義
def tasu(a,b):
    return a+b
#関数ここまで

c=tasu(5,7)
print(str(c))

【コードを見てみよう】

まず関数の定義が変わっています。

def tasu(a,b):

と、a,bがカッコの中に入っています。このa,bは、関数の実行時に与えられます。それが、

c=tasu(5,7)

の部分です。これは、tasu(5,7)→(def) tasu(aに5を入れる、bに7を入れる)

と解釈します。ここで、def tasu(a,b)の中身は、return a+b ですので、5+7=12 をこの関数が返してきて、cに入れます。

プログラムを実行すると、12が表示されると思います。

コサイン波の重ね合わせ波形から、特定の周波数があるかどうかを調べてみよう

では以前やりました、コサイン波の重ね合わせた波形から、固有の周波数の波があるかないか、を判断する関数を作ってみましょう。

注意)プログラムに慣れていない方を対象に書いていますので、エレガントではないです。
import math

#関数の定義
def hantei(a,na):
    tt=0
    n=0
    ka=0
    while tt<2:
        sitaa=2*pi*tt
        n=n+math.cos(a*sitaa)*na[ka]
        ka=ka+1
        tt=tt+0.002
    
    n=n/kaisu

    if n>0.01:
        return 'ari'
    else:
        return 'nashi'
#定義ここまで


pi=math.pi

t=0
kaisu=0
nami=[]

while t<2:
    sita=2*pi*t
    nami.append( math.cos(sita)+math.cos(3*sita)+math.cos(5*sita) )
    kaisu=kaisu+1
    t=t+0.002

print( hantei(3,nami) )

【コードを見てみよう】

まず関数より下を見てみましょう。while文の中で、周波数1,3,5Hzのコサイン波を作成し、namiに取り込んでいます。

次にprint()の中を見てみましょう。hantei(3,nami)とあります。ここで関数に渡す値(引数といいます)はnamiのように、配列を渡すこともできます。

次に関数の中を見てみましょう。この関数(hantei(3,nami))は1番目の引数(ここでは3ですね)の波があるかどうか、を判定するプログラムです。

関数の定義の中を見ると、sitaaとかttとか妙な変数があります。初心者の方にわかりやすく、sitaとsitaa、tとttを分けて書いてあります。(本当は、わけなくていいです。)

関数の中では、周波数3Hzの波形と、コサインの合成波形を掛けて足し合わせています。以前確認した方法です。以前の方法を思い出すと、波形があれば、関数中のnは0.5ぐらいの値、なければ0に近い値になりました。

次にifの部分です。

if(条件1)
    内容1
else:
    内容2

とあると、条件1が成立したら、内容1を実行しなさい。条件1が成立しなければ、内容2を実行しなさい、という意味になります。このif文はよく使います。

関数内では、nの値が0.01より大きければ、この周波数のコサイン波がある、ということで、’ari’を返す、nが0.01以下であれば、’nashi’を返す、となっています。

この帰ってきた文字を、print( hantei(3,nami) ) と書くことで、結果として見ることができます。これで実行すると、ari が返ってくることが確認できると思います。

pythonプログラム ワンポイントチェック

関数からなにがしら結果を返す場合は、return を使うのですが、例えばaaaを返すとして、aaaが数値であれば、

return aaa

ですが、文字として返すならば、

return ‘aaa’

とします。

コメント

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