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

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

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

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Python

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

Q&A

1回答

3328閲覧

pythonを用いた周波数スペクトル引き算について

xomit1138

総合スコア18

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Python

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

0グッド

0クリップ

投稿2019/03/08 07:21

編集2022/01/12 10:55

pythonを用いた周波数スペクトルに関しての質問です。
以下のプログラムが現在作成しているプログラムです。
wavファイルを入力し、スペクトルを得たのち、csvに書き込み、設定した閾値以上の差がある列を抽出
という流れになっています。

こちらを今のような一つのwavファイルでなく2つのwavファイルに対して行いたいと考えています。
(1) 2つのwavファイルのスペクトル(AとBとします)をそれぞれ得たのち、それらのスペクトルの引き算を行った結果(A-B)を得る
(2) csvに書き込み、設定した閾値以上の差がある列を抽出
といった流れを目指しています。(1)の部分において同時にスペクトル計算を行い、最終的に引き算を行う部分がわからず詰まっています。

素人で申し訳ないですが、アドバイスなどをいただければ幸いです。

Python

1import wave 2import pandas as pd 3import numpy as np 4import csv 5 6 7def main(): 8 wf = wave.open("test.wav", "r") 9 fs = wf.getframerate() # サンプリング周波数 10 g = wf.readframes(wf.getnframes()) 11 g = np.frombuffer(g, dtype="int16") / 32768.0 # -1~1に正規化 12 wf.close() 13 n0 = 0 # サンプリング開始位置 14 N = 4410 # サンプル数 15 G = np.fft.fft(g[n0:n0 + N]) # 高速フーリエ変換 16 amp = [np.sqrt(c.real ** 2 + c.imag ** 2) for c in G] # 振幅スペクトル 17 flist = np.fft.fftfreq(N, d=1.0 / fs) # 周波数リスト 18 19 # DataFrame生成 20 df = pd.DataFrame({'Hz': flist, 'dB':amp}) 21 # CSVファイルに書き出しておく 22 df.to_csv('test.csv') 23 24 # DataFrameを表示 25 print(df) 26 27 # dB列の差が閾値以上かどうかを示す 'flag'列を追加 28 threshold = 40 29 df['flag'] = df['dB'].diff().abs() > threshold 30 #'flag'列が True の行のみ表示 31 print( df[df['flag']]) 32 33 34if __name__ == '__main__': 35 main()

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

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

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

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

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

tachikoma

2019/03/08 07:29

Python 2.7じゃなさそうなので、よければ質問のタグを修正しておいてください.PythonかPython3.x
xomit1138

2019/03/08 07:33

修正を行いました。 補足ですが、現状でPython2.7.14を使用中です。
hayataka2049

2019/03/08 07:34

正式にやるなら位相を考慮するべきですが、無視するのでしょうか。
tachikoma

2019/03/08 07:34

あれ、そうでしたか。質問の中ではprintの構文が3系だったので。
xomit1138

2019/03/08 07:41

位相に関しては、今回は無視する方向でいこうと考えています。
guest

回答1

0

こんな感じになるのかな。一つのファイルについてできていることを関数化して、2つのファイルに対して繰り返し適用すればいいだけだと思います。

Python

1import wave 2import pandas as pd 3import numpy as np 4import csv 5 6def calc_ps(src_name, dst_name): 7 8 wf = wave.open("test.wav", "r") 9 fs = wf.getframerate() 10 g = wf.readframes(wf.getnframes()) 11 g = np.frombuffer(g, dtype="int16") / 32768.0 12 wf.close() 13 n0 = 0 14 N = 4410 15 G = np.fft.fft(g[n0:n0 + N]) 16 amp = [np.sqrt(c.real ** 2 + c.imag ** 2) for c in G] 17 flist = np.fft.fftfreq(N, d=1.0 / fs) 18 19 # DataFrame生成 20 df = pd.DataFrame({'Hz': flist, 'dB':amp}) 21 return df 22 23 24def main(): 25 src1 = "test1.wav" 26 dst1 = "test1.csv" 27 src2 = "test2.wav" 28 dst2 = "test2.csv" 29 30 df1 = calc_ps(src1) 31 df2 = calc_ps(src1) 32 33 # (必要に応じて)CSVファイルに書き出しておく 34 df1.to_csv(dst1) 35 df2.to_csv(dst2) 36 37 df = df1['Hz'].copy() 38 39 # dB列の差が閾値以上かどうかを示す 'flag'列を追加 40 threshold = 40 41 df['flag'] = (df1['dB'] - df2['dB']).abs() > threshold 42 #'flag'列が True の行のみ表示 43 print( df[df['flag']]) 44 45 46if __name__ == '__main__': 47 main()

投稿2019/03/08 07:45

tachikoma

総合スコア3601

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

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

tachikoma

2019/03/08 07:46

あえて直してませんが、、dBが欲しいならどこかで対数を取らないと行けないですよ。
xomit1138

2019/03/08 07:58

ありがとうございます。勉強不足でぱっと思いつかないので、試行錯誤的にやってみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問