Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用Pyaudio录制后的FFT规格化_Python_Fft_Pyaudio - Fatal编程技术网

Python 使用Pyaudio录制后的FFT规格化

Python 使用Pyaudio录制后的FFT规格化,python,fft,pyaudio,Python,Fft,Pyaudio,我有一个USB麦克风,它有一个24位ADC,但是Pyaudio不允许24位编码,所以我使用了16位。我希望这不是一个问题。话虽如此,我希望确保正确应用汉宁窗口并正确规范FFT大小 import numpy as np import pyaudio import matplotlib.pyplot as plt from scipy.fftpack import fft from scipy.io import wavfile # get the api import wave CHUNK =

我有一个USB麦克风,它有一个24位ADC,但是Pyaudio不允许24位编码,所以我使用了16位。我希望这不是一个问题。话虽如此,我希望确保正确应用汉宁窗口并正确规范FFT大小

import numpy as np
import pyaudio
import matplotlib.pyplot as plt
from scipy.fftpack import fft
from scipy.io import wavfile # get the api
import wave

CHUNK = 2048
FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 20480
RECORD_SECONDS = 34

p = pyaudio.PyAudio()

stream = p.open(format=FORMAT,
                channels=CHANNELS,
                rate=RATE,
                input=True,
                frames_per_buffer=CHUNK)

n = CHUNK
k=np.arange(n)
T = n/RATE     #reciprocal of freq resolution
frq = k/T      #k* freq resolution
frq = frq[range(int(n/2))]    # one side frequency range, for plotting
freq_resolution=RATE/n        #frequency resolution 
window=np.hanning(n)          #Hanning window 
num_frames=int(RATE*RECORD_SECONDS/CHUNK)

for i in range(0, num_frames):
    data = stream.read(CHUNK)
    decoded = np.frombuffer(data, dtype=np.int16)
    windowed=window*decoded      #apply Hanning window
    fft_decode=fft(windowed)/(len(decoded)/2)
    mags=np.absolute(fft_decode) 

    plt.ylim(top=2)
    plt.xlabel('Freq (Hz)')
    plt.ylabel('|Y(freq)|')
    plt.plot(frq), mags[range(int(n/2))],'b') 
    plt.pause(.001)
    plt.gcf().clear()
plt.close()
我用(样本数/2)标准化了幅值,因为我只对单边图感兴趣,我希望幅值与真实信号相对应。这意味着实际信号为5sin(2pi*3000*t),我希望在3000hz单边幅度图上的幅度为5。如果我只除以样本数,它会给我这个值的一半。这是正确的吗

然而,我也打印出了循环每次迭代的数据最大值(解码)和fft幅度最大值,虽然它们大部分是相关的,但有时并不相关。我可能会得到一个较高的“解码”最大值(比如32000),但fft幅度的最大值并不在这附近。这怎么可能


谢谢

您在DSP StackExchange上的运气可能会更好。您在DSP StackExchange上的运气可能会更好。