質問編集履歴

1

"(x,n,w)"の意味については解決済みですので、打消し線を引いてます。Nとspanの数値を変更しました。

2020/06/04 04:55

投稿

退会済みユーザー
test CHANGED
@@ -1 +1 @@
1
- 周波数分布の出力過程コードの意味
1
+ 周波数分布の出力過程コードKl[数値]の意味
test CHANGED
@@ -14,7 +14,9 @@
14
14
 
15
15
  ### 発生している問題
16
16
 
17
- 1. "def fourier (x, n, w):" の"(x,n,w)"の意味
17
+ ~~1. "def fourier (x, n, w):" の"(x,n,w)"の意味
18
+
19
+ ~~
18
20
 
19
21
  2. "amp = [np.sqrt(c.real ** 2 + c.imag ** 2) for c in Kl[2500]]"
20
22
 
@@ -28,17 +30,225 @@
28
30
 
29
31
  ```
30
32
 
33
+ Kl = fourier(left, N, span)
34
+
35
+ Kr = fourier(right, N, span)
36
+
37
+ freqlist = np.fft.fftfreq(N, d=1/fr) #周波数リスト
38
+
39
+ amp = [np.sqrt(c.real ** 2 + c.imag ** 2) for c in Kl[1]] #振幅スペクトル #実部と虚部を取り出すには、".real" と ".imag" を使用
40
+
41
+ plot(freqlist, amp, marker= 'o', linestyle='-') #周波数リスト、振幅スペクトル、点、線スタイル
42
+
43
+ axis([0, fr / 2 , 0, 100000])
44
+
45
+
46
+
47
+ amp = [np.sqrt(c.real ** 2 + c.imag ** 2) for c in Kr[1]]
48
+
49
+ plot(freqlist, amp, marker= 'o', linestyle='-')
50
+
51
+ ```
52
+
53
+ ValueError Traceback (most recent call last)
54
+
55
+ <ipython-input-30-de4a7fd136d4> in <module>
56
+
57
+ ----> 1 Kl = fourier(left, N, span)
58
+
59
+ 2 Kr = fourier(right, N, span)
60
+
61
+ 3 freqlist = np.fft.fftfreq(N, d=1/fr) #周波数リスト
62
+
63
+ 4 amp = [np.sqrt(c.real ** 2 + c.imag ** 2) for c in Kl[1]] #振幅スペクトル #実部と虚部を取り出すには、".real" と ".imag" を使用
64
+
65
+ 5 plot(freqlist, amp, marker= 'o', linestyle='-') #周波数リスト、振幅スペクトル、点、線スタイル
66
+
67
+
68
+
69
+ <ipython-input-27-ad18b91aff2f> in fourier(x, n, w)
70
+
71
+ 4 for i in range(0, w-2): #2番目おきに要素を得ているため、0~N-2範囲となる
72
+
73
+ 5 sample = x[i * n:( i + 1) * n] #i~(i+1)番目の要素を得る
74
+
75
+ ----> 6 partial = np.fft.fft(sample) #"sample"をフーリエ変換
76
+
77
+ 7 K.append(partial) #"K"に"partial"を追加
78
+
79
+ 8
80
+
81
+
82
+
83
+ D:\ProgramData\Anaconda3\lib\site-packages\mkl_fft\_numpy_fft.py in fft(a, n, axis, norm)
84
+
85
+ 158 """
86
+
87
+ 159 x = _float_utils.__downcast_float128_array(a)
88
+
89
+ --> 160 output = mkl_fft.fft(x, n, axis)
90
+
91
+ 161 if _unitary(norm):
92
+
93
+ 162 output *= 1 / sqrt(output.shape[axis])
94
+
95
+
96
+
97
+ mkl_fft\_pydfti.pyx in mkl_fft._pydfti.fft()
98
+
99
+
100
+
101
+ mkl_fft\_pydfti.pyx in mkl_fft._pydfti._fft1d_impl()
102
+
103
+
104
+
105
+ mkl_fft\_pydfti.pyx in mkl_fft._pydfti.__process_arguments()
106
+
107
+
108
+
109
+ ValueError: Dimension n should be a positive integer not larger than the shape of the array along the chosen axis
110
+
111
+
112
+
113
+ ### 該当のソースコード
114
+
115
+ 現在進んでいる状態です。
116
+
117
+ ```ここに言語名を入力
118
+
119
+ **第一工程**
120
+
121
+ import wave
122
+
123
+ import struct
124
+
125
+ from scipy import fromstring, int32
126
+
127
+ import numpy as np
128
+
129
+ from pylab import *
130
+
131
+ %matplotlib inline
132
+
133
+
134
+
135
+ wavfile = '440Hz.wav' #サンプルwavファイル
136
+
137
+ wr = wave.open(wavfile, "rb")
138
+
139
+ ch = wr.getnchannels() # モノラルなら1,ステレオなら2
140
+
141
+ width = wr.getsampwidth() # バイト数 (1byte=8bit)
142
+
143
+ fr = wr.getframerate() #サンプリンググレート(サンプリング周波数)
144
+
145
+ fn = wr.getnframes() # 総フレーム数(データ分割数)⇒サンプリング周波数で割れば時間
146
+
147
+
148
+
149
+ #wavfileから(N*span)のデータを先頭から切り出す「先頭から"N"個ずつ、"span"回フーリエ変換」
150
+
151
+ #連続的なデータを離散的に表すためには、データの成分は"fr"の1/2未満(ナイキスト周波数)でなければならない。
152
+
153
+ #高速フーリエ変換 ( FFT ) は、一度に変換するサンプル数が"2**n"になっていると、最も効率がいい
154
+
155
+ N = 22050 #サンプリングレート"fr"の半分の値
156
+
157
+ span =220500 #Nの整数倍 #周波数分解能:分解できる周波数の細かさ
158
+
159
+
160
+
161
+ print('チャンネル', ch)
162
+
163
+ print('バイト数', width)
164
+
165
+ print('サンプリンググレート', fr)
166
+
167
+ print('総フレーム数', fn)
168
+
169
+ print('サンプル時間', 1.0 * N * span / fr, '秒')
170
+
171
+
172
+
173
+ origin = wr.readframes(wr.getnframes()) #メソッドreadframes(n)でnフレーム分のデータを読み込む、ここでは総フレーム数分の読み込み
174
+
175
+ data = origin[:N * span * ch * width] #"origin"から要素の範囲[ ]を指定
176
+
177
+ wr.close()
178
+
179
+
180
+
181
+ print('現配列長', len(origin)) #"origin"の要素数
182
+
183
+ print('サンプル配列長: ', len(data)) #"data"の要素数
184
+
185
+ ```
186
+
187
+ チャンネル 1
188
+
189
+ バイト数 2
190
+
191
+ サンプリンググレート 44100
192
+
193
+ 総フレーム数 441000
194
+
195
+ サンプル時間 110250.0 秒
196
+
197
+ 現配列長 882000
198
+
199
+ サンプル配列長: 882000
200
+
201
+
202
+
203
+ ```
204
+
205
+ **第二工程**
206
+
207
+ X = np.frombuffer(data, dtype="int16")#"data"をバイナリ表記から16bitsの整数数列に変換
208
+
209
+
210
+
211
+ # ステレオ前提、左右音に分ける ※モノラルは単に1つおきにデータを読みこむため、必要ない工程
212
+
213
+ left = X[::2] #"0から2番目おき"に要素を得る
214
+
215
+ right = X[1::2] #"1から2番目おき"に要素を得る
216
+
217
+
218
+
219
+ print(X)
220
+
221
+ print(left)
222
+
223
+ print(right)
224
+
225
+ ```
226
+
227
+ [ 0 2052 4097 ... -6126 -4097 -2052]
228
+
229
+ [ 0 4097 8130 ... -12036 -8130 -4097]
230
+
231
+ [ 2052 6126 10103 ... -10103 -6126 -2052]
232
+
233
+
234
+
235
+ ```
236
+
237
+ **第三工程**
238
+
239
+ #各サンプル区間ごとの周波数分布を配列で返してきます
240
+
31
241
  def fourier (x, n, w):
32
242
 
33
243
  K = []
34
244
 
35
- for i in range(0, w-2):
245
+ for i in range(0, w-2): #2番目おきに要素を得ているため、0~N-2範囲となる
36
-
246
+
37
- sample = x[i * n:( i + 1) * n]
247
+ sample = x[i * n:( i + 1) * n] #i~(i+1)番目の要素を得る
38
-
248
+
39
- partial = np.fft.fft(sample)
249
+ partial = np.fft.fft(sample) #"sample"をフーリエ変換
40
-
250
+
41
- K.append(partial)
251
+ K.append(partial) #"K"に"partial"を追加
42
252
 
43
253
 
44
254
 
@@ -46,15 +256,17 @@
46
256
 
47
257
 
48
258
 
259
+ #周波数分布をもとに、実空間での波形を生成しています
260
+
49
261
  def inverse_fourier (k):
50
262
 
51
263
  ret = []
52
264
 
53
265
  for sample in k:
54
266
 
55
- inv = np.fft.ifft(sample)
267
+ inv = np.fft.ifft(sample) #"sample"を逆フーリエ変換
56
-
268
+
57
- ret.extend(inv.real)
269
+ ret.extend(inv.real) #"inv.real"を"ret"に追加
58
270
 
59
271
 
60
272
 
@@ -64,146 +276,6 @@
64
276
 
65
277
  ```
66
278
 
67
- ```
68
-
69
- Kl = fourier(left, N, span)
70
-
71
- Kr = fourier(right, N, span)
72
-
73
- freqlist = np.fft.fftfreq(N, d=1/fr)
74
-
75
- amp = [np.sqrt(c.real ** 2 + c.imag ** 2) for c in Kl[2500]]
76
-
77
- plot(freqlist, amp, marker= 'o', linestyle='-')
78
-
79
- axis([0, fr / 2 , 0, 100000])
80
-
81
-
82
-
83
- amp = [np.sqrt(c.real ** 2 + c.imag ** 2) for c in Kr[2500]]
84
-
85
- plot(freqlist, amp, marker= 'o', linestyle='-')
86
-
87
-
88
-
89
- ```
90
-
91
- ### 該当のソースコード
92
-
93
- 現在進んでいる状態です。
94
-
95
- ```ここに言語名を入力
96
-
97
- **第一工程**
98
-
99
- import wave
100
-
101
- import struct
102
-
103
- from scipy import fromstring, int32
104
-
105
- import numpy as np
106
-
107
- from pylab import *
108
-
109
- %matplotlib inline
110
-
111
-
112
-
113
- wavfile = '440Hz.wav' #サンプルwavファイル
114
-
115
- wr = wave.open(wavfile, "rb")
116
-
117
- ch = wr.getnchannels() # モノラルなら1,ステレオなら2
118
-
119
- width = wr.getsampwidth() # バイト数 (1byte=8bit)
120
-
121
- fr = wr.getframerate() #サンプリンググレート(サンプリング周波数)
122
-
123
- fn = wr.getnframes() # 総フレーム数(データ分割数)⇒サンプリング周波数で割れば時間
124
-
125
-
126
-
127
- #wavfileから(N*span)のデータを先頭から切り出す
128
-
129
- #連続的なデータを離散的に表すためには、データの成分は"fr"の1/2未満(ナイキスト周波数)でなければならない。
130
-
131
- N = 22050 #サンプリングレート"fr"の半分の値
132
-
133
- span = 4 #4で固定 #周波数分解能:分解できる周波数の細かさ
134
-
135
-
136
-
137
- print('チャンネル', ch)
138
-
139
- print('バイト数', width)
140
-
141
- print('サンプリンググレート', fr)
142
-
143
- print('総フレーム数', fn)
144
-
145
- print('サンプル時間', 1.0 * N * span / fr, '秒')
146
-
147
-
148
-
149
- origin = wr.readframes(wr.getnframes()) #メソッドreadframes(n)でnフレーム分のデータを読み込む、ここでは総フレーム数分の読み込み
150
-
151
- data = origin[:N * span * ch * width] #"origin"から要素の範囲[ ]を指定
152
-
153
- wr.close()
154
-
155
-
156
-
157
- print('現配列長', len(origin)) #"origin"の要素数
158
-
159
- print('サンプル配列長: ', len(data)) #"data"の要素数
160
-
161
- ```
162
-
163
- チャンネル 1
164
-
165
- バイト数 2
166
-
167
- サンプリンググレート 44100
168
-
169
- 総フレーム数 441000
170
-
171
- サンプル時間 2.0 秒
172
-
173
- 現配列長 882000
174
-
175
- サンプル配列長: 176400
176
-
177
- ```
178
-
179
- **第二工程**
180
-
181
- X = np.frombuffer(data, dtype="int16")#"data"をバイナリ表記から16bitsの整数数列に変換
182
-
183
-
184
-
185
- # ステレオ前提、左右音に分ける ※モノラルは単に1つおきにデータを読みこむため、必要ない工程
186
-
187
- left = X[::2] #"0から2番目おき"に要素を得る
188
-
189
- right = X[1::2] #"1から2番目おき"に要素を得る
190
-
191
-
192
-
193
- print(X)
194
-
195
- print(left)
196
-
197
- print(right)
198
-
199
- ```
200
-
201
- [ 0 2052 4097 ... -6126 -4097 -2052]
202
-
203
- [ 0 4097 8130 ... -12036 -8130 -4097]
204
-
205
- [ 2052 6126 10103 ... -10103 -6126 -2052]
206
-
207
279
 
208
280
 
209
281
  ### 試したこと