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

質問編集履歴

4

2019/01/22 08:14

投稿

xomit1138
xomit1138

スコア18

title CHANGED
File without changes
body CHANGED
@@ -2,7 +2,7 @@
2
2
  フーリエ変換で周波数スペクトルをグラフ表示させるところはできました。
3
3
 
4
4
  ```Python
5
- # -*- coding: utf-8 -*-
5
+ # - coding: utf-8 -
6
6
  import wave
7
7
  import numpy as np
8
8
  import matplotlib.pyplot as plt
@@ -27,7 +27,7 @@
27
27
  n0 = 0 # サンプリング開始位置
28
28
  N = 256 # サンプル数
29
29
  G = np.fft.fft(g[n0:n0+N]) # 高速フーリエ変換
30
- amp = [np.sqrt(c.real ** 2 + c.imag ** 2) for c in G] # 振幅スペクトル
30
+ amp = [np.sqrt(c.real * 2 + c.imag * 2) for c in G] # 振幅スペクトル
31
31
  flist = np.fft.fftfreq(N, d=1.0/fs) # 周波数リスト
32
32
 
33
33
  print("周波数リスト" , flist)
@@ -38,8 +38,8 @@
38
38
  fieldnames = ['Hz', 'dB']
39
39
  writer = csv.DictWriter(csv_file, fieldnames=fieldnames)
40
40
  writer.writeheader()
41
- writer.writerow({**'Hz': 10, 'dB': 50**})
41
+ writer.writerow({'Hz': 10, 'dB': 50})
42
- writer.writerow({'**Hz': 20, 'dB': 1700**})
42
+ writer.writerow({'Hz': 20, 'dB': 1700})
43
43
 
44
44
  # CSVファイルを読み込む
45
45
  with open('test2.csv', 'r') as csv_file:
@@ -62,4 +62,4 @@
62
62
  プログラミングに関して全くの素人のため優しく教えていただけたら幸いです。
63
63
  よろしくお願いします。
64
64
 
65
- 参考元URL:http://denshi.blog.jp/signal_processing/python/fft
65
+ 参考元URL:[Pythonで音の高速フーリエ変換(FFT)](http://denshi.blog.jp/signal_processing/python/fft)

3

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

2019/01/22 08:13

投稿

xomit1138
xomit1138

スコア18

title CHANGED
File without changes
body CHANGED
@@ -54,7 +54,8 @@
54
54
  main()
55
55
  ```
56
56
 
57
- 現在のプログラムがこちらですが、太文字部分の数値、上のflist,ampをそれぞれ代入したいです。
57
+ 現在のプログラムがこちらですが、# CSVファイル作成書き込み 箇所ある
58
+ writer.writerow({**'Hz': 10, 'dB': 50**})の数値を、上のflist,ampをそれぞれに代入したいです。
58
59
  どうすれば可能でしょうか?
59
60
  最終的には得られたflist,ampの2列でcsvとして保存したいです。
60
61
 

2

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

2019/01/22 06:52

投稿

xomit1138
xomit1138

スコア18

title CHANGED
File without changes
body CHANGED
@@ -1,6 +1,7 @@
1
1
  pythonを使った周波数解析について。
2
2
  フーリエ変換で周波数スペクトルをグラフ表示させるところはできました。
3
3
 
4
+ ```Python
4
5
  # -*- coding: utf-8 -*-
5
6
  import wave
6
7
  import numpy as np
@@ -51,10 +52,13 @@
51
52
 
52
53
  if __name__ == '__main__':
53
54
  main()
55
+ ```
54
56
 
55
57
  現在のプログラムがこちらですが、太文字部分の数値を、上のflist,ampをそれぞれに代入したいです。
56
58
  どうすれば可能でしょうか?
57
59
  最終的には得られたflist,ampの2列でcsvとして保存したいです。
58
60
 
59
61
  プログラミングに関して全くの素人のため優しく教えていただけたら幸いです。
60
- よろしくお願いします。
62
+ よろしくお願いします。
63
+
64
+ 参考元URL:http://denshi.blog.jp/signal_processing/python/fft

1

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

2019/01/22 04:26

投稿

xomit1138
xomit1138

スコア18

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