質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

919閲覧

python周波数解析について

xomit1138

総合スコア18

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

1グッド

1クリップ

投稿2019/01/21 04:58

編集2019/01/22 08:14

pythonを使った周波数解析について。
フーリエ変換で周波数スペクトルをグラフ表示させるところはできました。

Python

1# - coding: utf-8 - 2import wave 3import numpy as np 4import matplotlib.pyplot as plt 5import csv 6 7# 離散フーリエ変換 8def dft (n0, N, g): 9 G = [0.0] * N 10 for k in range(N): 11 for n in range(N): 12 real = np.cos(2 * np.pi * k * n / N) 13 imag = - np.sin(2 * np.pi * k * n / N) 14 G[k] += g[n0 + n] * complex(real, imag) 15 return G 16 17def main(): 18 wf = wave.open("test.wav" , "r" ) 19 fs = wf.getframerate() # サンプリング周波数 20 g = wf.readframes(wf.getnframes()) 21 g = np.frombuffer(g, dtype= "int16")/32768.0 # -1~1に正規化 22 wf.close() 23 n0 = 0 # サンプリング開始位置 24 N = 256 # サンプル数 25 G = np.fft.fft(g[n0:n0+N]) # 高速フーリエ変換 26 amp = [np.sqrt(c.real * 2 + c.imag * 2) for c in G] # 振幅スペクトル 27 flist = np.fft.fftfreq(N, d=1.0/fs) # 周波数リスト 28 29 print("周波数リスト" , flist) 30 print("振幅スペクトル" , amp) 31 32# CSVファイルを作成書き込み 33with open('test2.csv', 'w') as csv_file: 34 fieldnames = ['Hz', 'dB'] 35 writer = csv.DictWriter(csv_file, fieldnames=fieldnames) 36 writer.writeheader() 37 writer.writerow({'Hz': 10, 'dB': 50}) 38 writer.writerow({'Hz': 20, 'dB': 1700}) 39 40# CSVファイルを読み込む 41with open('test2.csv', 'r') as csv_file: 42 reader = csv.DictReader(csv_file) 43 for row in reader: 44 print(row['Hz'], row['dB']) 45 46 47 48 49if __name__ == '__main__': 50 main()

現在のプログラムがこちらですが、# CSVファイルを作成書き込み 箇所にある
writer.writerow({'Hz': 10, 'dB': 50})の数値を、上のflist,ampをそれぞれに代入したいです。
どうすれば可能でしょうか?
最終的には得られたflist,ampの2列でcsvとして保存したいです。

プログラミングに関して全くの素人のため優しく教えていただけたら幸いです。
よろしくお願いします。

参考元URL:Pythonで音の高速フーリエ変換(FFT)

firedfly👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

firedfly

2019/01/22 04:51

だいぶよくなりました! コードブロックの中身はコードそのもので、太字にするなどの文字修飾を自由にできません。 「太文字部分の数値」がなにかわからないのでご追記くださいまし。
firedfly

2019/01/22 07:57

細かいですが、コード内から ** を取り除いてください。回答者が実行したときにエラーになります。 またURLはMarkDownのURL記法を使うと親切です。 参考元URL:[Pythonで音の高速フーリエ変換(FFT)](http://denshi.blog.jp/signal_processing/python/fft)
guest

回答1

0

ベストアンサー

質問文の編集、ありがとうございました。回答します。

書き込みは下の2行でできます。

Python

1for f, a in zip(flist, amp): 2 writer.writerow({'Hz': f, 'dB': a})

flist, amp はそれぞれ256行なので
zip関数でひとつずつ順番に取り出してwriterow関数で書き込みます。

ただ、CSVの書き込みと読み込みもmain関数の一部ですので、下のようにインデントしてください。
そうしないとmain関数内で定義されたflistとampを参照できずにエラーとなります。

Python

1def main(): 2 wf = wave.open("test.wav", "r") 3 fs = wf.getframerate() # サンプリング周波数 4 g = wf.readframes(wf.getnframes()) 5 g = np.frombuffer(g, dtype="int16") / 32768.0 # -1~1に正規化 6 wf.close() 7 n0 = 0 # サンプリング開始位置 8 N = 256 # サンプル数 9 G = np.fft.fft(g[n0:n0 + N]) # 高速フーリエ変換 10 amp = [np.sqrt(c.real ** 2 + c.imag ** 2) for c in G] # 振幅スペクトル 11 flist = np.fft.fftfreq(N, d=1.0 / fs) # 周波数リスト 12 13 print("周波数リスト", flist) 14 print("振幅スペクトル", amp) 15 16 # CSVファイルを作成書き込み 17 with open('test2.csv', 'w') as csv_file: 18 fieldnames = ['Hz', 'dB'] 19 writer = csv.DictWriter(csv_file, fieldnames=fieldnames) 20 writer.writeheader() 21 for f, a in zip(flist, amp): 22 writer.writerow({'Hz': f, 'dB': a}) 23

投稿2019/01/22 08:09

編集2019/01/22 08:33
firedfly

総合スコア1131

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

xomit1138

2019/01/22 08:29

回答ありがとうございます。 reader文にならって、for文を writer.writerow({'Hz': 10, 'dB': 50})を削除し、入れてみました。 インデントに関するエラーは出なくなったと思うのですが、違うエラーが発生しました。間違っている箇所を教えていただければ幸いです。エラー分は以下の通りです。 Traceback (most recent call last): File "C:\Users\15t403\pyworks\test2.py", line 36, in <module> for f, a in zip(flist, amp): NameError: name 'flist' is not defined
firedfly

2019/01/22 08:47 編集

'flist' is not defined は「flist という変数は未定義だ」の意味です。 回答本文に追記しました。 なお、締め切りがいつかわかりませんが、急がば回れです。 Pythonはとっつきやすいプログラミング言語ですから 入門書(入門サイト)で自習してみてください。
xomit1138

2019/01/22 09:05

ご親切にありがとうございました。まだまだやりたいことがあるので少しずつ勉強していこうと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問