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

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

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

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

Q&A

0回答

724閲覧

pyaudio 周波数スペクトラムの表示

sibazyun

総合スコア18

Python

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

0グッド

0クリップ

投稿2019/09/07 13:05

編集2019/09/08 01:59

前提・実現したいこと

pythonで録音した音源の周波数スペクトラムを表示する

発生している問題・エラーメッセージ

実際に鳴らした音とプロットされた周波数がずれている

該当のソースコード

python

1# 録音プロット部 2import pyaudio 3import numpy as np 4import matplotlib.pyplot as plt 5from scipy import signal 6#% matplotlib inline 7 8input_device = 0 9output_device = 1 10 11 12def recording(CHANNELS, RATE, CHUNK, RECORD_SECONDS, FORMAT, p): 13 print("録音中") 14 stream = p.open(format=FORMAT, 15 channels=CHANNELS, 16 rate=RATE, 17 input=True, 18 input_device_index=input_device, 19 output_device_index=output_device, 20 frames_per_buffer=CHUNK) 21 22 all = [] 23 for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)): 24 data = stream.read(CHUNK) 25 all.append(data) 26 stream.close() 27 p.terminate() 28 data = b''.join(all) 29 print("終了") 30 return data 31 32 33if __name__ == '__main__': 34 CHANNELS = 1 35 RATE = 44100 36 CHUNK = 2 ** 11 37 RECORD_SECONDS = 3 38 FORMAT = pyaudio.paInt16 39 p = pyaudio.PyAudio() 40 data = recording(CHANNELS, RATE, CHUNK, RECORD_SECONDS, FORMAT, p) 41 42 x = np.frombuffer(data, dtype="int16") / 10000 43 44 xs = (np.fft.fft(np.frombuffer(data, dtype="int16")))[:int(len(x) / 2)] 45 46 # 振幅の絶対値をとる 47 xr = np.abs(xs) 48 49 # peak検出 50 maxid = signal.argrelmax(xr, order=100) # large peaks 51 minid = signal.argrelmin(xr, order=100) # small peaks 52 53 #グラフプロット 54 plt.figure(figsize=(13, 3)) 55 plt.axis 56 57 plt.plot(maxid[0], xr[maxid[0]], 'rx', label='peak') 58 plt.plot(minid[0], xr[minid[0]], 'bx', label='min peak') 59 plt.plot(xr,label = "beforeBPF") 60 plt.xlim(0, 7000) # Hz 61 plt.legend() 62 plt.show()

試したこと

1kHzの音を鳴らしたときにグラフで3kHzあたりにピークが立ってしまいました。下のグラフがその時の出力結果です
イメージ説明

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

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

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

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

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

ikadzuchi

2019/09/07 15:56

鳴らした音が正しく1kHzであることは確認しましたか? 例えば圧電スピーカーで1kHzの矩形波を鳴らすと(場合により)主に3kHzの音が鳴ります。
sibazyun

2019/09/07 16:00

普段音響の現場で使用してるスマホのアプリでsin波の1kHzを鳴らしてるのでおそらく合ってるかと思います…!
ikadzuchi

2019/09/07 16:03

そうでしたか。では問題無さそうですね。
ozwk

2019/09/09 14:21

これ横軸の単位Hzですか? ただ単に配列のインデックスな気が
sibazyun

2019/09/09 15:44

すみませんネットのプログラミングを参考に作っているので自分でもあまり良くわかっていないです、、、
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問