

# 問題

pyaudioを用いて周波数スペクトルを表示させようとしたときに鳴らした音とずれた周波数が表示される

# ソースコード

[code]

    # 録音プロット部
    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()
    
[/code]

# 現状

普段音響の現場で使用しているアプリで1kHzの音を鳴らしたときに3kHzにピークが立ちました。  
下の図がその時の出力結果です。  
[![1kHzを鳴らしたときに表示されたグラフ](https://i.stack.imgur.com/pKGOd.png)](https://i.stack.imgur.com/pKGOd.png)


CC BY-SA 4.0
2019-09-08T02:28:35.560
57924
2022-12-13T09:09:46.097
2020-06-17T08:14:45.997
-1
35774
question
python
pyaudioを用いて周波数スペクトルの表示


FFTを行った結果が何を表しているかわかっています？  
int(fs/chunk*sec) = int(44100/2048*3) = 64  
chunk * 64 = 131072 データをFFTにかければ、周波数分解能は 44100 / 131072 = 0.336 Hz でしょう。  
3000番目のデータは 3000 * 0.336 で約1kHzで間違っていませんが？


CC BY-SA 4.0
2020-01-14T10:19:08.463
62237
2020-01-14T10:19:08.463
37452
57924
answer