質問編集履歴

4

コード表示に変更

2017/09/28 02:26

投稿

atena
atena

スコア20

test CHANGED
File without changes
test CHANGED
@@ -34,6 +34,10 @@
34
34
 
35
35
  ###該当のソースコード
36
36
 
37
+ ```ここに言語を入力
38
+
39
+ #coding:utf-8
40
+
37
41
  import wave
38
42
 
39
43
  import numpy as np
@@ -84,41 +88,41 @@
84
88
 
85
89
  """メルフィルタバンクを作成"""
86
90
 
87
-
91
+ # ナイキスト周波数(Hz)
88
92
 
89
93
  fmax = fs / 2
90
94
 
91
-
95
+ # ナイキスト周波数(mel)
92
96
 
93
97
  melmax = hz2mel(fmax)
94
98
 
95
-
99
+ # 周波数インデックスの最大数
96
100
 
97
101
  nmax = nfft / 2
98
102
 
99
-
103
+ # 周波数解像度(周波数インデックス1あたりのHz幅)
100
104
 
101
105
  df = fs / nfft
102
106
 
103
-
107
+ # メル尺度における各フィルタの中心周波数を求める
104
108
 
105
109
  dmel = melmax / (numChannels + 1)
106
110
 
107
111
  melcenters = np.arange(1, numChannels + 1) * dmel
108
112
 
109
-
113
+ # 各フィルタの中心周波数をHzに変換
110
114
 
111
115
  fcenters = mel2hz(melcenters)
112
116
 
113
-
117
+ # 各フィルタの中心周波数を周波数インデックスに変換
114
118
 
115
119
  indexcenter = np.round(fcenters / df)
116
120
 
117
-
121
+ # 各フィルタの開始位置のインデックス
118
122
 
119
123
  indexstart = np.hstack(([0], indexcenter[0:numChannels - 1]))
120
124
 
121
-
125
+ # 各フィルタの終了位置のインデックス
122
126
 
123
127
  indexstop = np.hstack((indexcenter[1:numChannels], [nmax]))
124
128
 
@@ -128,15 +132,15 @@
128
132
 
129
133
  for c in np.arange(0, numChannels):
130
134
 
131
-
135
+ # 三角フィルタの左の直線の傾きから点を求める
132
136
 
133
137
  increment= 1.0 / (indexcenter[c] - indexstart[c])
134
138
 
135
139
  for i in np.arange(indexstart[c], indexcenter[c]):
136
140
 
137
- filterbank[c, i] = (i - indexstart[c])*increment
141
+ filterbank[c, i] = int((i - indexstart[c])*increment)
142
+
138
-
143
+ # 三角フィルタの右の直線の傾きから点を求める
139
-
140
144
 
141
145
  decrement = 1.0 / (indexstop[c] - indexcenter[c])
142
146
 
@@ -154,7 +158,7 @@
154
158
 
155
159
  """プリエンファシスフィルタ"""
156
160
 
157
-
161
+ # 係数 (1.0, -p) のFIRフィルタを作成
158
162
 
159
163
  return scipy.signal.lfilter([1.0, -p], 1, signal)
160
164
 
@@ -170,7 +174,7 @@
170
174
 
171
175
  nceps : MFCCの次元"""
172
176
 
173
-
177
+ # プリエンファシスフィルタをかける
174
178
 
175
179
  p = 0.97 # プリエンファシス係数
176
180
 
@@ -178,7 +182,7 @@
178
182
 
179
183
 
180
184
 
181
-
185
+ # ハミング窓をかける
182
186
 
183
187
  hammingWindow = np.hamming(len(signal))
184
188
 
@@ -186,53 +190,97 @@
186
190
 
187
191
 
188
192
 
189
-
193
+ # 振幅スペクトルを求める
190
194
 
191
195
  spec = np.abs(np.fft.fft(signal, nfft))[:nfft/2]
192
196
 
193
197
  fscale = np.fft.fftfreq(nfft, d = 1.0 / fs)[:nfft/2]
194
198
 
195
-
199
+ # plot(fscale, spec)
200
+
196
-
201
+ # xlabel("frequency [Hz]")
202
+
197
-
203
+ # ylabel("amplitude spectrum")
204
+
198
-
205
+ # savefig("spectrum.png")
206
+
199
-
207
+ # show()
208
+
209
+
210
+
200
-
211
+ # メルフィルタバンクを作成
212
+
201
- numChannels = 20
213
+ numChannels = 20 # メルフィルタバンクのチャネル数
202
-
214
+
203
- df = fs / nfft
215
+ df = fs / nfft # 周波数解像度(周波数インデックス1あたりのHz幅)
204
216
 
205
217
  filterbank, fcenters = melFilterBank(fs, nfft, numChannels)
206
218
 
207
-
219
+ # for c in np.arange(0, numChannels):
220
+
208
-
221
+ # plot(np.arange(0, nfft / 2) * df, filterbank[c])
222
+
209
-
223
+ # savefig("melfilterbank.png")
224
+
210
-
225
+ # show()
226
+
227
+
228
+
211
-
229
+ # 定義通りに書いた場合
230
+
212
-
231
+ # 振幅スペクトルに対してフィルタバンクの各フィルタをかけ、振幅の和の対数をとる
232
+
213
-
233
+ # mspec = []
234
+
214
-
235
+ # for c in np.arange(0, numChannels):
236
+
215
-
237
+ # mspec.append(np.log10(sum(spec * filterbank[c])))
238
+
216
-
239
+ # mspec = np.array(mspec)
240
+
241
+
242
+
217
-
243
+ # 行列で書くと簡単になる!
244
+
245
+ # 振幅スペクトルにメルフィルタバンクを適用
218
246
 
219
247
  mspec = np.log10(np.dot(spec, filterbank.T))
220
248
 
221
249
 
222
250
 
223
-
251
+ # 元の振幅スペクトルとフィルタバンクをかけて圧縮したスペクトルを表示
252
+
224
-
253
+ # subplot(211)
254
+
225
-
255
+ # plot(fscale, np.log10(spec))
256
+
226
-
257
+ # xlabel("frequency")
258
+
227
-
259
+ # xlim(0, 25000)
260
+
228
-
261
+ #
262
+
229
-
263
+ # subplot(212)
264
+
265
+ # plot(fcenters, mspec, "o-")
266
+
267
+ # xlabel("frequency")
268
+
269
+ # xlim(0, 25000)
270
+
271
+ # savefig("result_melfilter.png")
272
+
273
+ # show()
274
+
275
+
276
+
277
+ # 離散コサイン変換
230
278
 
231
279
  ceps = scipy.fftpack.realtransforms.dct(mspec, type=2, norm="ortho", axis=-1)
232
280
 
233
281
 
234
282
 
235
-
283
+ # 低次成分からnceps個の係数を返す
236
284
 
237
285
  return ceps[:nceps]
238
286
 
@@ -240,7 +288,7 @@
240
288
 
241
289
  if __name__ == "__main__":
242
290
 
243
-
291
+ # 音声をロード
244
292
 
245
293
  wav, fs = wavread("a_1.wav")
246
294
 
@@ -248,7 +296,7 @@
248
296
 
249
297
 
250
298
 
251
-
299
+ # 音声波形の中心部分を切り出す
252
300
 
253
301
  center = len(wav) / 2 # 中心のサンプル番号
254
302
 
@@ -266,7 +314,7 @@
266
314
 
267
315
  print "mfcc:", ceps
268
316
 
269
-
317
+ ```
270
318
 
271
319
  ###試したこと
272
320
 

3

エラー文修正

2017/09/28 02:26

投稿

atena
atena

スコア20

test CHANGED
File without changes
test CHANGED
@@ -14,7 +14,21 @@
14
14
 
15
15
  エラーメッセージ
16
16
 
17
+ Traceback (most recent call last):
18
+
19
+ File "MFCC.py", line 138, in <module>
20
+
21
+ ceps = mfcc(wavdata, nfft, fs, nceps)
22
+
23
+ File "MFCC.py", line 90, in mfcc
24
+
25
+ filterbank, fcenters = melFilterBank(fs, nfft, numChannels)
26
+
27
+ File "MFCC.py", line 52, in melFilterBank
28
+
29
+ filterbank[c, i] = int((i - indexstart[c]))*int(increment)
30
+
17
- IndeEerror: only integers, slices (':'), ellipsis ('...'), numpy.newaxis ('None') and integer or boolean arrays are valid indices
31
+ IndexError: only integers, slices (`:`), ellipsis (`...`), numpy.newaxis (`None`) and integer or boolean arrays are valid indices
18
32
 
19
33
 
20
34
 
@@ -258,6 +272,8 @@
258
272
 
259
273
  52行目をint()でキャストしてみましたができませんでした.
260
274
 
275
+ filterbank[c, i] = int((i - indexstart[c])*increment)
276
+
261
277
 
262
278
 
263
279
  ###補足情報(言語/FW/ツール等のバージョンなど)
@@ -266,4 +282,4 @@
266
282
 
267
283
  python27
268
284
 
269
- ド詳細:http://aidiary.hatenablog.com/entry/20120225/1330179868
285
+ ス元:http://aidiary.hatenablog.com/entry/20120225/1330179868

2

詳細設定

2017/09/28 01:58

投稿

atena
atena

スコア20

test CHANGED
File without changes
test CHANGED
@@ -265,3 +265,5 @@
265
265
  windows7 32bit
266
266
 
267
267
  python27
268
+
269
+ コード詳細:http://aidiary.hatenablog.com/entry/20120225/1330179868

1

コードの修正

2017/09/28 01:53

投稿

atena
atena

スコア20

test CHANGED
File without changes
test CHANGED
@@ -20,8 +20,6 @@
20
20
 
21
21
  ###該当のソースコード
22
22
 
23
- #coding:utf-8
24
-
25
23
  import wave
26
24
 
27
25
  import numpy as np
@@ -72,41 +70,41 @@
72
70
 
73
71
  """メルフィルタバンクを作成"""
74
72
 
75
- # ナイキスト周波数(Hz)
73
+
76
74
 
77
75
  fmax = fs / 2
78
76
 
79
- # ナイキスト周波数(mel)
77
+
80
78
 
81
79
  melmax = hz2mel(fmax)
82
80
 
83
- # 周波数インデックスの最大数
81
+
84
82
 
85
83
  nmax = nfft / 2
86
84
 
87
- # 周波数解像度(周波数インデックス1あたりのHz幅)
85
+
88
86
 
89
87
  df = fs / nfft
90
88
 
91
- # メル尺度における各フィルタの中心周波数を求める
89
+
92
90
 
93
91
  dmel = melmax / (numChannels + 1)
94
92
 
95
93
  melcenters = np.arange(1, numChannels + 1) * dmel
96
94
 
97
- # 各フィルタの中心周波数をHzに変換
95
+
98
96
 
99
97
  fcenters = mel2hz(melcenters)
100
98
 
101
- # 各フィルタの中心周波数を周波数インデックスに変換
99
+
102
100
 
103
101
  indexcenter = np.round(fcenters / df)
104
102
 
105
- # 各フィルタの開始位置のインデックス
103
+
106
104
 
107
105
  indexstart = np.hstack(([0], indexcenter[0:numChannels - 1]))
108
106
 
109
- # 各フィルタの終了位置のインデックス
107
+
110
108
 
111
109
  indexstop = np.hstack((indexcenter[1:numChannels], [nmax]))
112
110
 
@@ -116,7 +114,7 @@
116
114
 
117
115
  for c in np.arange(0, numChannels):
118
116
 
119
- # 三角フィルタの左の直線の傾きから点を求める
117
+
120
118
 
121
119
  increment= 1.0 / (indexcenter[c] - indexstart[c])
122
120
 
@@ -124,7 +122,7 @@
124
122
 
125
123
  filterbank[c, i] = (i - indexstart[c])*increment
126
124
 
127
- # 三角フィルタの右の直線の傾きから点を求める
125
+
128
126
 
129
127
  decrement = 1.0 / (indexstop[c] - indexcenter[c])
130
128
 
@@ -142,7 +140,7 @@
142
140
 
143
141
  """プリエンファシスフィルタ"""
144
142
 
145
- # 係数 (1.0, -p) のFIRフィルタを作成
143
+
146
144
 
147
145
  return scipy.signal.lfilter([1.0, -p], 1, signal)
148
146
 
@@ -158,7 +156,7 @@
158
156
 
159
157
  nceps : MFCCの次元"""
160
158
 
161
- # プリエンファシスフィルタをかける
159
+
162
160
 
163
161
  p = 0.97 # プリエンファシス係数
164
162
 
@@ -166,7 +164,7 @@
166
164
 
167
165
 
168
166
 
169
- # ハミング窓をかける
167
+
170
168
 
171
169
  hammingWindow = np.hamming(len(signal))
172
170
 
@@ -174,97 +172,53 @@
174
172
 
175
173
 
176
174
 
177
- # 振幅スペクトルを求める
175
+
178
176
 
179
177
  spec = np.abs(np.fft.fft(signal, nfft))[:nfft/2]
180
178
 
181
179
  fscale = np.fft.fftfreq(nfft, d = 1.0 / fs)[:nfft/2]
182
180
 
183
- # plot(fscale, spec)
181
+
184
-
185
- # xlabel("frequency [Hz]")
182
+
186
-
187
- # ylabel("amplitude spectrum")
183
+
188
-
189
- # savefig("spectrum.png")
184
+
190
-
191
- # show()
185
+
192
-
193
-
194
-
195
- # メルフィルタバンクを作成
186
+
196
-
197
- numChannels = 20 # メルフィルタバンクのチャネル数
187
+ numChannels = 20
198
-
188
+
199
- df = fs / nfft # 周波数解像度(周波数インデックス1あたりのHz幅)
189
+ df = fs / nfft
200
190
 
201
191
  filterbank, fcenters = melFilterBank(fs, nfft, numChannels)
202
192
 
203
- # for c in np.arange(0, numChannels):
193
+
204
-
205
- # plot(np.arange(0, nfft / 2) * df, filterbank[c])
194
+
206
-
207
- # savefig("melfilterbank.png")
195
+
208
-
209
- # show()
196
+
210
-
211
-
212
-
213
- # 定義通りに書いた場合
197
+
214
-
215
- # 振幅スペクトルに対してフィルタバンクの各フィルタをかけ、振幅の和の対数をとる
198
+
216
-
217
- # mspec = []
199
+
218
-
219
- # for c in np.arange(0, numChannels):
200
+
220
-
221
- # mspec.append(np.log10(sum(spec * filterbank[c])))
201
+
222
-
223
- # mspec = np.array(mspec)
202
+
224
-
225
-
226
-
227
- # 行列で書くと簡単になる!
203
+
228
-
229
- # 振幅スペクトルにメルフィルタバンクを適用
230
204
 
231
205
  mspec = np.log10(np.dot(spec, filterbank.T))
232
206
 
233
207
 
234
208
 
235
- # 元の振幅スペクトルとフィルタバンクをかけて圧縮したスペクトルを表示
209
+
236
-
237
- # subplot(211)
210
+
238
-
239
- # plot(fscale, np.log10(spec))
211
+
240
-
241
- # xlabel("frequency")
212
+
242
-
243
- # xlim(0, 25000)
213
+
244
-
245
- #
214
+
246
-
247
- # subplot(212)
215
+
248
-
249
- # plot(fcenters, mspec, "o-")
250
-
251
- # xlabel("frequency")
252
-
253
- # xlim(0, 25000)
254
-
255
- # savefig("result_melfilter.png")
256
-
257
- # show()
258
-
259
-
260
-
261
- # 離散コサイン変換
262
216
 
263
217
  ceps = scipy.fftpack.realtransforms.dct(mspec, type=2, norm="ortho", axis=-1)
264
218
 
265
219
 
266
220
 
267
- # 低次成分からnceps個の係数を返す
221
+
268
222
 
269
223
  return ceps[:nceps]
270
224
 
@@ -272,7 +226,7 @@
272
226
 
273
227
  if __name__ == "__main__":
274
228
 
275
- # 音声をロード
229
+
276
230
 
277
231
  wav, fs = wavread("a_1.wav")
278
232
 
@@ -280,7 +234,7 @@
280
234
 
281
235
 
282
236
 
283
- # 音声波形の中心部分を切り出す
237
+
284
238
 
285
239
  center = len(wav) / 2 # 中心のサンプル番号
286
240