質問編集履歴
2
ソースコードの追加
title
CHANGED
File without changes
|
body
CHANGED
@@ -10,9 +10,15 @@
|
|
10
10
|
今回こちらのサイトを参照
|
11
11
|
https://water2litter.net/rum/post/python_scipy_wavfile_write/
|
12
12
|
|
13
|
+
追加:
|
14
|
+
もう一つこちらのサイトを参考にしてもう一つbandpassのプログラムを改良して作ってみました。
|
15
|
+
http://tacky0612.hatenablog.com/entry/2017/11/28/133103
|
16
|
+
こちらの場合は、wavファイルが出力されるのですが、再生時間が0秒と書いてあり再生できない状態です。
|
17
|
+
bandpassの下にソースコードを記載しておきます。
|
18
|
+
|
13
19
|
### 該当のソースコード
|
14
20
|
|
15
|
-
```
|
21
|
+
```bandpass
|
16
22
|
import sys
|
17
23
|
import scipy.io.wavfile
|
18
24
|
from scipy.io.wavfile import write
|
@@ -64,8 +70,66 @@
|
|
64
70
|
data.flags.writeable = True
|
65
71
|
write('out.wav',rate,data2)
|
66
72
|
```
|
73
|
+
実行例: python ~.py ~.wav
|
74
|
+
###追加のソースコード
|
75
|
+
```bandpass2
|
76
|
+
import numpy as np
|
77
|
+
import sys
|
78
|
+
from scipy.fftpack import rfft,irfft,fftfreq
|
79
|
+
import wave
|
80
|
+
import matplotlib.pyplot as plt
|
67
81
|
|
82
|
+
# ファイルを読み出し
|
68
|
-
|
83
|
+
args = sys.argv
|
84
|
+
wav_filename = args[1]
|
85
|
+
wf = wave.open(wav_filename,"r")
|
86
|
+
|
87
|
+
rate = wf.getframerate()
|
88
|
+
nframes = wf.getnframes()
|
89
|
+
width = wf.getsampwidth()
|
90
|
+
|
91
|
+
amp = (2**8) ** width / 2 #???
|
92
|
+
data = wf.readframes(nframes) #frameの読み込み
|
93
|
+
wf.close()
|
94
|
+
data = np.frombuffer(data,'int16') # intに変換
|
95
|
+
data = data / amp # 振幅正規化(-1~1)
|
96
|
+
|
97
|
+
# make time axis
|
98
|
+
time = np.arange(0, nframes/rate, 1.0/rate)
|
99
|
+
|
100
|
+
fft_data = np.fft.fft(data)
|
101
|
+
freq = np.fft.fftfreq(nframes,1.0/rate)
|
102
|
+
|
103
|
+
#正規化
|
104
|
+
fft_data = fft_data/(nframes/2)
|
105
|
+
|
106
|
+
#配列fft_dataをコピー
|
107
|
+
fft_data2 = fft_data.copy()
|
108
|
+
|
109
|
+
# bandpass処理
|
110
|
+
fft_data2[(freq < 300)&(freq > -300)] = 0 #highpass
|
111
|
+
fft_data2[(freq > 3300)|(freq < -3300)] = 0 #lowpass
|
112
|
+
|
113
|
+
# 高速逆フーリエ変換(時間信号に戻す)
|
114
|
+
data2 = np.fft.ifft(fft_data2)
|
115
|
+
#data2 = np.array(data2,'int16')
|
116
|
+
|
117
|
+
# 振幅を元のスケールに戻す
|
118
|
+
data2 = np.real(data2*nframes)
|
119
|
+
|
120
|
+
###############################################
|
121
|
+
#### 画像をプロットするプログラムは長いため省略 ####
|
122
|
+
###############################################
|
123
|
+
|
124
|
+
###ファイル書き込み###
|
125
|
+
write_wave = wave.open("1.wav","wb")
|
126
|
+
write_wave.setparams(wf.getparams())
|
127
|
+
write_wave.writeframes(data2)
|
128
|
+
write_wave.close()
|
129
|
+
|
130
|
+
```
|
131
|
+
|
132
|
+
|
69
133
|
### 試したこと
|
70
134
|
|
71
135
|
サイトの通り読み込んだデータは書き込み禁止らしいので、
|
1
write('out.wav',rate,data2)に変更
title
CHANGED
File without changes
|
body
CHANGED
@@ -62,7 +62,7 @@
|
|
62
62
|
###############################################
|
63
63
|
|
64
64
|
data.flags.writeable = True
|
65
|
-
write('out.wav',rate,
|
65
|
+
write('out.wav',rate,data2)
|
66
66
|
```
|
67
67
|
|
68
68
|
実行例: python ~.py ~.wav
|