-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathboin.py
113 lines (95 loc) · 5.77 KB
/
boin.py
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
import numpy as np
from scipy import signal
from scipy import fftpack
from scipy.fftpack import fft
import librosa
from scipy.io.wavfile import write
import noisecancel
#バターワースフィルタ(バンドストップ)
def bandstop(x, samplerate, fp, fs, gpass, gstop):
fn = samplerate / 2 #ナイキスト周波数
wp = fp / fn #ナイキスト周波数で通過域端周波数を正規化
ws = fs / fn #ナイキスト周波数で阻止域端周波数を正規化
N, Wn = signal.buttord(wp, ws, gpass, gstop) #オーダーとバターワースの正規化周波数を計算
b, a = signal.butter(N, Wn, "bandstop") #フィルタ伝達関数の分子と分母を計算
y = signal.filtfilt(b, a, x) #信号に対してフィルタをかける
return y #フィルタ後の信号を返す
def wav_read(path): # 音声ファイルを読み込む
wave, fs = librosa.core.load(path, mono=True)
return wave, fs
def calc_fft(data, fs): # FFTする
frq = np.linspace(0, fs, len(data))
yf = fft(data)/(len(data)/2)
return np.abs(yf), frq
#バターワースフィルタ(バンドパス)
def bandpass(x, samplerate, fp, fs, gpass, gstop):
fn = samplerate / 2 #ナイキスト周波数
wp = fp / fn #ナイキスト周波数で通過域端周波数を正規化
ws = fs / fn #ナイキスト周波数で阻止域端周波数を正規化
N, Wn = signal.buttord(wp, ws, gpass, gstop) #オーダーとバターワースの正規化周波数を計算
b, a = signal.butter(N, Wn, "band") #フィルタ伝達関数の分子と分母を計算
y = signal.filtfilt(b, a, x) #信号に対してフィルタをかける
return y #フィルタ後の信号を返す
def boinband(wavpath,filename):
# ここからサンプル波形生成とフィルタ処理をする-------------------------------------------
samplerate = 48000
q = 48000/22050
problem = wavpath.replace('./processing/'+ filename + "/", '')
data,f= wav_read(wavpath + ".wav")
# 波形生成のための時間軸の作成
start = [424.55236449742387, 500]
end = [ 468.55836523848967, 1700]
dif = 50 #幅
plusband = 10 #start,endにプラスする量
data_filt = [0]*len(end)
# バンドパスをする関数を実行
fp = np.array([(plusband + start[0])*q ,q*(plusband + end[0])]) # 通過域端周波数[Hz]※ベクトル
fs = np.array([(start[0]-dif-plusband)*q,(end[0]+dif+plusband)*q]) # 阻止域端周波数[Hz]※ベクトル
gpass = 5
gstop = 6
data_filt[0] = bandpass(data, samplerate, fp, fs, gpass, gstop)
data_filt[0] = data_filt[0].astype(np.float32)
for j in range(1,len(end)):
fp = np.array([(plusband + start[j])*q ,q*(plusband + end[j])]) # 通過域端周波数[Hz]※ベクトル
fs = np.array([(start[j]-dif+plusband)*q,(end[j]+dif+plusband)*q]) # 阻止域端周波数[Hz]※ベクトル
gpass = 5
gstop = 6
data_filt[j] = bandpass(data, samplerate, fp, fs, gpass, gstop)
data_filt[j] = data_filt[j].astype(np.float32)
data_filt[j] += data_filt[j-1]
name = "processing/" + filename + "/n"+ problem +"band"
write(name + ".wav",rate = f, data=data_filt[len(end)-1])
noisecancel.noise_cancel(wavpath,name)
start = [300]
end = [1700]
dif = 49
plusband = 12
j=0
# バンドパスをする関数を実行
fp = np.array([(plusband + start[j])*q ,q*(plusband + end[j])]) # 通過域端周波数[Hz]※ベクトル
fs = np.array([(start[j]-dif+plusband)*q,(end[j]+dif+plusband)*q]) # 阻止域端周波数[Hz]※ベクトル
gpass = 5 # 通過域端最大損失[dB]
gstop = 6 # 阻止域端最小損失[dB]
data_filt = bandpass(data, samplerate, fp, fs, gpass, gstop)
data_filt = data_filt.astype(np.float32)
data_filt *=5
name = "processing/" + filename + "/i"+ problem +"band"
write(name + ".wav",rate = f, data=data_filt)
noisecancel.noise_cancel(wavpath,name)
fp = np.array([500, 1500]) #通過域端周波数[Hz]※ベクトル
fs = np.array([250, 6000]) #阻止域端周波数[Hz]※ベクトル gpass = 3 # 通過域端最大損失[dB]
gstop = 40 # 阻止域端最小損失[dB]
data_filt = bandstop(data, samplerate, fp, fs, gpass, gstop)
data_filt = data_filt.astype(np.float32)
name = "processing/" + filename + "/e"+ problem +"band"
write(name + ".wav",rate = f, data=data_filt)
noisecancel.noise_cancel(wavpath,name)
fp = np.array([500, 2000]) #通過域端周波数[Hz]※ベクトル
fs = np.array([250, 4000]) #阻止域端周波数[Hz]※ベクトル
gpass = 1 # 通過域端最大損失[dB]
gstop = 41 # 阻止域端最小損失[dB]
data_filt = bandstop(data, samplerate, fp, fs, gpass, gstop)
data_filt = data_filt.astype(np.float32)
name = "processing/" + filename + "/a"+ problem +"band"
write(name + ".wav",rate = f, data=data_filt)
noisecancel.noise_cancel(wavpath,name)