質問編集履歴
1
"(x,n,w)"の意味については解決済みですので、打消し線を引いてます。Nとspanの数値を変更しました。
title
CHANGED
@@ -1,1 +1,1 @@
|
|
1
|
-
周波数分布の出力過程コードの意味
|
1
|
+
周波数分布の出力過程コードKl[数値]の意味
|
body
CHANGED
@@ -6,43 +6,54 @@
|
|
6
6
|
意味が分かれば進められるかと思われますので、ご教授願います。
|
7
7
|
|
8
8
|
### 発生している問題
|
9
|
-
1. "def fourier (x, n, w):" の"(x,n,w)"の意味
|
9
|
+
~~1. "def fourier (x, n, w):" の"(x,n,w)"の意味
|
10
|
+
~~
|
10
11
|
2. "amp = [np.sqrt(c.real ** 2 + c.imag ** 2) for c in Kl[2500]]"
|
11
12
|
"amp = [np.sqrt(c.real ** 2 + c.imag ** 2) for c in Kr[2500]]"
|
12
13
|
のkl[],kr[]内の数値"2500"の意味
|
13
14
|
|
14
15
|
|
15
16
|
```
|
16
|
-
def fourier (x, n, w):
|
17
|
-
K = []
|
18
|
-
for i in range(0, w-2):
|
19
|
-
sample = x[i * n:( i + 1) * n]
|
20
|
-
partial = np.fft.fft(sample)
|
21
|
-
K.append(partial)
|
22
|
-
|
23
|
-
return K
|
24
|
-
|
25
|
-
def inverse_fourier (k):
|
26
|
-
ret = []
|
27
|
-
for sample in k:
|
28
|
-
inv = np.fft.ifft(sample)
|
29
|
-
ret.extend(inv.real)
|
30
|
-
|
31
|
-
print (len(sample))
|
32
|
-
return ret
|
33
|
-
```
|
34
|
-
```
|
35
17
|
Kl = fourier(left, N, span)
|
36
18
|
Kr = fourier(right, N, span)
|
37
|
-
freqlist = np.fft.fftfreq(N, d=1/fr)
|
19
|
+
freqlist = np.fft.fftfreq(N, d=1/fr) #周波数リスト
|
38
|
-
amp = [np.sqrt(c.real ** 2 + c.imag ** 2) for c in Kl[
|
20
|
+
amp = [np.sqrt(c.real ** 2 + c.imag ** 2) for c in Kl[1]] #振幅スペクトル #実部と虚部を取り出すには、".real" と ".imag" を使用
|
39
|
-
plot(freqlist, amp, marker= 'o', linestyle='-')
|
21
|
+
plot(freqlist, amp, marker= 'o', linestyle='-') #周波数リスト、振幅スペクトル、点、線スタイル
|
40
22
|
axis([0, fr / 2 , 0, 100000])
|
41
23
|
|
42
|
-
amp = [np.sqrt(c.real ** 2 + c.imag ** 2) for c in Kr[
|
24
|
+
amp = [np.sqrt(c.real ** 2 + c.imag ** 2) for c in Kr[1]]
|
43
25
|
plot(freqlist, amp, marker= 'o', linestyle='-')
|
26
|
+
```
|
27
|
+
ValueError Traceback (most recent call last)
|
28
|
+
<ipython-input-30-de4a7fd136d4> in <module>
|
29
|
+
----> 1 Kl = fourier(left, N, span)
|
30
|
+
2 Kr = fourier(right, N, span)
|
31
|
+
3 freqlist = np.fft.fftfreq(N, d=1/fr) #周波数リスト
|
32
|
+
4 amp = [np.sqrt(c.real ** 2 + c.imag ** 2) for c in Kl[1]] #振幅スペクトル #実部と虚部を取り出すには、".real" と ".imag" を使用
|
33
|
+
5 plot(freqlist, amp, marker= 'o', linestyle='-') #周波数リスト、振幅スペクトル、点、線スタイル
|
44
34
|
|
35
|
+
<ipython-input-27-ad18b91aff2f> in fourier(x, n, w)
|
36
|
+
4 for i in range(0, w-2): #2番目おきに要素を得ているため、0~N-2範囲となる
|
37
|
+
5 sample = x[i * n:( i + 1) * n] #i~(i+1)番目の要素を得る
|
38
|
+
----> 6 partial = np.fft.fft(sample) #"sample"をフーリエ変換
|
39
|
+
7 K.append(partial) #"K"に"partial"を追加
|
45
|
-
|
40
|
+
8
|
41
|
+
|
42
|
+
D:\ProgramData\Anaconda3\lib\site-packages\mkl_fft\_numpy_fft.py in fft(a, n, axis, norm)
|
43
|
+
158 """
|
44
|
+
159 x = _float_utils.__downcast_float128_array(a)
|
45
|
+
--> 160 output = mkl_fft.fft(x, n, axis)
|
46
|
+
161 if _unitary(norm):
|
47
|
+
162 output *= 1 / sqrt(output.shape[axis])
|
48
|
+
|
49
|
+
mkl_fft\_pydfti.pyx in mkl_fft._pydfti.fft()
|
50
|
+
|
51
|
+
mkl_fft\_pydfti.pyx in mkl_fft._pydfti._fft1d_impl()
|
52
|
+
|
53
|
+
mkl_fft\_pydfti.pyx in mkl_fft._pydfti.__process_arguments()
|
54
|
+
|
55
|
+
ValueError: Dimension n should be a positive integer not larger than the shape of the array along the chosen axis
|
56
|
+
|
46
57
|
### 該当のソースコード
|
47
58
|
現在進んでいる状態です。
|
48
59
|
```ここに言語名を入力
|
@@ -61,10 +72,11 @@
|
|
61
72
|
fr = wr.getframerate() #サンプリンググレート(サンプリング周波数)
|
62
73
|
fn = wr.getnframes() # 総フレーム数(データ分割数)⇒サンプリング周波数で割れば時間
|
63
74
|
|
64
|
-
#wavfileから(N*span)のデータを先頭から切り出す
|
75
|
+
#wavfileから(N*span)のデータを先頭から切り出す「先頭から"N"個ずつ、"span"回フーリエ変換」
|
65
76
|
#連続的なデータを離散的に表すためには、データの成分は"fr"の1/2未満(ナイキスト周波数)でなければならない。
|
77
|
+
#高速フーリエ変換 ( FFT ) は、一度に変換するサンプル数が"2**n"になっていると、最も効率がいい
|
66
78
|
N = 22050 #サンプリングレート"fr"の半分の値
|
67
|
-
span =
|
79
|
+
span =220500 #Nの整数倍 #周波数分解能:分解できる周波数の細かさ
|
68
80
|
|
69
81
|
print('チャンネル', ch)
|
70
82
|
print('バイト数', width)
|
@@ -83,9 +95,10 @@
|
|
83
95
|
バイト数 2
|
84
96
|
サンプリンググレート 44100
|
85
97
|
総フレーム数 441000
|
86
|
-
サンプル時間
|
98
|
+
サンプル時間 110250.0 秒
|
87
99
|
現配列長 882000
|
88
|
-
サンプル配列長:
|
100
|
+
サンプル配列長: 882000
|
101
|
+
|
89
102
|
```
|
90
103
|
**第二工程**
|
91
104
|
X = np.frombuffer(data, dtype="int16")#"data"をバイナリ表記から16bitsの整数数列に変換
|
@@ -102,6 +115,29 @@
|
|
102
115
|
[ 0 4097 8130 ... -12036 -8130 -4097]
|
103
116
|
[ 2052 6126 10103 ... -10103 -6126 -2052]
|
104
117
|
|
118
|
+
```
|
119
|
+
**第三工程**
|
120
|
+
#各サンプル区間ごとの周波数分布を配列で返してきます
|
121
|
+
def fourier (x, n, w):
|
122
|
+
K = []
|
123
|
+
for i in range(0, w-2): #2番目おきに要素を得ているため、0~N-2範囲となる
|
124
|
+
sample = x[i * n:( i + 1) * n] #i~(i+1)番目の要素を得る
|
125
|
+
partial = np.fft.fft(sample) #"sample"をフーリエ変換
|
126
|
+
K.append(partial) #"K"に"partial"を追加
|
127
|
+
|
128
|
+
return K
|
129
|
+
|
130
|
+
#周波数分布をもとに、実空間での波形を生成しています
|
131
|
+
def inverse_fourier (k):
|
132
|
+
ret = []
|
133
|
+
for sample in k:
|
134
|
+
inv = np.fft.ifft(sample) #"sample"を逆フーリエ変換
|
135
|
+
ret.extend(inv.real) #"inv.real"を"ret"に追加
|
136
|
+
|
137
|
+
print (len(sample))
|
138
|
+
return ret
|
139
|
+
```
|
140
|
+
|
105
141
|
### 試したこと
|
106
142
|
|
107
143
|
wavファイルはモノラルですが、フーリエ変換の理解のため、まずは参照ページの通りに実行してみました。
|