問題

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にピークが立ちました。
下の図がその時の出力結果です。
1kHzを鳴らしたときに表示されたグラフ