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

質問編集履歴

1

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

2020/06/04 04:55

投稿

退会済みユーザー
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[2500]]
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[2500]]
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 = 4 #4で固定 #周波数分解能:分解できる周波数の細かさ
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
- サンプル時間 2.0 秒
98
+ サンプル時間 110250.0 秒
87
99
  現配列長 882000
88
- サンプル配列長: 176400
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ファイルはモノラルですが、フーリエ変換の理解のため、まずは参照ページの通りに実行してみました。