Skip to content

Commit

Permalink
Merge pull request #6 from woodnx/skotsugi/chapter01
Browse files Browse the repository at this point in the history
Skotsugi add chapter01
  • Loading branch information
taishi-n authored May 20, 2024
2 parents 4d6d1fe + 7f1b48e commit 47f89fe
Show file tree
Hide file tree
Showing 13 changed files with 179 additions and 0 deletions.
19 changes: 19 additions & 0 deletions skotsugi/chapter01/q01.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import numpy as np
import matplotlib.pyplot as plt

A = 1.0 # 振幅
f0 = 440 # 周波数[Hz]
sec = 3.0 # 信号の長さ[s]
fs = 16000 # サンプリング周波数[Hz]
PI = np.pi # 円周率

n = np.arange(0, fs*sec) / fs # 間隔(公差)を指定(start: 0, stop: sec, step: 1/sf)
y = A * np.sin(2 * PI * f0 * n)

plt.plot(n, y)

plt.xlim(0, 1 / f0)
plt.xlabel("time [sec]")
plt.ylabel("Amplitude")

plt.savefig("./skotsugi/chapter01/q1.png")
13 changes: 13 additions & 0 deletions skotsugi/chapter01/q02.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import numpy as np
import soundfile as sf

def make_sin_wave(A, f, fs, sec):
n = np.arange(0, fs*sec) / fs
return A * np.sin(2 * np.pi * f * n)

if __name__ == "__main__":
fs = 16000 # サンプリング周波数[Hz]

y = make_sin_wave(1.0, 440, fs, 3.0)

sf.write("./skotsugi/chapter01/q02.wav", y, fs)
12 changes: 12 additions & 0 deletions skotsugi/chapter01/q03.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import numpy as np
import soundfile as sf
from q02 import make_sin_wave

fs = 16000 # サンプリング周波数[Hz]
sec = 3.0

y = np.zeros((int(fs*sec), 2), dtype=float)
y[:,0] = make_sin_wave(1.0, 440, fs, sec)
y[:,1] = make_sin_wave(1.0, 660, fs, sec)

sf.write("./skotsugi/chapter01/q03.wav", y, fs)
22 changes: 22 additions & 0 deletions skotsugi/chapter01/q04.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import numpy as np
import matplotlib.pyplot as plt

def make_white_noise(length):
return np.random.normal(size=int(length))

if __name__ == "__main__":
np.random.seed(0)

fs = 16000 # サンプリング周波数[Hz]
sec = 3.0

y = make_white_noise(fs*sec)
n = np.arange(0, 3.0, 1/fs)

plt.plot(n, y)

plt.xlim(0)
plt.xlabel("time [sec]")
plt.ylabel("Amplitude")

plt.savefig("./skotsugi/chapter01/q4.png")
21 changes: 21 additions & 0 deletions skotsugi/chapter01/q05.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import numpy as np
import matplotlib.pyplot as plt
from q02 import make_sin_wave
from q04 import make_white_noise

np.random.seed(0)

fs = 16000 # サンプリング周波数[Hz]
sec = 3.0

y = make_white_noise(fs*sec) + make_sin_wave(1.0, 440, fs, 3.0)

n = np.arange(0, 3.0, 1/fs)

plt.plot(n, y)

plt.xlim(0)
plt.xlabel("time [sec]")
plt.ylabel("Amplitude")

plt.savefig("./skotsugi/chapter01/q5.png")
29 changes: 29 additions & 0 deletions skotsugi/chapter01/q06.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import math
import numpy as np
from q02 import make_sin_wave
from q04 import make_white_noise

def square_mean(x):
# return np.sum(x ** 2) # <- これだとうまくいかなかった
return np.mean(x ** 2)

def sn_rate(s, x):
if (len(s) != len(x)):
return

s_sum = square_mean(s)
x_sum = square_mean(x)

return 10 * math.log10(s_sum / x_sum)

##### DEBUG #####
if __name__ == "__main__":
np.random.seed(0)

fs = 16000
sec = 3.0

s = make_sin_wave(1.0, 440, fs, 3.0)
x = make_white_noise(fs*sec)

print(sn_rate(s, x))
27 changes: 27 additions & 0 deletions skotsugi/chapter01/q07.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import numpy as np
from q02 import make_sin_wave
from q04 import make_white_noise
from q06 import square_mean, sn_rate

def add_noise_to_signal(signal, snr):
s_power = square_mean(signal)

snr_linear = 10.0 ** (snr / 10.0)
n_power = s_power / snr_linear

noise = np.sqrt(n_power) * make_white_noise(len(signal))
noisy_signal = signal + noise

return noisy_signal, noise

##### DEBUG #####
if __name__ == "__main__":
np.random.seed(0)

fs = 16000
sec = 3.0

signal = make_sin_wave(1.0, 440, fs, sec)
noisy_signal, noise = add_noise_to_signal(signal, 20)

print(sn_rate(signal, noise))
14 changes: 14 additions & 0 deletions skotsugi/chapter01/q08.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import numpy as np
import soundfile as sf
from q02 import make_sin_wave
from q07 import add_noise_to_signal

np.random.seed(0)

fs = 16000
sec = 3.0

signal = make_sin_wave(1.0, 440, fs, sec)
noisy_signal, noise = add_noise_to_signal(signal, 6)

sf.write("./skotsugi/chapter01/q08.wav", noisy_signal, fs)
7 changes: 7 additions & 0 deletions skotsugi/chapter01/q09.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import soundfile as sf

signal, fs = sf.read('./skotsugi/chapter01/q08.wav')

down_scaled = signal[0:-1:2]

sf.write("./skotsugi/chapter01/q09.wav", down_scaled, 8000)
Binary file added skotsugi/chapter01/q1.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
15 changes: 15 additions & 0 deletions skotsugi/chapter01/q10.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import numpy as np

def dma(x, k):
y = np.zeros(len(x))
for i in range(len(x) - k):
y[i] = np.mean(x[i:i+k])
return y

if __name__ == "__main__":
import soundfile as sf
signal, fs = sf.read('./skotsugi/chapter01/q09.wav')

dmaed = dma(signal, 5)

sf.write("./skotsugi/chapter01/q10.wav", dmaed, 8000)
Binary file added skotsugi/chapter01/q4.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added skotsugi/chapter01/q5.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit 47f89fe

Please sign in to comment.