Skip to content

Commit 47f89fe

Browse files
authored
Merge pull request #6 from woodnx/skotsugi/chapter01
Skotsugi add chapter01
2 parents 4d6d1fe + 7f1b48e commit 47f89fe

File tree

13 files changed

+179
-0
lines changed

13 files changed

+179
-0
lines changed

skotsugi/chapter01/q01.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import numpy as np
2+
import matplotlib.pyplot as plt
3+
4+
A = 1.0 # 振幅
5+
f0 = 440 # 周波数[Hz]
6+
sec = 3.0 # 信号の長さ[s]
7+
fs = 16000 # サンプリング周波数[Hz]
8+
PI = np.pi # 円周率
9+
10+
n = np.arange(0, fs*sec) / fs # 間隔(公差)を指定(start: 0, stop: sec, step: 1/sf)
11+
y = A * np.sin(2 * PI * f0 * n)
12+
13+
plt.plot(n, y)
14+
15+
plt.xlim(0, 1 / f0)
16+
plt.xlabel("time [sec]")
17+
plt.ylabel("Amplitude")
18+
19+
plt.savefig("./skotsugi/chapter01/q1.png")

skotsugi/chapter01/q02.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import numpy as np
2+
import soundfile as sf
3+
4+
def make_sin_wave(A, f, fs, sec):
5+
n = np.arange(0, fs*sec) / fs
6+
return A * np.sin(2 * np.pi * f * n)
7+
8+
if __name__ == "__main__":
9+
fs = 16000 # サンプリング周波数[Hz]
10+
11+
y = make_sin_wave(1.0, 440, fs, 3.0)
12+
13+
sf.write("./skotsugi/chapter01/q02.wav", y, fs)

skotsugi/chapter01/q03.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import numpy as np
2+
import soundfile as sf
3+
from q02 import make_sin_wave
4+
5+
fs = 16000 # サンプリング周波数[Hz]
6+
sec = 3.0
7+
8+
y = np.zeros((int(fs*sec), 2), dtype=float)
9+
y[:,0] = make_sin_wave(1.0, 440, fs, sec)
10+
y[:,1] = make_sin_wave(1.0, 660, fs, sec)
11+
12+
sf.write("./skotsugi/chapter01/q03.wav", y, fs)

skotsugi/chapter01/q04.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import numpy as np
2+
import matplotlib.pyplot as plt
3+
4+
def make_white_noise(length):
5+
return np.random.normal(size=int(length))
6+
7+
if __name__ == "__main__":
8+
np.random.seed(0)
9+
10+
fs = 16000 # サンプリング周波数[Hz]
11+
sec = 3.0
12+
13+
y = make_white_noise(fs*sec)
14+
n = np.arange(0, 3.0, 1/fs)
15+
16+
plt.plot(n, y)
17+
18+
plt.xlim(0)
19+
plt.xlabel("time [sec]")
20+
plt.ylabel("Amplitude")
21+
22+
plt.savefig("./skotsugi/chapter01/q4.png")

skotsugi/chapter01/q05.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import numpy as np
2+
import matplotlib.pyplot as plt
3+
from q02 import make_sin_wave
4+
from q04 import make_white_noise
5+
6+
np.random.seed(0)
7+
8+
fs = 16000 # サンプリング周波数[Hz]
9+
sec = 3.0
10+
11+
y = make_white_noise(fs*sec) + make_sin_wave(1.0, 440, fs, 3.0)
12+
13+
n = np.arange(0, 3.0, 1/fs)
14+
15+
plt.plot(n, y)
16+
17+
plt.xlim(0)
18+
plt.xlabel("time [sec]")
19+
plt.ylabel("Amplitude")
20+
21+
plt.savefig("./skotsugi/chapter01/q5.png")

skotsugi/chapter01/q06.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import math
2+
import numpy as np
3+
from q02 import make_sin_wave
4+
from q04 import make_white_noise
5+
6+
def square_mean(x):
7+
# return np.sum(x ** 2) # <- これだとうまくいかなかった
8+
return np.mean(x ** 2)
9+
10+
def sn_rate(s, x):
11+
if (len(s) != len(x)):
12+
return
13+
14+
s_sum = square_mean(s)
15+
x_sum = square_mean(x)
16+
17+
return 10 * math.log10(s_sum / x_sum)
18+
19+
##### DEBUG #####
20+
if __name__ == "__main__":
21+
np.random.seed(0)
22+
23+
fs = 16000
24+
sec = 3.0
25+
26+
s = make_sin_wave(1.0, 440, fs, 3.0)
27+
x = make_white_noise(fs*sec)
28+
29+
print(sn_rate(s, x))

skotsugi/chapter01/q07.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import numpy as np
2+
from q02 import make_sin_wave
3+
from q04 import make_white_noise
4+
from q06 import square_mean, sn_rate
5+
6+
def add_noise_to_signal(signal, snr):
7+
s_power = square_mean(signal)
8+
9+
snr_linear = 10.0 ** (snr / 10.0)
10+
n_power = s_power / snr_linear
11+
12+
noise = np.sqrt(n_power) * make_white_noise(len(signal))
13+
noisy_signal = signal + noise
14+
15+
return noisy_signal, noise
16+
17+
##### DEBUG #####
18+
if __name__ == "__main__":
19+
np.random.seed(0)
20+
21+
fs = 16000
22+
sec = 3.0
23+
24+
signal = make_sin_wave(1.0, 440, fs, sec)
25+
noisy_signal, noise = add_noise_to_signal(signal, 20)
26+
27+
print(sn_rate(signal, noise))

skotsugi/chapter01/q08.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import numpy as np
2+
import soundfile as sf
3+
from q02 import make_sin_wave
4+
from q07 import add_noise_to_signal
5+
6+
np.random.seed(0)
7+
8+
fs = 16000
9+
sec = 3.0
10+
11+
signal = make_sin_wave(1.0, 440, fs, sec)
12+
noisy_signal, noise = add_noise_to_signal(signal, 6)
13+
14+
sf.write("./skotsugi/chapter01/q08.wav", noisy_signal, fs)

skotsugi/chapter01/q09.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import soundfile as sf
2+
3+
signal, fs = sf.read('./skotsugi/chapter01/q08.wav')
4+
5+
down_scaled = signal[0:-1:2]
6+
7+
sf.write("./skotsugi/chapter01/q09.wav", down_scaled, 8000)

skotsugi/chapter01/q1.png

27.1 KB
Loading

skotsugi/chapter01/q10.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import numpy as np
2+
3+
def dma(x, k):
4+
y = np.zeros(len(x))
5+
for i in range(len(x) - k):
6+
y[i] = np.mean(x[i:i+k])
7+
return y
8+
9+
if __name__ == "__main__":
10+
import soundfile as sf
11+
signal, fs = sf.read('./skotsugi/chapter01/q09.wav')
12+
13+
dmaed = dma(signal, 5)
14+
15+
sf.write("./skotsugi/chapter01/q10.wav", dmaed, 8000)

skotsugi/chapter01/q4.png

22.2 KB
Loading

skotsugi/chapter01/q5.png

23.1 KB
Loading

0 commit comments

Comments
 (0)