teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

2

ソースコードの追加

2020/12/24 03:55

投稿

iface
iface

スコア42

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
- 実行例: python ~.py ~.wav
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)に変更

2020/12/24 03:55

投稿

iface
iface

スコア42

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,data)
65
+ write('out.wav',rate,data2)
66
66
  ```
67
67
 
68
68
  実行例: python ~.py ~.wav