質問編集履歴
1
ソースコードが読み込めない形式になっていたので変更しました。ご指摘ありがとうございます。
title
CHANGED
File without changes
|
body
CHANGED
@@ -5,47 +5,53 @@
|
|
5
5
|
numpyのfftを使って入力ファイルをフーリエ変換し、編集後のデータをifftを使ってwavファイルに戻したいのですが、雑音だらけになってしまいます。なぜ雑音だらけになるのかが分かりません。ご指摘いただけないでしょうか。
|
6
6
|
|
7
7
|
### 該当のソースコード
|
8
|
+
```python
|
9
|
+
|
8
10
|
import wav
|
9
11
|
import numpy
|
10
12
|
|
11
|
-
|
13
|
+
freq = 500
|
14
|
+
low = 500
|
12
15
|
|
13
|
-
numch = wf.getnchannels() #チャンネル数
|
14
|
-
samplewidth = wf.getsampwidth()
|
15
|
-
|
16
|
+
wf = wave.open("sword-slash.wav", "rb")
|
16
|
-
numsamples = wf.getnframes() #フレーム数
|
17
17
|
|
18
|
+
numch = wf.getnchannels() #チャンネル数
|
19
|
+
samplewidth = wf.getsampwidth()
|
20
|
+
samplerate = wf.getframerate() #サンプリング周波数
|
18
|
-
|
21
|
+
numsamples = wf.getnframes() #フレーム数
|
19
|
-
wf.close()
|
20
22
|
|
21
|
-
//配列に格納
|
22
|
-
if samplewidth == 2:
|
23
|
-
|
23
|
+
buf = wf.readframes(wf.getnframes())
|
24
|
-
after = numpy.zeros(numsamples, dtype='int16')
|
25
|
-
|
24
|
+
wf.close()
|
26
|
-
data = numpy.frombuffer(buf, dtype='int32')
|
27
|
-
after = numpy.zeros(numsamples, dtype='int32')
|
28
25
|
|
26
|
+
//配列に格納
|
27
|
+
if samplewidth == 2:
|
28
|
+
data = numpy.frombuffer(buf, dtype='int16')
|
29
|
+
after = numpy.zeros(numsamples, dtype='int16')
|
30
|
+
if samplewidth == 4:
|
31
|
+
data = numpy.frombuffer(buf, dtype='int32')
|
32
|
+
after = numpy.zeros(numsamples, dtype='int32')
|
33
|
+
|
29
|
-
|
34
|
+
N = numsamples
|
30
|
-
|
35
|
+
start = 0
|
31
36
|
|
32
|
-
|
37
|
+
G = numpy.fft.fft(data[start:start+N])
|
33
|
-
|
38
|
+
#G = abs(G)
|
34
|
-
|
39
|
+
flist = numpy.fft.fftfreq(N, d=1/samplerate)
|
35
40
|
|
36
|
-
|
41
|
+
G_roll = numpy.roll(flist, freq) #freq = 音の高さのパラメータ(音の高さを高くしたい)
|
37
|
-
|
42
|
+
G_roll[flist > low] = 0 #ローパスのパラメータ(lowより大きい周波数は0にしたい)
|
38
43
|
|
39
|
-
|
44
|
+
after = numpy.fft.ifft(G)
|
40
45
|
|
41
|
-
|
46
|
+
ww = wave.open("sample2.wav", "wb")
|
42
|
-
|
47
|
+
ww.setnchannels(numch)
|
43
|
-
|
48
|
+
ww.setsampwidth(samplewidth)
|
44
|
-
|
49
|
+
ww.setframerate(samplerate)
|
45
|
-
|
50
|
+
ww.setnframes(numsamples)
|
46
51
|
|
47
|
-
|
52
|
+
ww.writeframes(after)
|
48
53
|
|
54
|
+
```
|
49
55
|
|
50
56
|
### 補足情報(FW/ツールのバージョンなど)
|
51
57
|
python3.6でpycharmを使って実装しています
|