サイン波の重ね合わせ

May 3, 2020

引き続き「ゼロからはじめる音響学」を読んでいます。

http://floor13.sakura.ne.jp/book07/book07.html

今日はサイン波の重ね合わせをやってみました。

まずは結果から。

https://soundcloud.com/user-255261297-724174099/sets/hello-acoustics-2

1は単体で、2以降は2・3・4倍音を重ね合わせています。

グラフで見るとこんな感じです。

ソースコードはこちら。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import os
import numpy as np
import matplotlib.pyplot as plt
from functools import reduce
from scipy.io import wavfile

A = 0.2
fs = 44100
duration = 2

t = np.arange(0, fs * duration) / fs
num = int(os.environ.get('F0_NUM', '1'))
f0_list = np.arange(1, num + 1) * 261.63
y = reduce(lambda x, f0: x + A * np.sin(2 * np.pi * f0 * t), f0_list, np.zeros_like(t))

fade_ms = 20
fade_size = int(len(y) * fade_ms / (duration * 1000))
fade_filter = np.concatenate([np.linspace(0, 1, fade_size), np.ones(len(y) - fade_size * 2), np.linspace(1, 0, fade_size)])
faded = y * fade_filter

plt.plot(t * 1000, faded)

plt.xlabel('ms')
plt.ylabel('amplitude')

plt.xlim(0, 50)

if os.environ.get('SHOW_PLOT') == '1':
    plt.show()
else:
    plt.savefig(f'output/sine_overtone_{num}.png')

wavfile.write(f'output/sine_overtone_{num}.wav', fs, (faded * 32767).astype(np.int16))

ディープラーニングとはだいぶ遠ざかってきましたが、勉強になって面白いのでまだしばらくこの辺りの勉強を続ける予定です。