質問編集履歴

4

2019/01/22 08:14

投稿

xomit1138
xomit1138

スコア18

test CHANGED
File without changes
test CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
  ```Python
8
8
 
9
- # -*- coding: utf-8 -*-
9
+ # - coding: utf-8 -
10
10
 
11
11
  import wave
12
12
 
@@ -56,7 +56,7 @@
56
56
 
57
57
  G = np.fft.fft(g[n0:n0+N]) # 高速フーリエ変換
58
58
 
59
- amp = [np.sqrt(c.real ** 2 + c.imag ** 2) for c in G] # 振幅スペクトル
59
+ amp = [np.sqrt(c.real * 2 + c.imag * 2) for c in G] # 振幅スペクトル
60
60
 
61
61
  flist = np.fft.fftfreq(N, d=1.0/fs) # 周波数リスト
62
62
 
@@ -78,9 +78,9 @@
78
78
 
79
79
  writer.writeheader()
80
80
 
81
- writer.writerow({**'Hz': 10, 'dB': 50**})
81
+ writer.writerow({'Hz': 10, 'dB': 50})
82
82
 
83
- writer.writerow({'**Hz': 20, 'dB': 1700**})
83
+ writer.writerow({'Hz': 20, 'dB': 1700})
84
84
 
85
85
 
86
86
 
@@ -126,4 +126,4 @@
126
126
 
127
127
 
128
128
 
129
- 参考元URL:http://denshi.blog.jp/signal_processing/python/fft
129
+ 参考元URL:[Pythonで音の高速フーリエ変換(FFT)](http://denshi.blog.jp/signal_processing/python/fft)

3

コメントの指摘に足して訂正を行いました

2019/01/22 08:13

投稿

xomit1138
xomit1138

スコア18

test CHANGED
File without changes
test CHANGED
@@ -110,7 +110,9 @@
110
110
 
111
111
 
112
112
 
113
- 現在のプログラムがこちらですが、太文字部分の数値、上のflist,ampをそれぞれ代入したいです。
113
+ 現在のプログラムがこちらですが、# CSVファイル作成書き込み 箇所ある
114
+
115
+ writer.writerow({**'Hz': 10, 'dB': 50**})の数値を、上のflist,ampをそれぞれに代入したいです。
114
116
 
115
117
  どうすれば可能でしょうか?
116
118
 

2

コメントの指摘に足して訂正を行いました

2019/01/22 06:52

投稿

xomit1138
xomit1138

スコア18

test CHANGED
File without changes
test CHANGED
@@ -3,6 +3,8 @@
3
3
  フーリエ変換で周波数スペクトルをグラフ表示させるところはできました。
4
4
 
5
5
 
6
+
7
+ ```Python
6
8
 
7
9
  # -*- coding: utf-8 -*-
8
10
 
@@ -104,6 +106,8 @@
104
106
 
105
107
  main()
106
108
 
109
+ ```
110
+
107
111
 
108
112
 
109
113
  現在のプログラムがこちらですが、太文字部分の数値を、上のflist,ampをそれぞれに代入したいです。
@@ -117,3 +121,7 @@
117
121
  プログラミングに関して全くの素人のため優しく教えていただけたら幸いです。
118
122
 
119
123
  よろしくお願いします。
124
+
125
+
126
+
127
+ 参考元URL:http://denshi.blog.jp/signal_processing/python/fft

1

現状作成中のプログラムを追記しました。

2019/01/22 04:26

投稿

xomit1138
xomit1138

スコア18

test CHANGED
File without changes
test CHANGED
@@ -1,23 +1,119 @@
1
1
  pythonを使った周波数解析について。
2
2
 
3
- フーリエ変換で周波数スペクトルをグラフ表示させるところは以下のサイトを参考にできました。
3
+ フーリエ変換で周波数スペクトルをグラフ表示させるところはできました。
4
4
 
5
5
 
6
6
 
7
+ # -*- coding: utf-8 -*-
8
+
9
+ import wave
10
+
11
+ import numpy as np
12
+
7
- http://denshi.blog.jp/signal_processing/python/fft
13
+ import matplotlib.pyplot as plt
14
+
15
+ import csv
8
16
 
9
17
 
10
18
 
11
- これに加えて、
19
+ # 離散フーリエ変換
12
20
 
13
- 周波数解析の結果より、例えば15000Hzで50dB以上が検知されたら〇、40~49dBで△、39dB以下の場合は×といった表示をする(グラフ上でなくても大丈夫です)
21
+ def dft (n0, N, g):
14
22
 
23
+ G = [0.0] * N
24
+
25
+ for k in range(N):
26
+
27
+ for n in range(N):
28
+
29
+ real = np.cos(2 * np.pi * k * n / N)
30
+
31
+ imag = - np.sin(2 * np.pi * k * n / N)
32
+
33
+ G[k] += g[n0 + n] * complex(real, imag)
34
+
35
+ return G
36
+
37
+
38
+
39
+ def main():
40
+
41
+ wf = wave.open("test.wav" , "r" )
42
+
43
+ fs = wf.getframerate() # サンプリング周波数
44
+
45
+ g = wf.readframes(wf.getnframes())
46
+
47
+ g = np.frombuffer(g, dtype= "int16")/32768.0 # -1~1に正規化
48
+
49
+ wf.close()
50
+
51
+ n0 = 0 # サンプリング開始位置
52
+
53
+ N = 256 # サンプル数
54
+
55
+ G = np.fft.fft(g[n0:n0+N]) # 高速フーリエ変換
56
+
57
+ amp = [np.sqrt(c.real ** 2 + c.imag ** 2) for c in G] # 振幅スペクトル
58
+
59
+ flist = np.fft.fftfreq(N, d=1.0/fs) # 周波数リスト
60
+
61
+
62
+
63
+ print("周波数リスト" , flist)
64
+
65
+ print("振幅スペクトル" , amp)
66
+
67
+
68
+
69
+ # CSVファイルを作成書き込み
70
+
71
+ with open('test2.csv', 'w') as csv_file:
72
+
73
+ fieldnames = ['Hz', 'dB']
74
+
75
+ writer = csv.DictWriter(csv_file, fieldnames=fieldnames)
76
+
77
+ writer.writeheader()
78
+
79
+ writer.writerow({**'Hz': 10, 'dB': 50**})
80
+
81
+ writer.writerow({'**Hz': 20, 'dB': 1700**})
82
+
83
+
84
+
85
+ # CSVファイルを読み込む
86
+
87
+ with open('test2.csv', 'r') as csv_file:
88
+
89
+ reader = csv.DictReader(csv_file)
90
+
91
+ for row in reader:
92
+
93
+ print(row['Hz'], row['dB'])
94
+
95
+
96
+
97
+
98
+
99
+
100
+
101
+
102
+
15
- このようなプログラムを作成したいと考えています。どうすればできますか?
103
+ if __name__ == '__main__':
104
+
105
+ main()
106
+
107
+
108
+
109
+ 現在のプログラムがこちらですが、太文字部分の数値を、上のflist,ampをそれぞれに代入したいです。
110
+
111
+ どうすれば可能でしょうか?
112
+
113
+ 最終的には得られたflist,ampの2列でcsvとして保存したいです。
16
114
 
17
115
 
18
116
 
19
117
  プログラミングに関して全くの素人のため優しく教えていただけたら幸いです。
20
118
 
21
- サンプルプログラムなどを教えていただければ尚幸いです。
22
-
23
119
  よろしくお願いします。