素人質問で恐縮です。
周波数を設定した正弦波を合成したいのですが、どうすればいいか分かりません。
a = 1 # 振幅
fs = 10000 # サンプリング周波数
f1 = 5 # 周波数
f2 = 15
f3 = 25
sec = 5 # 秒
swav = []
swav1 = []
swav2 = []
swav3 = []
for n in np.arange(fs * sec):
s = a * np.sin(2.0 * np.pi * f1 * n / fs)
swav1.append(s)
for n in np.arange(fs * sec):
s = a * np.sin(2.0 * np.pi * f2 * n / fs)
swav2.append(s)
for n in np.arange(fs * sec):
s = a * np.sin(2.0 * np.pi * f3 * n / fs)
swav3.append(s)
swav = swav1 + swav2 + swav3※
plt.plot(swav[0:10000])
plt.show()
上記のように周波数を設定し、足し合わせ方が分かりません。
宜しくお願い致します。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答6件
0
ベストアンサー
他の皆さんが「どう直せばいいか」をコメントしておられますが、「なぜうまくいかないか」について若干コメントします。(もうお分かりと思いますが・・・)
質問者さんのコードの問題は「List同士を+
で演算する意味」を勘違いしている点にあったと思います。
[1, 2] + [3, 4]
の結果は
[4, 6]
ではなく
[1, 2, 3, 4]
なのですね。
listに対する+
は加算ではなく連結のため、先頭の10000要素を取り出してプロットしても周波数f1の波形しかでてこないわけです。
ところで配列の要素同士の演算(本件の加算のように)をしているコードをよく見かけます。Pythonには型宣言がないため、自分などは何型を使っているのかピンときてませんでした。しかし今にしてようやくそれらがlistでなくnumpy.ndarrayだからできるのだということがわかってきました。
np.array([1, 2]) + np.array([3, 4])
上記のようにすると結果は
array([4, 6])
になります。質問者さんの期待はこのようになることですよね。
listとして扱うなら要素に対する演算、それをするための要素への分解、結果をlistへ再構成することを組みで考える必要があると思います。それがKojiDoiさん、can110さんの回答になるのですね。
一方numpy.ndarrayとして扱うなら配列同士に対して直接演算すれば自動的に要素同士の演算をして元の形で結果を返してくれるという大変便利なことになっていますね。それがmagichanさん、mkgreiさんの回答になるのだと思います。
[...]
はPythonではlist型で、np.array([...])
とやるとそれはnumpy.ndarray型になりますが、前者を文字通り「リスト」、後者を数学的な「配列」と捉えると、この両者の使い分けを考えやすい気がしました。
[...]
がなぜarrayではなくlistと呼ばれるか、自分はここ何件かのQ&Aでようやく腑に落ちた気がします。
投稿2017/11/28 12:19
編集2017/11/28 13:04総合スコア18404
0
そもそも、ループは必要ないのでは?
Python
1import numpy as np 2import matplotlib.pyplot as plt 3 4a = 1 # 振幅 5fs = 10000 # サンプリング周波数 6f1 = 5 # 周波数 7f2 = 15 8f3 = 25 9sec = 5 # 秒 10 11t = np.arange(fs * sec) 12swav1 = a * np.sin(2.0 * np.pi * f1 * t / fs) 13swav2 = a * np.sin(2.0 * np.pi * f2 * t / fs) 14swav3 = a * np.sin(2.0 * np.pi * f3 * t / fs) 15swav = swav1 + swav2 + swav3 16 17plt.plot(swav[:10000]) 18plt.show()
投稿2017/11/28 09:48
総合スコア15898
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
関数で攻めることもできます。
python
1import numpy as np 2 3a = 1. 4fs = 10000 5f1 = 5. 6f2 = 15. 7f3 = 25. 8sec = 5. 9 10def f(x): 11 return a * (np.sin(2.0 * np.pi * f1 * x / fs) + 12 np.sin(2.0 * np.pi * f2 * x / fs) + 13 np.sin(2.0 * np.pi * f3 * x / fs)) 14 15t = np.arange(fs * sec) 16swav = f(t) 17 18print(swav)
投稿2017/11/28 11:06
総合スコア8562
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
Sin関数の結果同士を数学的に加算するのであれば、ほかの回答者の方の言う通りです。しかしながら、対象が音波のような場合、周波数の異なる音波同士が強めあったり、打ち消しあったりするので計算式そのものが異なるものになるようです。
私自身、その分野の専門家ではないので具体的な理論および公式を紹介できなくて申し訳ないのですが、音波を対象にしているのであれば、専門書を確認することをお勧めします。
投稿2017/11/29 15:49
総合スコア3378
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/11/29 17:06
2017/11/29 18:52
2017/11/29 23:25
2017/11/29 23:47

あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。