pyaudioを用いて周波数スペクトルの表示
問題
pyaudioを用いて周波数スペクトルを表示させようとしたときに鳴らした音とずれた周波数が表示される
ソースコード
# 録音プロット部
import pyaudio
import numpy as np
import matplotlib.pyplot as plt
from scipy import signal
import wave
# % matplotlib inline
input_device = 0
output_device = 1
def recording(CHANNELS, RATE, CHUNK, RECORD_SECONDS, FORMAT, p):
print("録音中")
stream = p.open(format=FORMAT,
channels=CHANNELS,
rate=RATE,
input=True,
input_device_index=input_device,
output_device_index=output_device,
frames_per_buffer=CHUNK)
all = []
for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
data = stream.read(CHUNK)
all.append(data)
stream.close()
p.terminate()
data = b''.join(all)
print("終了")
return data
if __name__ == '__main__':
CHANNELS = 1
RATE = 44100
CHUNK = 2 ** 11
RECORD_SECONDS = 3
FORMAT = pyaudio.paInt16
p = pyaudio.PyAudio()
data = recording(CHANNELS, RATE, CHUNK, RECORD_SECONDS, FORMAT, p)
x = np.frombuffer(data, dtype="int16") / 10000
xs = (np.fft.fft(np.frombuffer(data, dtype="int16")))[:int(len(x) / 2)]
# 振幅の絶対値をとる
xr = np.abs(xs)
# peak検出
maxid = signal.argrelmax(xr, order=100) # large peaks
minid = signal.argrelmin(xr, order=100) # small peaks
# グラフプロット
plt.figure(figsize=(13, 3))
plt.axis
plt.plot(maxid[0], xr[maxid[0]], 'rx', label='peak')
plt.plot(minid[0], xr[minid[0]], 'bx', label='min peak')
plt.plot(xr, label="beforeBPF")
plt.xlim(0, 7000) # Hz
plt.legend()
plt.show()
現状
普段音響の現場で使用しているアプリで1kHzの音を鳴らしたときに3kHzにピークが立ちました。
下の図がその時の出力結果です。